Spring整合redis哨兵及redisTemplate

来源:互联网 发布:淘宝砗磲 编辑:程序博客网 时间:2024/05/29 17:55

环境准备

我的redis环境,我搭建在一个虚拟机上。
CentOS6.5
Redis3.2.9

redis 服务器 端口号 Redis Master 192.168.251.129 6382 Redis Slave 192.168.251.129 6380 Redis Slave 192.168.251.129 6381 Redis Sentinel 192.168.251.129 26379

项目下载

Redis整个哨兵(redisTemplate)下载,项目中整合redis的事务

整合Spring

maven依赖

<!-- redis Spring 基于注解配置 -->             <dependency>                <groupId>org.springframework.data</groupId>                <artifactId>spring-data-redis</artifactId>                <version>1.8.1.RELEASE</version>              </dependency><!-- Redis客户端 -->            <dependency>                <groupId>redis.clients</groupId>                 <artifactId>jedis</artifactId>                <version>2.9.0</version>            </dependency>

配置文件

ApplicationContext-redis.xml

<?xml version="1.0" encoding="UTF-8"?>    <beans xmlns="http://www.springframework.org/schema/beans"          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"          xmlns:context="http://www.springframework.org/schema/context"          xmlns:mvc="http://www.springframework.org/schema/mvc"          xmlns:cache="http://www.springframework.org/schema/cache"        xsi:schemaLocation="http://www.springframework.org/schema/beans                                http://www.springframework.org/schema/beans/spring-beans-4.2.xsd                                http://www.springframework.org/schema/context                                http://www.springframework.org/schema/context/spring-context-4.2.xsd                                http://www.springframework.org/schema/mvc                                http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd                            http://www.springframework.org/schema/cache                             http://www.springframework.org/schema/cache/spring-cache-4.2.xsd">         <!-- 加载配置文件 -->      <context:property-placeholder location="classpath:properties/*.properties" />      <!-- redis连接池配置-->        <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" >            <!--最大空闲数-->            <property name="maxIdle" value="${redis.maxIdle}" />            <!--连接池的最大数据库连接数  -->          <property name="maxTotal" value="${redis.maxTotal}" />          <!--最大建立连接等待时间-->            <property name="maxWaitMillis" value="${redis.maxWaitMillis}" />            <!--逐出连接的最小空闲时间 默认1800000毫秒(30分钟)-->          <property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}" />           <!--每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3-->          <property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}" />           <!--逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1-->          <property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}" />           <!--是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个-->            <property name="testOnBorrow" value="${redis.testOnBorrow}" />            <!--在空闲时检查有效性, 默认false  -->          <property name="testWhileIdle" value="${redis.testWhileIdle}" />        </bean >      <!-- redis集群配置 哨兵模式 -->       <bean id="sentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">          <property name="master">              <bean class="org.springframework.data.redis.connection.RedisNode">                 <!--  这个值要和Sentinel中指定的master的值一致,不然启动时找不到Sentinel会报错的   -->               <property name="name" value="mymaster"></property>                 <!-- 配置注master节点 -->               <constructor-arg name="host" value="${redis.hostName}"/>               <constructor-arg name="port" value="${redis.port}"/>            </bean>          </property>         <!--  记住了,这里是指定Sentinel的IP和端口,不是Master和Slave的   -->        <property name="sentinels">              <set>                  <!-- 我这里就配置一个哨兵 -->                <bean class="org.springframework.data.redis.connection.RedisNode">                      <constructor-arg name="host" value="${redis.sentinel.host1}"></constructor-arg>                      <constructor-arg name="port" value="${redis.sentinel.port1}"></constructor-arg>                  </bean>                 <!--  <bean class="org.springframework.data.redis.connection.RedisNode">                      <constructor-arg name="host" value="${redis.sentinel.host2}"></constructor-arg>                      <constructor-arg name="port" value="${redis.sentinel.port2}"></constructor-arg>                  </bean>                  <bean class="org.springframework.data.redis.connection.RedisNode">                      <constructor-arg name="host" value="${redis.sentinel.host3}"></constructor-arg>                      <constructor-arg name="port" value="${redis.sentinel.port3}"></constructor-arg>                  </bean>   -->            </set>          </property>      </bean>      <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">           <constructor-arg name="sentinelConfig" ref="sentinelConfiguration"></constructor-arg>          <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>      </bean>     <!--redis操作模版,使用该对象可以操作redis  -->      <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >            <property name="connectionFactory" ref="jedisConnectionFactory" />            <!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!!  -->            <property name="keySerializer" >                <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />            </property>            <property name="valueSerializer" >                <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />            </property>            <property name="hashKeySerializer">                <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>            </property>            <property name="hashValueSerializer">                <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>            </property>            <!--开启事务  -->          <property name="enableTransactionSupport" value="true"></property>      </bean >        <!--自定义redis工具类,在需要缓存的地方注入此类  -->      <bean id="redisUtil" class="org.lpl.RedisDemo.utils.RedisUtil">          <property name="redisTemplate" ref="redisTemplate" />      </bean>  </beans>

2.redis.properties

#Matser的ip地址  redis.hostName=192.168.251.129#端口号  redis.port=6382#如果有密码  redis.password=#客户端超时时间单位是毫秒 默认是2000 redis.timeout=10000  #最大空闲数  redis.maxIdle=300  #连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal  #redis.maxActive=600  #控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性  redis.maxTotal=1000  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。  redis.maxWaitMillis=1000  #连接的最小空闲时间 默认1800000毫秒(30分钟)  redis.minEvictableIdleTimeMillis=300000  #每次释放连接的最大数目,默认3  redis.numTestsPerEvictionRun=1024  #逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1  redis.timeBetweenEvictionRunsMillis=30000  #是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个  redis.testOnBorrow=true  #在空闲时检查有效性, 默认false  redis.testWhileIdle=true  #我这里只配置一个        redis.sentinel.host1=192.168.251.129redis.sentinel.port1=26379#redis.sentinel.host2=172.20.1.231  #redis.sentinel.port2=26379  

3.redisUtil(Redistemplate)

public class RedisUtil {    private RedisTemplate<String, Object> redisTemplate;      public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {          this.redisTemplate = redisTemplate;      }      //=============================common============================      /**      * 指定缓存失效时间      * @param key 键      * @param time 时间(秒)      * @return      */      public boolean expire(String key,long time){          try {              if(time>0){                  redisTemplate.expire(key, time, TimeUnit.SECONDS);              }              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }      /**      * 根据key 获取过期时间      * @param key 键 不能为null      * @return 时间(秒) 返回0代表为永久有效      */      public long getExpire(String key){          return redisTemplate.getExpire(key,TimeUnit.SECONDS);      }      /**      * 判断key是否存在      * @param key 键      * @return true 存在 false不存在      */      public boolean hasKey(String key){          try {              return redisTemplate.hasKey(key);          } catch (Exception e) {              e.printStackTrace();              return false;          }      }      /**      * 删除缓存      * @param key 可以传一个值 或多个      */      @SuppressWarnings("unchecked")      public void del(String ... key){          if(key!=null&&key.length>0){              if(key.length==1){                  redisTemplate.delete(key[0]);              }else{                  redisTemplate.delete(CollectionUtils.arrayToList(key));              }          }      }      //============================String=============================      /**      * 普通缓存获取      * @param key 键      * @return 值      */      public Object get(String key){          return key==null?null:redisTemplate.opsForValue().get(key);      }      /**      * 普通缓存放入      * @param key 键      * @param value 值      * @return true成功 false失败      */      public boolean set(String key,Object value) {           try {              redisTemplate.opsForValue().set(key, value);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }      /**      * 普通缓存放入并设置时间      * @param key 键      * @param value 值      * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期      * @return true成功 false 失败      */      public boolean set(String key,Object value,long time){          try {              if(time>0){                  redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);              }else{                  set(key, value);              }              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }      /**      * 递增      * @param key 键      * @param by 要增加几(大于0)      * @return      */      public long incr(String key, long delta){            if(delta<0){              throw new RuntimeException("递增因子必须大于0");          }          return redisTemplate.opsForValue().increment(key, delta);      }      /**      * 递减      * @param key 键      * @param by 要减少几(小于0)      * @return      */      public long decr(String key, long delta){            if(delta<0){              throw new RuntimeException("递减因子必须大于0");          }          return redisTemplate.opsForValue().increment(key, -delta);        }        //================================Map=================================      /**      * HashGet      * @param key 键 不能为null      * @param item 项 不能为null      * @return 值      */      public Object hget(String key,String item){          return redisTemplate.opsForHash().get(key, item);      }      /**      * 获取hashKey对应的所有键值      * @param key 键      * @return 对应的多个键值      */      public Map<Object,Object> hmget(String key){          return redisTemplate.opsForHash().entries(key);      }      /**      * HashSet      * @param key 键      * @param map 对应多个键值      * @return true 成功 false 失败      */      public boolean hmset(String key, Map<String,Object> map){            try {              redisTemplate.opsForHash().putAll(key, map);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }      /**      * HashSet 并设置时间      * @param key 键      * @param map 对应多个键值      * @param time 时间(秒)      * @return true成功 false失败      */      public boolean hmset(String key, Map<String,Object> map, long time){            try {              redisTemplate.opsForHash().putAll(key, map);              if(time>0){                  expire(key, time);              }              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }      /**      * 向一张hash表中放入数据,如果不存在将创建      * @param key 键      * @param item 项      * @param value 值      * @return true 成功 false失败      */      public boolean hset(String key,String item,Object value) {           try {              redisTemplate.opsForHash().put(key, item, value);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }      /**      * 向一张hash表中放入数据,如果不存在将创建      * @param key 键      * @param item 项      * @param value 值      * @param time 时间(秒)  注意:如果已存在的hash表有时间,这里将会替换原有的时间      * @return true 成功 false失败      */      public boolean hset(String key,String item,Object value,long time) {           try {              redisTemplate.opsForHash().put(key, item, value);              if(time>0){                  expire(key, time);              }              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }      /**      * 删除hash表中的值      * @param key 键 不能为null      * @param item 项 可以使多个 不能为null      */      public void hdel(String key, Object... item){            redisTemplate.opsForHash().delete(key,item);      }       /**      * 判断hash表中是否有该项的值      * @param key 键 不能为null      * @param item 项 不能为null      * @return true 存在 false不存在      */      public boolean hHasKey(String key, String item){          return redisTemplate.opsForHash().hasKey(key, item);      }       /**      * hash递增 如果不存在,就会创建一个 并把新增后的值返回      * @param key 键      * @param item 项      * @param by 要增加几(大于0)      * @return      */      public double hincr(String key, String item,double by){            return redisTemplate.opsForHash().increment(key, item, by);      }      /**      * hash递减      * @param key 键      * @param item 项      * @param by 要减少记(小于0)      * @return      */      public double hdecr(String key, String item,double by){            return redisTemplate.opsForHash().increment(key, item,-by);        }        //============================set=============================      /**      * 根据key获取Set中的所有值      * @param key 键      * @return      */      public Set<Object> sGet(String key){          try {              return redisTemplate.opsForSet().members(key);          } catch (Exception e) {              e.printStackTrace();              return null;          }      }      /**      * 根据value从一个set中查询,是否存在      * @param key 键      * @param value 值      * @return true 存在 false不存在      */      public boolean sHasKey(String key,Object value){          try {              return redisTemplate.opsForSet().isMember(key, value);          } catch (Exception e) {              e.printStackTrace();              return false;          }      }      /**      * 将数据放入set缓存      * @param key 键      * @param values 值 可以是多个      * @return 成功个数      */      public long sSet(String key, Object...values) {          try {              return redisTemplate.opsForSet().add(key, values);          } catch (Exception e) {              e.printStackTrace();              return 0;          }      }      /**      * 将set数据放入缓存      * @param key 键      * @param time 时间(秒)      * @param values 值 可以是多个      * @return 成功个数      */      public long sSetAndTime(String key,long time,Object...values) {          try {              Long count = redisTemplate.opsForSet().add(key, values);              if(time>0) expire(key, time);              return count;          } catch (Exception e) {              e.printStackTrace();              return 0;          }      }      /**      * 获取set缓存的长度      * @param key 键      * @return      */      public long sGetSetSize(String key){          try {              return redisTemplate.opsForSet().size(key);          } catch (Exception e) {              e.printStackTrace();              return 0;          }      }      /**      * 移除值为value的      * @param key 键      * @param values 值 可以是多个      * @return 移除的个数      */      public long setRemove(String key, Object ...values) {          try {              Long count = redisTemplate.opsForSet().remove(key, values);              return count;          } catch (Exception e) {              e.printStackTrace();              return 0;          }      }      //===============================list=================================      /**      * 获取list缓存的内容      * @param key 键      * @param start 开始      * @param end 结束  0 到 -1代表所有值      * @return      */      public List<Object> lGet(String key,long start, long end){          try {              return redisTemplate.opsForList().range(key, start, end);          } catch (Exception e) {              e.printStackTrace();              return null;          }      }      /**      * 获取list缓存的长度      * @param key 键      * @return      */      public long lGetListSize(String key){          try {              return redisTemplate.opsForList().size(key);          } catch (Exception e) {              e.printStackTrace();              return 0;          }      }      /**      * 通过索引 获取list中的值      * @param key 键      * @param index 索引  index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推      * @return      */      public Object lGetIndex(String key,long index){          try {              return redisTemplate.opsForList().index(key, index);          } catch (Exception e) {              e.printStackTrace();              return null;          }      }      /**      * 将list放入缓存      * @param key 键      * @param value 值      * @param time 时间(秒)      * @return      */      public boolean lSet(String key, Object value) {          try {              redisTemplate.opsForList().rightPush(key, value);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }      /**      * 将list放入缓存      * @param key 键      * @param value 值      * @param time 时间(秒)      * @return      */      public boolean lSet(String key, Object value, long time) {          try {              redisTemplate.opsForList().rightPush(key, value);              if (time > 0) expire(key, time);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }      /**      * 将list放入缓存      * @param key 键      * @param value 值      * @param time 时间(秒)      * @return      */      public boolean lSet(String key, List<Object> value) {          try {              redisTemplate.opsForList().rightPushAll(key, value);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }      /**      * 将list放入缓存      * @param key 键      * @param value 值      * @param time 时间(秒)      * @return      */      public boolean lSet(String key, List<Object> value, long time) {          try {              redisTemplate.opsForList().rightPushAll(key, value);              if (time > 0) expire(key, time);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }      /**      * 根据索引修改list中的某条数据      * @param key 键      * @param index 索引      * @param value 值      * @return      */      public boolean lUpdateIndex(String key, long index,Object value) {          try {              redisTemplate.opsForList().set(key, index, value);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }       /**      * 移除N个值为value       * @param key 键      * @param count 移除多少个      * @param value 值      * @return 移除的个数      */      public long lRemove(String key,long count,Object value) {          try {              Long remove = redisTemplate.opsForList().remove(key, count, value);              return remove;          } catch (Exception e) {              e.printStackTrace();              return 0;          }      }  }  

测试类

/** *  * @author 刘大磊 * */public class TestRedisSpring {    public static void main(String[] args) {         @SuppressWarnings("resource")         ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-redis.xml");         RedisUtil redisUtil = (RedisUtil) context.getBean("redisUtil");                 /**string**/         redisUtil.set("age", 15);         //设置key为name,value为lpl,10为时间(秒)         redisUtil.set("name", "lpl", 10);         System.out.println(redisUtil.get("age"));         System.out.println("姓名:"+redisUtil.get("name"));         //年龄增加1         redisUtil.incr("age", 1);         System.out.println("年龄增加后"+ redisUtil.get("age"));         //年龄减去1         redisUtil.decr("age", 1);         System.out.println("年龄减去后"+ redisUtil.get("age"));         /****map****/         Map<String,Object> userMap = new HashMap<>();         userMap.put("name", "张三");         userMap.put("age", 16);         redisUtil.hmset("user", userMap);         System.out.println(redisUtil.hmget("user"));    }   }

测试结果:
这里写图片描述

出现问题

项目启动出现的问题:
问题1:Cannot get master address from sentinel running@192.168.251.129:26379. Reason:
解决:
1.关掉防火墙
2.将sentinel.conf配置文件中的保护模式禁用
protected-mode no
3.如果以上解决不了:那么就看你配置的主从节点的bind的ip,一定要注意这个ip是允许访问的ip地址,设置为你客户端的ip即可,我这里设置的是0.0.0.0(允许所有的ip都可以进行访问)。

参考资料

http://blog.csdn.net/u014513883/article/details/77036890?locationNum=9&fps=1
http://blog.csdn.net/asdfsadfasdfsa/article/details/68936867

阅读全文
0 0
原创粉丝点击