Springboot整合Redis-sentinel哨兵模式集群
2019-02-26 22:23
881 查看
Springboot整合Redis-sentinel哨兵模式集群
近日在项目中整合redis缓存,经过多日研究测试终于成功了。特留存此博客。
1. pom.xml 添加Redis依赖
<!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2. application.yml 添加Redis配置
redis: ##单机 # host: 172.21.0.211 # port: 6379 ## ##集群 cluster: nodes: - 172.21.0.211:7000 - 172.21.0.211:7001 - 172.21.0.211:7002 - 172.21.0.211:7003 - 172.21.0.211:7004 ##哨兵 sentinel: master: mymaster nodes: - 172.21.0.211:7005 - 172.21.0.211:7006 - 172.21.0.211:7007 ## jedis: pool: ### 连接池最大连接数(使用负值表示没有限制) max-active: 9 ### 连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1 ### 连接池中的最大空闲连接 max-idle: 9 ### 连接池中的最小空闲连接 min-idle: 0 ### Redis数据库索引(默认为0) database: 0 ### 连接超时时间(毫秒) timeout: 60000
3. 新增RedisTemplate配置类
SpringBoot自动帮我们在容器中生成了RedisTemplate和StringRedisTemplate。但是,这个RedisTemplate的泛型是<Object,Object>,写代码不方便,需要写好多类型转换的代码;我们需要一个泛型为<String,Object>形式的RedisTemplate。并且,这个RedisTemplate没有设置数据存在Redis时,key及value的序列化方式。所以我们需要添加RedisConfig.java配置类来配置key及value的序列化方式。
package org.bachelor.manager.redis; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; /** * * redis配置类 * */ @Configuration public class RedisConfig { @Bean @SuppressWarnings("all") public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); redisTemplate.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // key采用String的序列化方式 redisTemplate.setKeySerializer(stringRedisSerializer); // hash的key也采用String的序列化方式 redisTemplate.setHashKeySerializer(stringRedisSerializer); // valuevalue采用jackson序列化方式 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // hash的value采用jackson序列化方式 redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); redisTemplate.afterPropertiesSet(); return redisTemplate; } }
4. 新增Redis工具类
直接用RedisTemplate操作Redis,需要很多行代码,因此直接封装好一个RedisUtils,这样写代码更方便点。
package org.bachelor.manager.redis; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; /** * Redis工具类 * * @author 共通组 * @date 2019年2月25日 */ @Component public final class RedisUtil { @Autowired private RedisTemplate<String, Object> 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 delta 要增加几(大于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 delta 要减少几(小于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; } } }
5. RedisUtil工具类使用示例
package org.bachelor.manager.controller; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.bachelor.manager.redis.RedisUtil; import org.bachelor.manager.vo.TbReqheadVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import com.google.gson.Gson; import io.swagger.annotations.ApiOperation; /** * RedisTest */ @RestController public class RedisTest { @Autowired private RedisUtil redisUtil; @ApiOperation(value = "Test", notes = "Test") @GetMapping(value = "/Testinterface") public void findInterfaceByPage() { redisUtil.set("String1", "str"); System.out.println("String1: " + redisUtil.get("String1")); redisUtil.set("String2", "str2", 60 * 2); System.out.println("String2: " + redisUtil.get("String2")); Map<String, Object> map = new HashMap<String, Object>(); map.put("int1", 1); map.put("int2", 2); map.put("int3", 3); redisUtil.set("map1", map, 60 * 2); System.out.println("map1: " + redisUtil.get("map1")); TbReqheadVO vo = new TbReqheadVO(); vo.setInterfaceId(123); vo.setDefaultValue("456"); redisUtil.set("vo1", vo, 60 * 2); System.out.println("vo1: " + new Gson().toJson(redisUtil.get("vo1"))); TbReqheadVO vo2 = new TbReqheadVO(); vo2.setInterfaceId(789); vo2.setDefaultValue("000"); List<TbReqheadVO> listVo = new ArrayList<TbReqheadVO>(); listVo.add(vo); listVo.add(vo2); redisUtil.set("listVo1", listVo, 60 * 2); System.out.println("listVo1: " + new Gson().toJson(redisUtil.get("listVo1"))); } }
输出结果:
String1: str String2: str2 map1: {int2=2, int1=1, int3=3} vo1: {"interfaceId":123,"defaultValue":"456"} listVo1: [{"interfaceId":123,"defaultValue":"456"},{"interfaceId":789,"defaultValue":"000"}]
工具类参考: https://www.geek-share.com/detail/2740402820.html.
小女子写的第一篇博客,经验有限,有问题还请各位大神多多指点。
每日进步一点点,菜鸟也能变大神~~~
相关文章推荐
- spring配置单Redis,Sentinel 哨兵模式,Redis Cluster集群,Redis Sharding集群
- springboot 整合 redis 主从同步 sentinel哨兵 实现商品抢购秒杀
- redis集群之哨兵模式高可用整合spring的配置使用及spring缓存机制和redis的结合
- 基于哨兵【sentinel】模式的redis服务集群并与spring集成
- Redis-sentinel哨兵模式集群方案配置
- springBoot整合redis集群
- Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】
- SpringBoot整合Redis集群
- redis sentinel哨兵模式集群搭建教程
- spring整合redis集群的相关配置(senlient模式)
- springboot+shiro+redis(集群redis版)整合教程
- Spring Boot2.0之 整合Redis集群
- springboot整合redis哨兵方式配置
- SpringBoot整合Redis集群
- 基于哨兵(Sentinel)模式搭建Redis集群搭建
- spring boot整合redis(单机+集群)
- Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】
- Spring+SpringMVC做Redis集群(Sentinel模式)
- SpringBoot整合redis哨兵主从服务
- 架构分布式____Redis集群架构(sentinel哨兵模式集群方案)