目前Redis大概有3中基于Java语言的Client:
Jredis
Jedis
Redis4J
这里只说Jedis,因为它是官方提供的唯一Redis Client For Java Provider!
一、简单使用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>
如果只是简单使用Jedis,以下这么几行代码足够:
Java代码
1. Jedis jedis = new Jedis("10.11.20.140");
2. String keys = "name";
3.
4. // 删数据
5. jedis.del(keys);
6. // 存数据
7. jedis.set(keys, "snowolf");
8. // 取数据
9. String value = jedis.get(keys);
10.
11. 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. #当调用borrow Object方法时,是否进行有效性检查
8. redis.pool.testOnBorrow=true
9. #当调用return Object方法时,是否进行有效性检查
10. redis.pool.testOnReturn=true
11. #IP
12. redis.ip=10.11.20.140
13. #Port
14. redis.port=6379
在静态代码段中完成初始化:
Java代码
1. private static JedisPool pool;
2. static {
3. ResourceBundle bundle = ResourceBundle.getBundle("redis");
4. if (bundle == null) {
5. throw new IllegalArgumentException(
6. "[redis.properties] is not found!");
7. }
8. JedisPoolConfig config = new JedisPoolConfig();
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 = new JedisPool(config, bundle.getString("redis.ip"),
19. Integer.valueOf(bundle.getString("redis.port")));
20. }
然后,修改前面那段jedis操作Redis
Java代码
1. // 从池中获取一个Jedis对象
2. Jedis jedis = pool.getResource();
3. String keys = "name";
4.
5. // 删数据
6. jedis.del(keys);
7. // 存数据
8. jedis.set(keys, "snowolf");
9. // 取数据
10. String value = jedis.get(keys);
11.
12. System.out.println(value);
13.
14. // 释放对象池
15. pool.returnResource(jedis);
改为从对象池中,获取Jedis实例:
Java代码
1. // 从池中获取一个Jedis对象
2. Jedis jedis = pool.getResource();
切记,最后使用后,释放Jedis对象:
Java代码
1. // 释放对象池
2. pool.returnResource(jedis);
三、一致性哈希
Memcached完全基于分布式集群,而Redis是Master-Slave,如果想把Reids,做成集群模式,无外乎多做几套Master-Slave,每套Master-Slave完成各自的容灾处理,通过Client工具,完成一致性哈希。
PS:Memcached是在Server端完成Sharding,Redis只能依靠各个Client做Sharding。可能会在Redis 3.0系列支持Server端Sharding。
保留前面的JedisPoolConfig,新增两个Redis的IP(redis1.ip,redis2.ip),完成两个JedisShardInfo实例,并将其丢进List中:
Java代码
1. JedisShardInfo jedisShardInfo1 = new JedisShardInfo(
2. bundle.getString("redis1.ip"), Integer.valueOf(bundle .getString("redis.port")));
3. JedisShardInfo jedisShardInfo2 = new JedisShardInfo(
4. bundle.getString("redis2.ip"), Integer.valueOf(bundle .getString("redis.port")));
5.
6. List<JedisShardInfo> list = new LinkedList<JedisShardInfo>();
7. list.add(jedisShardInfo1);
8. list.add(jedisShardInfo2);
初始化ShardedJedisPool代替JedisPool:
Java代码
1. ShardedJedisPool pool = new ShardedJedisPool(config, list);
改由ShardedJedis,获取Jedis对象:
Java代码
1. // 从池中获取一个Jedis对象
2. ShardedJedis jedis = pool.getResource();
3. String keys = "name";
4. String value = "snowolf";
5. // 删数据
6. jedis.del(keys);
7. // 存数据
8. jedis.set(keys, value);
9. // 取数据
10. String v = jedis.get(keys);
11.
12. System.out.println(v);
13.
14. // 释放对象池
15. pool.returnResource(jedis);
四、Spring封装参考
Ok,完成上述代码足够完成简单任务,如果有必要,可以用Spring封装初始化:
Xml代码
1. <context:property-placeholder location="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-arg index="1">
27. <list>
28. <bean class="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. <bean class="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. private ApplicationContext app;
2. private ShardedJedisPool pool;
3.
4. @Before
5. public void before() throws Exception {
6. app = new ClassPathXmlApplicationContext("applicationContext.xml");
7. pool = (ShardedJedisPool) app.getBean("shardedJedisPool");
8. }
9.
10. @Test
11. public void test() {
12.
13. // 从池中获取一个Jedis对象
14. ShardedJedis jedis = pool.getResource();
15. String keys = "name";
16. String value = "snowolf";
17. // 删数据
18. jedis.del(keys);
19. // 存数据
20. jedis.set(keys, value);
21. // 取数据
22. String v = jedis.get(keys);
23.
24. System.out.println(v);
25.
26. // 释放对象池
27. pool.returnResource(jedis);
28.
29. assertEquals(value, v);
30. }
当然,Spring提供了对于Redis的专门支持:spring-data-redis,以后有机会再深入研究。
如果想深入体验LINUX系统的新手,也可以先下载一个方德Linux软件中心试用一下。
免费下载地址:http://www.nfs-cloud.cn:81/appCenter/open/softcente