Redis实战之Redis + Jedis

Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET

等。基于这些限制,有必要考虑Redis

相关链接:

Redis实战

Redis实战之Redis + Jedis

Redis实战之征服 Redis + Jedis + Spring (一)

Redis实战之征服 Redis + Jedis + Spring (二)

Redis实战之征服 Redis + Jedis + Spring (三)

言归正传,目前Redis大概有3中基于Java语言的Client:

  • Jredis
  • Jedis
  • Redis4J

这里只说Jedis,因为它是官方提供的唯一Redis Client ForJavaProvider!

一、简单使用Jedis

需要Jedis就从Maven获取吧!
Maven Pom.xml

Xml代码
  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>2.1.0</version>
  5. <type>jar</type>
  6. <scope>compile</scope>
  7. </dependency>
  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>2.1.0</version>
  5. <type>jar</type>
  6. <scope>compile</scope>
  7. </dependency>

如果只是简单使用Jedis,以下这么几行代码足够:

Java代码
  1. Jedisjedis=newJedis("10.11.20.140");
  2. Stringkeys="name";
  3. //删数据
  4. jedis.del(keys);
  5. //存数据
  6. jedis.set(keys,"snowolf");
  7. //取数据
  8. Stringvalue=jedis.get(keys);
  9. System.out.println(value);
[java] view plain copy
  1. Jedisjedis=newJedis("10.11.20.140");
  2. Stringkeys="name";
  3. //删数据
  4. jedis.del(keys);
  5. //存数据
  6. jedis.set(keys,"snowolf");
  7. //取数据
  8. Stringvalue=jedis.get(keys);
  9. System.out.println(value);

二、池化使用Jedis

Jedis使用commons-pool完成池化实现。

先做个配置文件:

Properties代码
  1. #最大分配的对象数
  2. redis.pool.maxActive=1024
  3. #最大能够保持idel状态的对象数
  4. redis.pool.maxIdle=200
  5. #当池内没有返回对象时,最大等待时间
  6. redis.pool.maxWait=1000
  7. #当调用borrowObject方法时,是否进行有效性检查
  8. redis.pool.testOnBorrow=true
  9. #当调用returnObject方法时,是否进行有效性检查
  10. redis.pool.testOnReturn=true
  11. #IP
  12. redis.ip=10.11.20.140
  13. #Port
  14. redis.port=6379

在静态代码段中完成初始化:

Java代码
  1. privatestaticJedisPoolpool;
  2. static{
  3. ResourceBundlebundle=ResourceBundle.getBundle("redis");
  4. if(bundle==null){
  5. thrownewIllegalArgumentException(
  6. "[redis.properties]isnotfound!");
  7. }
  8. JedisPoolConfigconfig=newJedisPoolConfig();
  9. config.setMaxActive(Integer.valueOf(bundle
  10. .getString("redis.pool.maxActive")));
  11. config.setMaxIdle(Integer.valueOf(bundle
  12. .getString("redis.pool.maxIdle")));
  13. config.setMaxWait(Long.valueOf(bundle.getString("redis.pool.maxWait")));
  14. config.setTestOnBorrow(Boolean.valueOf(bundle
  15. .getString("redis.pool.testOnBorrow")));
  16. config.setTestOnReturn(Boolean.valueOf(bundle
  17. .getString("redis.pool.testOnReturn")));
  18. pool=newJedisPool(config,bundle.getString("redis.ip"),
  19. Integer.valueOf(bundle.getString("redis.port")));
  20. }
[java] view plain copy
  1. privatestaticJedisPoolpool;
  2. static{
  3. ResourceBundlebundle=ResourceBundle.getBundle("redis");
  4. if(bundle==null){
  5. thrownewIllegalArgumentException(
  6. "[redis.properties]isnotfound!");
  7. }
  8. JedisPoolConfigconfig=newJedisPoolConfig();
  9. config.setMaxActive(Integer.valueOf(bundle
  10. .getString("redis.pool.maxActive")));
  11. config.setMaxIdle(Integer.valueOf(bundle
  12. .getString("redis.pool.maxIdle")));
  13. config.setMaxWait(Long.valueOf(bundle.getString("redis.pool.maxWait")));
  14. config.setTestOnBorrow(Boolean.valueOf(bundle
  15. .getString("redis.pool.testOnBorrow")));
  16. config.setTestOnReturn(Boolean.valueOf(bundle
  17. .getString("redis.pool.testOnReturn")));
  18. pool=newJedisPool(config,bundle.getString("redis.ip"),
  19. Integer.valueOf(bundle.getString("redis.port")));
  20. }

然后,修改前面那段jedis操作Redis

Java代码
  1. //从池中获取一个Jedis对象
  2. Jedisjedis=pool.getResource();
  3. Stringkeys="name";
  4. //删数据
  5. jedis.del(keys);
  6. //存数据
  7. jedis.set(keys,"snowolf");
  8. //取数据
  9. Stringvalue=jedis.get(keys);
  10. System.out.println(value);
  11. //释放对象池
  12. pool.returnResource(jedis);
[java] view plain copy
  1. //从池中获取一个Jedis对象
  2. Jedisjedis=pool.getResource();
  3. Stringkeys="name";
  4. //删数据
  5. jedis.del(keys);
  6. //存数据
  7. jedis.set(keys,"snowolf");
  8. //取数据
  9. Stringvalue=jedis.get(keys);
  10. System.out.println(value);
  11. //释放对象池
  12. pool.returnResource(jedis);

改为从对象池中,获取Jedis实例:

Java代码
  1. //从池中获取一个Jedis对象
  2. Jedisjedis=pool.getResource();
[java] view plain copy
  1. //从池中获取一个Jedis对象
  2. Jedisjedis=pool.getResource();

切记,最后使用后,释放Jedis对象:

Java代码
  1. //释放对象池
  2. pool.returnResource(jedis);
[java] view plain copy
  1. //释放对象池
  2. pool.returnResource(jedis);

三、一致性哈希

Memcached完全基于分布式集群,而RedisMaster-Slave,如果想把Reids,做成集群模式,无外乎多做几套Master-Slave,每套Master-Slave完成各自的容灾处理,通过Client工具,完成一致性哈希。

PS:Memcached是在Server端完成ShardingRedis只能依靠各个ClientSharding。可能会在Redis 3.0系列支持ServerSharding

保留前面的JedisPoolConfig,新增两个Redis的IP(redis1.ip,redis2.ip),完成两个JedisShardInfo实例,并将其丢进List中:

Java代码
  1. JedisShardInfojedisShardInfo1=newJedisShardInfo(
  2. bundle.getString("redis1.ip"),Integer.valueOf(bundle.getString("redis.port")));
  3. JedisShardInfojedisShardInfo2=newJedisShardInfo(
  4. bundle.getString("redis2.ip"),Integer.valueOf(bundle.getString("redis.port")));
  5. List<JedisShardInfo>list=newLinkedList<JedisShardInfo>();
  6. list.add(jedisShardInfo1);
  7. list.add(jedisShardInfo2);
[java] view plain copy
  1. JedisShardInfojedisShardInfo1=newJedisShardInfo(
  2. bundle.getString("redis1.ip"),Integer.valueOf(bundle.getString("redis.port")));
  3. JedisShardInfojedisShardInfo2=newJedisShardInfo(
  4. bundle.getString("redis2.ip"),Integer.valueOf(bundle.getString("redis.port")));
  5. List<JedisShardInfo>list=newLinkedList<JedisShardInfo>();
  6. list.add(jedisShardInfo1);
  7. list.add(jedisShardInfo2);

初始化ShardedJedisPool代替JedisPool:

Java代码
  1. ShardedJedisPoolpool=newShardedJedisPool(config,list);
[java] view plain copy
  1. ShardedJedisPoolpool=newShardedJedisPool(config,list);

改由ShardedJedis,获取Jedis对象:

Java代码
  1. //从池中获取一个Jedis对象
  2. ShardedJedisjedis=pool.getResource();
  3. Stringkeys="name";
  4. Stringvalue="snowolf";
  5. //删数据
  6. jedis.del(keys);
  7. //存数据
  8. jedis.set(keys,value);
  9. //取数据
  10. Stringv=jedis.get(keys);
  11. System.out.println(v);
  12. //释放对象池
  13. pool.returnResource(jedis);
[java] view plain copy
  1. //从池中获取一个Jedis对象
  2. ShardedJedisjedis=pool.getResource();
  3. Stringkeys="name";
  4. Stringvalue="snowolf";
  5. //删数据
  6. jedis.del(keys);
  7. //存数据
  8. jedis.set(keys,value);
  9. //取数据
  10. Stringv=jedis.get(keys);
  11. System.out.println(v);
  12. //释放对象池
  13. pool.returnResource(jedis);

四、Spring封装参考

Ok,完成上述代码足够完成简单任务,如果有必要,可以用spring封装初始化:

Xml代码
  1. <context:property-placeholderlocation="classpath:redis.properties"/>
  2. <bean
  3. id="jedisPoolConfig"
  4. class="redis.clients.jedis.JedisPoolConfig"
  5. >
  6. <property
  7. name="maxActive"
  8. value="${redis.pool.maxActive}"/>
  9. <property
  10. name="maxIdle"
  11. value="${redis.pool.maxIdle}"/>
  12. <property
  13. name="maxWait"
  14. value="${redis.pool.maxWait}"/>
  15. <property
  16. name="testOnBorrow"
  17. value="${redis.pool.testOnBorrow}"/>
  18. </bean>
  19. <bean
  20. id="shardedJedisPool"
  21. class="redis.clients.jedis.ShardedJedisPool"
  22. >
  23. <constructor-arg
  24. index="0"
  25. ref="jedisPoolConfig"/>
  26. <constructor-argindex="1">
  27. <list>
  28. <beanclass="redis.clients.jedis.JedisShardInfo">
  29. <constructor-arg
  30. index="0"
  31. value="${redis1.ip}"/>
  32. <constructor-arg
  33. index="1"
  34. value="${redis.port}"
  35. type="int"/>
  36. </bean>
  37. <beanclass="redis.clients.jedis.JedisShardInfo">
  38. <constructor-arg
  39. index="0"
  40. value="${redis2.ip}"/>
  41. <constructor-arg
  42. index="1"
  43. value="${redis.port}"
  44. type="int"/>
  45. </bean>
  46. </list>
  47. </constructor-arg>
  48. </bean>
  1. <context:property-placeholderlocation="classpath:redis.properties"/>
  2. <bean
  3. id="jedisPoolConfig"
  4. class="redis.clients.jedis.JedisPoolConfig"
  5. >
  6. <property
  7. name="maxActive"
  8. value="${redis.pool.maxActive}"/>
  9. <property
  10. name="maxIdle"
  11. value="${redis.pool.maxIdle}"/>
  12. <property
  13. name="maxWait"
  14. value="${redis.pool.maxWait}"/>
  15. <property
  16. name="testOnBorrow"
  17. value="${redis.pool.testOnBorrow}"/>
  18. </bean>
  19. <bean
  20. id="shardedJedisPool"
  21. class="redis.clients.jedis.ShardedJedisPool"
  22. >
  23. <constructor-arg
  24. index="0"
  25. ref="jedisPoolConfig"/>
  26. <constructor-argindex="1">
  27. <list>
  28. <beanclass="redis.clients.jedis.JedisShardInfo">
  29. <constructor-arg
  30. index="0"
  31. value="${redis1.ip}"/>
  32. <constructor-arg
  33. index="1"
  34. value="${redis.port}"
  35. type="int"/>
  36. </bean>
  37. <beanclass="redis.clients.jedis.JedisShardInfo">
  38. <constructor-arg
  39. index="0"
  40. value="${redis2.ip}"/>
  41. <constructor-arg
  42. index="1"
  43. value="${redis.port}"
  44. type="int"/>
  45. </bean>
  46. </list>
  47. </constructor-arg>
  48. </bean>

代码可以更简洁一些:

Java代码
  1. privateApplicationContextapp;
  2. privateShardedJedisPoolpool;
  3. @Before
  4. publicvoidbefore()throwsException{
  5. app=newClassPathXmlApplicationContext("applicationContext.xml");
  6. pool=(ShardedJedisPool)app.getBean("shardedJedisPool");
  7. }
  8. @Test
  9. publicvoidtest(){
  10. //从池中获取一个Jedis对象
  11. ShardedJedisjedis=pool.getResource();
  12. Stringkeys="name";
  13. Stringvalue="snowolf";
  14. //删数据
  15. jedis.del(keys);
  16. //存数据
  17. jedis.set(keys,value);
  18. //取数据
  19. Stringv=jedis.get(keys);
  20. System.out.println(v);
  21. //释放对象池
  22. pool.returnResource(jedis);
  23. assertEquals(value,v);
  24. }
[java] view plain copy
  1. privateApplicationContextapp;
  2. privateShardedJedisPoolpool;
  3. @Before
  4. publicvoidbefore()throwsException{
  5. app=newClassPathXmlApplicationContext("applicationContext.xml");
  6. pool=(ShardedJedisPool)app.getBean("shardedJedisPool");
  7. }
  8. @Test
  9. publicvoidtest(){
  10. //从池中获取一个Jedis对象
  11. ShardedJedisjedis=pool.getResource();
  12. Stringkeys="name";
  13. Stringvalue="snowolf";
  14. //删数据
  15. jedis.del(keys);
  16. //存数据
  17. jedis.set(keys,value);
  18. //取数据
  19. Stringv=jedis.get(keys);
  20. System.out.println(v);
  21. //释放对象池
  22. pool.returnResource(jedis);
  23. assertEquals(value,v);
  24. }


当然,Spring提供了对于Redis的专门支持:spring-data-redis,以后有机会再深入研究。

相关链接:

Redis实战

Redis实战之Redis + Jedis

Redis实战之征服 Redis + Jedis + Spring (一)

Redis实战之征服 Redis + Jedis + Spring (二)

Redis实战之征服 Redis + Jedis + Spring (三)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值