Redis集群版在Java中的应用以及和spring结合

来源:互联网 发布:我想做淘宝怎么弄 编辑:程序博客网 时间:2024/06/16 11:19

转自  http://blog.csdn.net/u010539352/article/details/51778242

前两天刚刚搭建完了Redis集群,今天正好测试一下在Java中如何使用redis缓存一些东西。与spring是如何结合在一起的。封装一个操作redis的工具类,供项目中使用。

 

第一篇redis博客讲解过单机版在Java中的应用,应该了解到了。

首先要把jedis依赖的jar包加上。

 

spring配置文件中添加redis配置。(三主三从,9001-9003是主,9004-9006是从)

[html] view plain copy
  1. <!-- 配置redis客户端集群版 -->  
  2. <!-- <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">  
  3.     <constructor-arg>  
  4.         <set>  
  5.             <bean class="redis.clients.jedis.HostAndPort">  
  6.                 <constructor-arg name="host" value="192.168.XX.XX"/>  
  7.                 <constructor-arg name="port" value="9001"/>   
  8.             </bean>                                           
  9.             <bean class="redis.clients.jedis.HostAndPort">    
  10.                 <constructor-arg name="host" value="XXXXXXX"/>  
  11.                 <constructor-arg name="port" value="9002"/>   
  12.             </bean>                                           
  13.             <bean class="redis.clients.jedis.HostAndPort">    
  14.                 <constructor-arg name="host" value="XXXXXXX"/>  
  15.                 <constructor-arg name="port" value="9003"/>   
  16.             </bean>                                           
  17.             <bean class="redis.clients.jedis.HostAndPort">    
  18.                 <constructor-arg name="host" value="XXXXXXX"/>  
  19.                 <constructor-arg name="port" value="9004"/>   
  20.             </bean>                                           
  21.             <bean class="redis.clients.jedis.HostAndPort">    
  22.                 <constructor-arg name="host" value="XXXXXXX"/>  
  23.                 <constructor-arg name="port" value="9005"/>   
  24.             </bean>                                           
  25.             <bean class="redis.clients.jedis.HostAndPort">    
  26.                 <constructor-arg name="host" value="XXXXXXX"/>  
  27.                 <constructor-arg name="port" value="9006"/>  
  28.             </bean>  
  29.         </set>  
  30.     </constructor-arg>  
  31. </bean>  
  32.   
  33. lt;bean id="jedisClientCluster" class="com.dianshang.rest.component.impl.JedisClientCluster"/>  
封装redis的一些常用操作(存储String 类型,获取String类型,设置过期时间,删除hash数据等等)

[html] view plain copy
  1. /**  
  2.  * redis操作工具类  
  3.  * @author xiao  
  4.  *  
  5.  */  
  6. public class JedisClientCluster implements JedisClient{  
  7.       
  8.     //注入jedisCluster  
  9.     @Autowired  
  10.     private JedisCluster jedisCluster;  
  11.   
  12.     /**  
  13.      * 设置String数据类型  
  14.      *   
  15.      * @param key  
  16.      * @param value  
  17.      * @return  
  18.      */  
  19.     @Override  
  20.     public String set(String key, String value) {  
  21.         return jedisCluster.set(key, value);  
  22.     }  
  23.   
  24.     /**  
  25.      * 获取String数据类型  
  26.      *   
  27.      * @param key  
  28.      * @return  
  29.      */  
  30.     @Override  
  31.     public String get(String key) {  
  32.         return jedisCluster.get(key);  
  33.     }  
  34.       
  35.     /**  
  36.      * 设置hash数据类型  
  37.      *   
  38.      * @param key  
  39.      * @param item  
  40.      * @param value  
  41.      * @return  
  42.      */  
  43.     @Override  
  44.     public Long hset(String key, String item, String value) {  
  45.         return jedisCluster.hset(key, item, value);  
  46.     }  
  47.       
  48.     /**  
  49.      * 获取hash数据类型  
  50.      *   
  51.      * @param key  
  52.      * @param item  
  53.      * @return  
  54.      */  
  55.     @Override  
  56.     public String hget(String key, String item) {  
  57.         return jedisCluster.hget(key, item);  
  58.     }  
  59.       
  60.     /**  
  61.      * 删除hash数据  
  62.      * @param key  
  63.      * @param item  
  64.      * @return  
  65.      */  
  66.     @Override  
  67.     public Long incr(String key) {  
  68.         return jedisCluster.incr(key);  
  69.     }  
  70.       
  71.     /**  
  72.      * 加一操作  
  73.      *   
  74.      * @param key  
  75.      * @return  
  76.      */  
  77.     @Override  
  78.     public Long decr(String key) {  
  79.         return jedisCluster.decr(key);  
  80.     }  
  81.       
  82.     /**  
  83.      * 减一操作  
  84.      *   
  85.      * @param key  
  86.      * @return  
  87.      */  
  88.     @Override  
  89.     public Long expire(String key, int second) {  
  90.         return jedisCluster.expire(key, second);  
  91.     }  
  92.       
  93.     /**  
  94.      * 设置key的过期时间  
  95.      *   
  96.      * @param key  
  97.      * @param second  
  98.      * @return  
  99.      */  
  100.     @Override  
  101.     public Long ttl(String key) {  
  102.         return jedisCluster.ttl(key);  
  103.     }  
  104.       
  105.     /**  
  106.      * 判断key是否过期  
  107.      *   
  108.      * @param key  
  109.      * @return  
  110.      */  
  111.     @Override  
  112.     public Long hdel(String key, String item) {  
  113.          return jedisCluster.hdel(key, item);  
  114.     }  
  115.   
  116. }  

注:接口就不写出来了。

 

编写测试类进行测试

[html] view plain copy
  1. @Test  
  2. public void testJedisClientSpring() throws Exception {  
  3.     //创建一个spring容器  
  4.     ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");  
  5.     //从容器中获得JedisClient对象  
  6.     JedisClient jedisClient = applicationContext.getBean(JedisClient.class);  
  7.     //jedisClient操作redis  
  8.     jedisClient.set("cliet1", "1000");  
  9.     String string = jedisClient.get("cliet1");  
  10.     System.out.println(string);  
  11. }  

测试结果:

 

上一篇博客中我只讲解了一下我在搭建redis集群的时候遇到的问题,不知道大家有没有疑问,就是我往客户端配置了这么多节点,往redis中缓存数据的时候,它怎么知道该缓存到哪个服务器上呢??在这里我简单的说一下,

Redis 集群中内置了16384 个哈希槽,搭建集群时,每台服务器上已经分配了固定的哈希槽编号。当需要在 Redis 集群中放置一个key-value(数据) 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据求余的结果,把数据映射到不同的redis服务器上。



原创粉丝点击