jedis源码分析(jedis api 中文)
本文目录一览:
- 1、Jedis干什么用的
- 2、jedis 和 strpin-data-redis 哪一个好
- 3、jedis源码怎么生成jar包
- 4、调用redis时出现java.lang.IllegalArgumentException: hostname can't be null这个错
Jedis干什么用的
redis是key-value存储系统。
key-value分布式存储系统查询速度快、存放数据量大、支持高并发,非常适合通过主键进行查询,但不能进行复杂的条件查询。
如果辅以Real-Time Search Engine(实时搜索引擎)进行复杂条件检索、全文检索,就可以替代并发性能较低的MySQL等关系型数据库,达到高并发、高性能,节省几十倍服务器数 量的目的。
以MemcacheDB、Tokyo Tyrant为代表的key-value分布式存储,在上万并发连接下,轻松地完成高速查询。而MySQL,在几百个并发连接下,就基本上崩溃了。
在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
扩展资料:
Jedis主存保护是存储保护的重要环节。主存保护一般有存储区域保护和访问方式保护。存储区域保护可采用界限寄存器方式,由系统软件经特权指令给定上、下界寄存器内容,从而划定每个用户程序的区域,禁止越界访问。
Jedis当两键符合时才允许执行存取操作,从而保护别的程序区域不被侵犯,环状保护是把系统程序和用户程序按重要性分层,称为环,对每个环都规定访问它的级别,违反规定的存取操作是非法的,以此实现对正在执行的程序的保护。
参考资料来源:百度百科-Key-Value
jedis 和 strpin-data-redis 哪一个好
之前一直没仔细看过ShardedJedis的代码,最近遇到了shard后集群扩容后的数据迁移问题。
今天在看ShardedJedis源码的时候,发现ShardedJedis并没有使用节点的Ip和port做hash,而是用的instance的顺序或者name,太赞了。
private void initialize(ListS shards) {
nodes = new TreeMapLong, S();
for (int i = 0; i != shards.size(); ++i) {
final S shardInfo = shards.get(i);
if (shardInfo.getName() == null)
for (int n = 0; n 160 * shardInfo.getWeight(); n++) {
nodes.put(this.algo.hash("SHARD-" + i + "-NODE-" + n),
shardInfo);
}
else
for (int n = 0; n 160 * shardInfo.getWeight(); n++) {
nodes.put(
this.algo.hash(shardInfo.getName() + "*"
+ shardInfo.getWeight() + n), shardInfo);
}
resources.put(shardInfo, shardInfo.createResource());
}
}
配置的时候也非常简单:
bean id="jedisPoolConfig" class="5f6c-7788-1795-e93e redis.clients.jedis.JedisPoolConfig"
property name="maxTotal" value="1000"/
property name="maxIdle" value="10"/
property name="minIdle" value="1"/
property name="maxWaitMillis" value="30000"/
property name="testOnBorrow" value="true"/
property name="testOnReturn" value="true"/
property name="testWhileIdle" value="true"/
/bean
bean id="shardedJedisPool" class="7788-1795-e93e-ef25 redis.clients.jedis.ShardedJedisPool" destroy-method="destroy"
constructor-arg ref="jedisPoolConfig"/
constructor-arg
list
bean class="1795-e93e-ef25-639d redis.clients.jedis.JedisShardInfo"
constructor-arg value="127.0.0.1"/
constructor-arg type="int" value="7000"/
constructor-arg value="instance:01"/
/bean
bean class="e93e-ef25-639d-3297 redis.clients.jedis.JedisShardInfo"
constructor-arg value="127.0.0.1"/
constructor-arg type="int" value="7001"/
constructor-arg value="instance:02"/
/bean
bean class="ef25-639d-3297-43e8 redis.clients.jedis.JedisShardInfo"
constructor-arg value="127.0.0.1"/
constructor-arg type="int" value="7003"/
constructor-arg value="instance:03"/
/bean
/list
/constructor-arg
/bean
一开始你可以设置足够多的instance,数据扩容的时候,只需要将几个instance的数据copy到别的机器上。
然后修改配置文件的ip和端口即可。很方便吧?
另外,Jedis还提供了对jedis sentinel pool的封装,所以发生主从切换的时候,web server都不需要重新配置和deploy。高可用性的极佳体现啊。
@Autowired private JedisSentinelPool pool;
public void mymethod() {
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.hset(....
} catch (JedisException je) {
throw je;
} finally {
if (jedis != null) pool.returnResource(jedis);
}
}
spring bean的配置:
bean id="redisSentinel" class="639d-3297-43e8-7952 redis.clients.jedis.JedisSentinelPool"
constructor-arg index="0" value="mymaster" /
constructor-arg index="1"
set
valuehostofsentinel:26379/value
/set
/constructor-arg
constructor-arg index="2" ref="jedisPoolConfig" /
/bean
jedis源码怎么生成jar包
java使用redis缓存可以使用jedis框架,jedis操作简单,没有什么复杂的东西需要学习,网上资料很多,随便看看就会了.
将spring与redis缓存集成,其实也是使用jedis框架,只不过spring对它进行了一层封装,并将这层封装库命名为spring-data-redis.
下面将要使用spring-data-redis与jedis的jar包,并通过spring的aop功能,将redis缓存无缝无侵入的整合进来.
调用redis时出现java.lang.IllegalArgumentException: hostname can't be null这个错
当我们执行如下JedisPool类实例的getResource()时抛出can't get a resource异常。
异常代码如下:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:22)
分析:
redis.clients.util.Pool.getResource会从JedisPool实例池中返回一个可用的redis连接。分析源码可知JedisPool extends redis.clients.util.PoolJedis .而PoolT是通过
commons-pool开源工具包中的org.apache.commons.pool.impl.GenericObjectPool来实现对Jedis实例的管理的。所以我们分析一下GenericObjectPool或许能找到答案。
首先看一下common-pool的api:。
其中三个重要个几个属性是:
MaxActive: 可用连接实例的最大数目,为负值时没有限制。
MaxIdle: 空闲连接实例的最大数目,为负值时没有限制。Idle的实例在使用前,通常会通过org.apache.commons.pool.BasePoolableObjectFactoryT的activateObject()方法使其变得可用。
MaxWait: 等待可用连接的最大数目,单位毫秒(million seconds)。
(注:pool.getResource()方法实际调用的GenericObjectPool类borrowObject()方法,该方法会根据MaxWait变量值在没有可用连接(idle/active)时阻塞等待知道超时,具体含义参看api。)
也就是说当连接池中没有active/idle的连接时,会等待maxWait时间,如果等待超时还没有可用连接,则抛出Could not get a resource from the pool异常。所以为避免这样的错误,
我们应该根据程序实际情况合理设置这三个参数的值,同时在我们获取一个连接的程序方法中也应该合理的处理这个异常,当没有连接可用时,等待一段时间再获取也许是个比较好的选择。