Redis初探(7)——Jedis操纵集群

男娘i 2022-05-27 01:42 346阅读 0赞

在Redis初探(2)——Jedis的使用中,我们已经学会了Jedis操纵单机Redis的简单使用,本章将继续深入,介绍Jedis对集群的操纵。

一、Jedis连接单机

在开始介绍Jedis连接集群之前,先简单回顾下连接单机的使用。

1.1 简单使用

  1. @Test
  2. public void testJedis() {
  3. // 1.获得连接对象。参数为redis所在的服务器地址及端口号
  4. Jedis jedis = new Jedis("192.168.30.155", 6379);
  5. // 2.获得数据
  6. String age = jedis.get("age");
  7. System.out.println(age);
  8. jedis.close();
  9. }

1.2 使用连接池

  1. @Test
  2. public void testJedisPool() {
  3. //1. 创建Jedis连接池配置(包含许多配置,这里只配置了3个)
  4. JedisPoolConfig poolConfig = new JedisPoolConfig();
  5. // 设置最小和最大闲置个数
  6. poolConfig.setMinIdle(5);
  7. poolConfig.setMaxIdle(10);
  8. // 设置连接池最大个数
  9. poolConfig.setMaxTotal(30);
  10. //2. 创建Jedis连接池
  11. JedisPool pool = new JedisPool(poolConfig,"192.168.30.155", 6379);
  12. //3. 从连接池中获取Jedis对象
  13. Jedis jedis = pool.getResource();
  14. //4.操纵数据
  15. jedis.set("sex", "male");
  16. System.out.println(jedis.get("sex"));
  17. //5.关闭资源
  18. jedis.close();
  19. pool.close();
  20. }

二、Jedis连接集群

Jedis连接集群也是十分简单,首先创建一个HostAndPort的集合,里面存放着集群中的每一个节点,然后创建JedisCluster对象,直接操纵该对象即可。

JedisCluster在项目中单例存在即可。第三步的关闭可省略(因为单例存在,如果关掉了,即整个项目要结束了)。

  1. @Test
  2. public void testJedisCluster() throws IOException {
  3. // 1.创建一个JedisCluster对象。第一个参数nodes是一个set类型,set中包含若干个HostAndPort对象
  4. Set<HostAndPort> nodes = new HashSet<>();
  5. nodes.add(new HostAndPort("192.168.30.155", 7001));
  6. nodes.add(new HostAndPort("192.168.30.155", 7002));
  7. nodes.add(new HostAndPort("192.168.30.155", 7003));
  8. nodes.add(new HostAndPort("192.168.30.155", 7004));
  9. nodes.add(new HostAndPort("192.168.30.155", 7005));
  10. nodes.add(new HostAndPort("192.168.30.155", 7006));
  11. JedisCluster cluster = new JedisCluster(nodes);
  12. // 2.直接使用JedisCluster对象操作redis,单例存在即可。
  13. cluster.set("test", "123");
  14. System.out.println(cluster.get("test"));
  15. // 3.关闭JedisCluster对象。
  16. cluster.close();
  17. }

三、Jedis的实际应用

在实际项目中,测试环境一般使用单机版,生产环境使用集群版。为了避免代码的不必要改动,我们使用策略模式面向接口开发

3.1 JedisClient接口

定义一个JedisClient的接口,里面封装了常用的一些方法,主要是对String类型和Hash类型的操作,可以根据实际情况进行修改。

  1. import java.util.List;
  2. public interface JedisClient {
  3. String set(String key, String value);
  4. String get(String key);
  5. Boolean exists(String key);
  6. Long expire(String key, int seconds);
  7. Long ttl(String key);
  8. Long incr(String key);
  9. Long hset(String key, String field, String value);
  10. String hget(String key, String field);
  11. Long hdel(String key, String... field);
  12. Boolean hexists(String key, String field);
  13. List<String> hvals(String key);
  14. Long del(String key);
  15. }

3.2 单机实现类

  1. import java.util.List;
  2. import redis.clients.jedis.Jedis;
  3. import redis.clients.jedis.JedisPool;
  4. public class JedisClientPool implements JedisClient {
  5. private JedisPool jedisPool;
  6. public JedisPool getJedisPool() {
  7. return jedisPool;
  8. }
  9. public void setJedisPool(JedisPool jedisPool) {
  10. this.jedisPool = jedisPool;
  11. }
  12. @Override
  13. public String set(String key, String value) {
  14. Jedis jedis = jedisPool.getResource();
  15. String result = jedis.set(key, value);
  16. jedis.close();
  17. return result;
  18. }
  19. @Override
  20. public String get(String key) {
  21. Jedis jedis = jedisPool.getResource();
  22. String result = jedis.get(key);
  23. jedis.close();
  24. return result;
  25. }
  26. @Override
  27. public Boolean exists(String key) {
  28. Jedis jedis = jedisPool.getResource();
  29. Boolean result = jedis.exists(key);
  30. jedis.close();
  31. return result;
  32. }
  33. @Override
  34. public Long expire(String key, int seconds) {
  35. Jedis jedis = jedisPool.getResource();
  36. Long result = jedis.expire(key, seconds);
  37. jedis.close();
  38. return result;
  39. }
  40. @Override
  41. public Long ttl(String key) {
  42. Jedis jedis = jedisPool.getResource();
  43. Long result = jedis.ttl(key);
  44. jedis.close();
  45. return result;
  46. }
  47. @Override
  48. public Long incr(String key) {
  49. Jedis jedis = jedisPool.getResource();
  50. Long result = jedis.incr(key);
  51. jedis.close();
  52. return result;
  53. }
  54. @Override
  55. public Long hset(String key, String field, String value) {
  56. Jedis jedis = jedisPool.getResource();
  57. Long result = jedis.hset(key, field, value);
  58. jedis.close();
  59. return result;
  60. }
  61. @Override
  62. public String hget(String key, String field) {
  63. Jedis jedis = jedisPool.getResource();
  64. String result = jedis.hget(key, field);
  65. jedis.close();
  66. return result;
  67. }
  68. @Override
  69. public Long hdel(String key, String... field) {
  70. Jedis jedis = jedisPool.getResource();
  71. Long result = jedis.hdel(key, field);
  72. jedis.close();
  73. return result;
  74. }
  75. @Override
  76. public Boolean hexists(String key, String field) {
  77. Jedis jedis = jedisPool.getResource();
  78. Boolean result = jedis.hexists(key, field);
  79. jedis.close();
  80. return result;
  81. }
  82. @Override
  83. public List<String> hvals(String key) {
  84. Jedis jedis = jedisPool.getResource();
  85. List<String> result = jedis.hvals(key);
  86. jedis.close();
  87. return result;
  88. }
  89. @Override
  90. public Long del(String key) {
  91. Jedis jedis = jedisPool.getResource();
  92. Long result = jedis.del(key);
  93. jedis.close();
  94. return result;
  95. }
  96. }

3.3 集群实现类

  1. import java.util.List;
  2. import redis.clients.jedis.JedisCluster;
  3. public class JedisClientCluster implements JedisClient {
  4. private JedisCluster jedisCluster;
  5. public JedisCluster getJedisCluster() {
  6. return jedisCluster;
  7. }
  8. public void setJedisCluster(JedisCluster jedisCluster) {
  9. this.jedisCluster = jedisCluster;
  10. }
  11. @Override
  12. public String set(String key, String value) {
  13. return jedisCluster.set(key, value);
  14. }
  15. @Override
  16. public String get(String key) {
  17. return jedisCluster.get(key);
  18. }
  19. @Override
  20. public Boolean exists(String key) {
  21. return jedisCluster.exists(key);
  22. }
  23. @Override
  24. public Long expire(String key, int seconds) {
  25. return jedisCluster.expire(key, seconds);
  26. }
  27. @Override
  28. public Long ttl(String key) {
  29. return jedisCluster.ttl(key);
  30. }
  31. @Override
  32. public Long incr(String key) {
  33. return jedisCluster.incr(key);
  34. }
  35. @Override
  36. public Long hset(String key, String field, String value) {
  37. return jedisCluster.hset(key, field, value);
  38. }
  39. @Override
  40. public String hget(String key, String field) {
  41. return jedisCluster.hget(key, field);
  42. }
  43. @Override
  44. public Long hdel(String key, String... field) {
  45. return jedisCluster.hdel(key, field);
  46. }
  47. @Override
  48. public Boolean hexists(String key, String field) {
  49. return jedisCluster.hexists(key, field);
  50. }
  51. @Override
  52. public List<String> hvals(String key) {
  53. return jedisCluster.hvals(key);
  54. }
  55. @Override
  56. public Long del(String key) {
  57. return jedisCluster.del(key);
  58. }
  59. }

3.4 实战演示

(1)首先准备一个配置文件cfg.properties,在配置文件中加入关于redis的信息:

  1. # redis单机
  2. redis.standalone.host=192.168.30.155
  3. redis.standalone.port=6379
  4. #redis集群
  5. redis.cluster.01.host=192.168.30.155
  6. redis.cluster.01.port=7001
  7. redis.cluster.02.host=192.168.30.155
  8. redis.cluster.02.port=7002
  9. redis.cluster.03.host=192.168.30.155
  10. redis.cluster.03.port=7003
  11. redis.cluster.04.host=192.168.30.155
  12. redis.cluster.04.port=7004
  13. redis.cluster.05.host=192.168.30.155
  14. redis.cluster.05.port=7005
  15. redis.cluster.06.host=192.168.30.155
  16. redis.cluster.06.port=7006

(2)准备Spring关于redis的配置文件applicationContext-redis.xml

需要注意的是,单机和集群同时只能放开一个,另一个必须注释掉。因为我们取Bean是取接口,即JedisClient,这两个都是JedisClient的实现类。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  3. <!-- 注意:单机和集群同时只能放开一个 -->
  4. <!-- 加载配置文件 -->
  5. <context:property-placeholder location="classpath:cfg.properties"/>
  6. <!-- 配置Redis单机 -->
  7. <bean id="jedisClientPool" class="jit.wxs.common.jedis.JedisClientPool">
  8. <property name="jedisPool" ref="jedisPool"/>
  9. </bean>
  10. <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
  11. <constructor-arg name="host" value="${redis.standalone.host}"/>
  12. <constructor-arg name="port" value="${redis.standalone.port}"/>
  13. </bean>
  14. <!-- 配置Redis集群 -->
  15. <bean id="jedisClientCluster" class="jit.wxs.common.jedis.JedisClientCluster">
  16. <property name="jedisCluster" ref="jedisCluster"/>
  17. </bean>
  18. <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
  19. <constructor-arg>
  20. <set>
  21. <bean class="redis.clients.jedis.HostAndPort">
  22. <constructor-arg name="host" value="${redis.cluster.01.host}"/>
  23. <constructor-arg name="port" value="${redis.cluster.01.port}"/>
  24. </bean>
  25. <bean class="redis.clients.jedis.HostAndPort">
  26. <constructor-arg name="host" value="${redis.cluster.02.host}"/>
  27. <constructor-arg name="port" value="${redis.cluster.02.port}"/>
  28. </bean>
  29. <bean class="redis.clients.jedis.HostAndPort">
  30. <constructor-arg name="host" value="${redis.cluster.03.host}"/>
  31. <constructor-arg name="port" value="${redis.cluster.03.port}"/>
  32. </bean>
  33. <bean class="redis.clients.jedis.HostAndPort">
  34. <constructor-arg name="host" value="${redis.cluster.04.host}"/>
  35. <constructor-arg name="port" value="${redis.cluster.04.port}"/>
  36. </bean>
  37. <bean class="redis.clients.jedis.HostAndPort">
  38. <constructor-arg name="host" value="${redis.cluster.05.host}"/>
  39. <constructor-arg name="port" value="${redis.cluster.05.port}"/>
  40. </bean>
  41. <bean class="redis.clients.jedis.HostAndPort">
  42. <constructor-arg name="host" value="${redis.cluster.06.host}"/>
  43. <constructor-arg name="port" value="${redis.cluster.06.port}"/>
  44. </bean>
  45. </set>
  46. </constructor-arg>
  47. </bean>
  48. </beans>

(3)编写测试方法

  1. @Test
  2. public void test() {
  3. ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext-redis.xml");
  4. JedisClient jedisClient = ac.getBean(JedisClient.class);
  5. jedisClient.set("author", "jitwxs");
  6. String result = jedisClient.get("author");
  7. System.out.println(result);
  8. }

因为我们是面向接口开发,因此当我们切换单机和集群时,这段代码不需要任何修改,只需要修改配置文件即可。

发表评论

表情:
评论列表 (有 0 条评论,346人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Jedis 初探

    Jedis是java操作redis的jar包 先说一下如何连接redis 比如在linux操作系统上的话,进入目录,输入 "./redis cli"即可登录。 如果设置了

    相关 Redis初探(6)——Redis

    之前我们所学习的都是 Redis 的单机版,我们知道 Redis 之所以读取速度快是因为它是存储在内存中的。内存的容量是有限的,单台 Redis 会碰到性能瓶颈,这就需要使用