SpringBoot 整合 Redis 哨兵机制_02
文章目录
- 1. maven依赖
- 2. RedisConfig
- 3. RedisUtils
- 4. application.yml
- 5. 单元测试
- 6. redis客户端查看
1. maven依赖
<!--redis Start--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- redis lettuce 依赖commons-pool --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><!--redis End-->
2. RedisConfig
package com.gblfy.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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;/**** 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.setEnableTransactionSupport(true);redisTemplate.afterPropertiesSet();return redisTemplate;}
}
3. RedisUtils
package com.gblfy.utils;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;/*** Redis工具类** @author 共通组* @date 2019年2月25日*/
@Component
public final class RedisUtils {@Autowiredprivate 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;}}
}
4. application.yml
server:port: 80
spring:profiles:active: sentinel
application-sentinel.yml
#哨兵
spring:redis:sentinel:master: mymasternodes:- 192.168.0.114:26379- 192.168.0.114:26380- 192.168.0.114:26381lettuce:pool:### 最大连接数(使用负值表示没有限制) 默认8max-active: 8### 最小空闲连接 默认8min-idle: 0### 连接池中的最大空闲连接 默认8max-idle: 8### 连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1ms### 连接超时时间(毫秒)timeout: 60000mspassword:
5. 单元测试
package com.gblfy;import com.gblfy.entity.User;
import com.gblfy.utils.RedisUtils;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class RedisApplicationTests {@Autowiredprivate RedisUtils redisUtils;@Testpublic void contextLoads() {System.out.println("测试单元测试是否可用!");}/*** 存储String类型 key value*/@Testpublic void testStr() {redisUtils.set("String1", "str");log.info("String1: {}", redisUtils.get("String1"));}
}
6. redis客户端查看
SpringBoot 整合 Redis 哨兵机制_02相关推荐
- SpringBoot 整合 Redis 哨兵机制_01
文章目录 一.哨兵简述 1. 哨兵能解决和未能解决的问题 2. 哨兵的作用 3. 哨兵的主要配置 4. 哨兵综述 二.搭建哨兵 2.1. 思路分析 2.2. 节点分布总览 2.3. 哨兵配置 2.4. ...
- springboot整合Redis哨兵
1.1SpringBoot整合Redis哨兵 1.1.1入门案例 /*** 哨兵测试* 1.配置redis的节点数据集合* 2.利用哨兵机制连接redis节点.* 3.用户通过哨兵 实现缓存操作.* ...
- springBoot整合redis单节点、redis哨兵、redis集群配置及redisClient区别
springBoot整合redis单节点.redis哨兵.redis集群配置,redisClient jedis lettuce 区别? 1.springboot 整合redis单机模式: sprin ...
- Redis主从复制Redis哨兵机制Springboot整合哨兵
目录 一.Redis主从复制 full resync(全量复制) partial resync(增量复制) 二.Redis主从复制配置 三.哨兵机制原理 每个 Sentinel 都需要定期执行的任务 ...
- SpringBoot整合Redis缓存
SpringBoot整合Redis缓存 一.缓存概念知识 1.是什么缓存 2.缓存的优缺点 3.为什么使用缓存 二.Redis概念知识 1.Redis简介 2.为什么用Redis作为缓存 3.Redi ...
- Redis学习(含 Springboot 整合 Redis)
Redis NoSQL (not only sql) 在现代的计算系统上每天网络上都会产生庞大的数据量. 这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理. 1970年 E.F.Codd ...
- SpringBoot整合Redis+Redis缓存应用+Redis实现Session共享+...
一.SpringBoot整合Redis 1.导入依赖 <!--存在Redis依赖--> <dependency><groupId>org.springframewo ...
- SpringBoot(六):SpringBoot整合Redis
From: https://blog.csdn.net/plei_yue/article/details/79362372 前言 在本篇文章中将SpringBoot整合Redis,使用的是RedisT ...
- SpringBoot整合redis实现发布订阅模式
Redis的发布订阅模式 发布订阅(Pub/Sub):目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接 ...
最新文章
- mysql常见问题处理-插入数据error code:1206
- Codeforces 833B 题解(DP+线段树)
- labelme的 json格式转化成自己的json格式
- Ubuntu创始人谈Windows 7、Chrome OS
- flink on yarn模式下释放flink占用yarn的资源
- 我们正处在“后开源”时代?
- ubuntu7.10中的apache的一些设置
- 8g ubuntu 树莓派4b_树莓派4B安装 Ubuntu 20.04 LTS
- ad域管理与维护_windows server2012创建AD域服务器
- 这个“忽悠”马云10亿的男人,还了阿里5000亿,今天当选为院士!
- 动词变名词的变化规则_动词accept变成名词-tion?那就错……多名词变化规律如下总结...
- VeryCD关闭音乐视频下载视频网站的正版化历程
- 301. 删除无效的括号【我亦无他唯手熟尔】
- python语言程序代码保存在_《计算机二级Python语言程序设计考试》第5章:函数和代码复用...
- 小程序内部如何跳转公众号
- 老生常谈之防止刷新重复提交表单。
- Ethereum非同质化通证(NFT)的铸造与展示
- 温度自动控制系统matlab,某温度控制系统的MATLAB仿真
- adlds文件服务器,Windows Server 2008:AD LDS应用攻略
- 室内外实时一体化建模
热门文章
- 数学江湖中的“独孤九剑”
- (pytorch-深度学习)语言模型-学习笔记
- (pytorch-深度学习系列)pytorch构造深度学习模型-学习笔记
- android filehelper,为AndroidStudio开发mvp插件(MvpHelper)
- 计算矩阵中全1子矩阵的个数
- makefile例子(经典)
- spark异常 - Null value appeared in non-nullable field
- 基于海量日志和时序数据的质量建设最佳实践
- 基于 MySQL + Tablestore 分层存储架构的大规模订单系统实践-架构篇
- 如何玩转 WebGL 并行计算