前言
在本篇文章中将SpringBoot整合Redis,使用的是RedisTemplate,分别实现了SpringBoot与redis的单机版、集群版、哨兵模式的整合。
Maven依赖
<dependency> <groupId>org.springframework.boot
groupId> <artifactId>spring-boot-starter-data-redis
artifactId>
dependency>
项目下载及目录结构
修改配置文件
创建一个redis.properties配置文件。
#Matser的ip地址 redis.hostName=192.168.177.128 #端口号 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 #连接的最小空闲时间 默认毫秒(30分钟) redis.minEvictableIdleTimeMillis= #每次释放连接的最大数目,默认3 redis.numTestsPerEvictionRun=1024 #逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 redis.timeBetweenEvictionRunsMillis=30000 #是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 redis.testOnBorrow=true #在空闲时检查有效性, 默认false redis.testWhileIdle=true #redis集群配置 spring.redis.cluster.nodes=192.168.177.128:7001,192.168.177.128:7002,192.168.177.128:7003,192.168.177.128:7004,192.168.177.128:7005,192.168.177.128:7006 spring.redis.cluster.max-redirects=3 #哨兵模式 #redis.sentinel.host1=192.168.177.128 #redis.sentinel.port1=26379 #redis.sentinel.host2=172.20.1.231 #redis.sentinel.port2=26379
封装RedisTemplate的RedisUtil类
import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.util.CollectionUtils; public class RedisUtil {
private RedisTemplate
redisTemplate;
public
void
setRedisTemplate(RedisTemplate
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
SpringBoot整合单机版redis
如果我们只需要整合redis的单机版,只要在redis.conf中进行如下配置
@Configuration @PropertySource("classpath:config/redis.properties") public class RedisConfig {
@Value("${redis.maxIdle}") private Integer maxIdle; @Value("${redis.maxTotal}") private Integer maxTotal; @Value("${redis.maxWaitMillis}") private Integer maxWaitMillis; @Value("${redis.minEvictableIdleTimeMillis}") private Integer minEvictableIdleTimeMillis; @Value("${redis.numTestsPerEvictionRun}") private Integer numTestsPerEvictionRun; @Value("${redis.timeBetweenEvictionRunsMillis}") private long timeBetweenEvictionRunsMillis; @Value("${redis.testOnBorrow}") private boolean testOnBorrow; @Value("${redis.testWhileIdle}") private boolean testWhileIdle; @Value("${spring.redis.cluster.nodes}") private String clusterNodes; @Value("${spring.redis.cluster.max-redirects}") private Integer mmaxRedirectsac; / * JedisPoolConfig 连接池 * @return */ @Bean public JedisPoolConfig jedisPoolConfig() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); // 最大空闲数 jedisPoolConfig.setMaxIdle(maxIdle); // 连接池的最大数据库连接数 jedisPoolConfig.setMaxTotal(maxTotal); // 最大建立连接等待时间 jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); // 逐出连接的最小空闲时间 默认毫秒(30分钟) jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3 jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun); // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); // 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 jedisPoolConfig.setTestOnBorrow(testOnBorrow); // 在空闲时检查有效性, 默认false jedisPoolConfig.setTestWhileIdle(testWhileIdle); return jedisPoolConfig; } / * 单机版配置 * @Title: JedisConnectionFactory * @param @param jedisPoolConfig * @param @return * @return JedisConnectionFactory * @autor lpl * @date 2018年2月24日 * @throws */ @Bean public JedisConnectionFactory JedisConnectionFactory(JedisPoolConfig jedisPoolConfig){ JedisConnectionFactory JedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig); //连接池 JedisConnectionFactory.setPoolConfig(jedisPoolConfig); //IP地址 JedisConnectionFactory.setHostName("192.168.177.128"); //端口号 JedisConnectionFactory.setPort(6379); //如果Redis设置有密码 //JedisConnectionFactory.setPassword(password); //客户端超时时间单位是毫秒 JedisConnectionFactory.setTimeout(5000); return JedisConnectionFactory; } / * 实例化 RedisTemplate 对象 * * @return */ @Bean public RedisTemplate
functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate
redisTemplate =
new RedisTemplate<>(); initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
return redisTemplate; }
/ * 设置数据存入 redis 的序列化方式,并开启事务 * * @param redisTemplate * @param factory */
private
void
initDomainRedisTemplate(RedisTemplate
redisTemplate, RedisConnectionFactory factory) {
//如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String! redisTemplate.setKeySerializer(
new StringRedisSerializer()); redisTemplate.setHashKeySerializer(
new StringRedisSerializer()); redisTemplate.setHashValueSerializer(
new GenericJackson2JsonRedisSerializer()); redisTemplate.setValueSerializer(
new GenericJackson2JsonRedisSerializer());
// 开启事务 redisTemplate.setEnableTransactionSupport(
true); redisTemplate.setConnectionFactory(factory); }
/ * 注入封装RedisTemplate * @Title: redisUtil * @return RedisUtil * @autor lpl * @date 2017年12月21日 * @throws */
@Bean(name =
"redisUtil")
public RedisUtil
redisUtil(RedisTemplate
redisTemplate) { RedisUtil redisUtil =
new RedisUtil(); redisUtil.setRedisTemplate(redisTemplate);
return redisUtil; }
SpringBoot整合Redis-Cluster集群
@Configuration @PropertySource("classpath:config/redis.properties") public class RedisConfig {
@Value("${redis.maxIdle}") private Integer maxIdle; @Value("${redis.maxTotal}") private Integer maxTotal; @Value("${redis.maxWaitMillis}") private Integer maxWaitMillis; @Value("${redis.minEvictableIdleTimeMillis}") private Integer minEvictableIdleTimeMillis; @Value("${redis.numTestsPerEvictionRun}") private Integer numTestsPerEvictionRun; @Value("${redis.timeBetweenEvictionRunsMillis}") private long timeBetweenEvictionRunsMillis; @Value("${redis.testOnBorrow}") private boolean testOnBorrow; @Value("${redis.testWhileIdle}") private boolean testWhileIdle; @Value("${spring.redis.cluster.nodes}") private String clusterNodes; @Value("${spring.redis.cluster.max-redirects}") private Integer mmaxRedirectsac; / * JedisPoolConfig 连接池 * @return */ @Bean public JedisPoolConfig jedisPoolConfig() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); // 最大空闲数 jedisPoolConfig.setMaxIdle(maxIdle); // 连接池的最大数据库连接数 jedisPoolConfig.setMaxTotal(maxTotal); // 最大建立连接等待时间 jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); // 逐出连接的最小空闲时间 默认毫秒(30分钟) jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3 jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun); // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); // 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 jedisPoolConfig.setTestOnBorrow(testOnBorrow); // 在空闲时检查有效性, 默认false jedisPoolConfig.setTestWhileIdle(testWhileIdle); return jedisPoolConfig; } / * Redis集群的配置 * @return RedisClusterConfiguration * @autor lpl * @date 2017年12月22日 * @throws */ @Bean public RedisClusterConfiguration redisClusterConfiguration(){ RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(); //Set
clusterNodes
String[] serverArray = clusterNodes.split(","); Set
nodes =
new HashSet
();
for(String ipPort:serverArray){ String[] ipAndPort = ipPort.split(
":"); nodes.add(
new RedisNode(ipAndPort[
0].trim(),Integer.valueOf(ipAndPort[
1]))); } redisClusterConfiguration.setClusterNodes(nodes); redisClusterConfiguration.setMaxRedirects(mmaxRedirectsac);
return redisClusterConfiguration; }
/ * 配置工厂 * @Title: JedisConnectionFactory * @param @param jedisPoolConfig * @param @return * @return JedisConnectionFactory * @autor lpl * @date 2017年12月22日 * @throws */
@Bean
public JedisConnectionFactory
JedisConnectionFactory(JedisPoolConfig jedisPoolConfig,RedisClusterConfiguration redisClusterConfiguration){ JedisConnectionFactory JedisConnectionFactory =
new JedisConnectionFactory(redisClusterConfiguration,jedisPoolConfig);
return JedisConnectionFactory; }
/ * 实例化 RedisTemplate 对象 * * @return */
@Bean
public RedisTemplate
functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate
redisTemplate =
new RedisTemplate<>(); initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
return redisTemplate; }
/ * 设置数据存入 redis 的序列化方式,并开启事务 * * @param redisTemplate * @param factory */
private
void
initDomainRedisTemplate(RedisTemplate
redisTemplate, RedisConnectionFactory factory) {
//如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String! redisTemplate.setKeySerializer(
new StringRedisSerializer()); redisTemplate.setHashKeySerializer(
new StringRedisSerializer()); redisTemplate.setHashValueSerializer(
new GenericJackson2JsonRedisSerializer()); redisTemplate.setValueSerializer(
new GenericJackson2JsonRedisSerializer());
// 开启事务 redisTemplate.setEnableTransactionSupport(
true); redisTemplate.setConnectionFactory(factory); }
/ * 注入封装RedisTemplate * @Title: redisUtil * @return RedisUtil * @autor lpl * @date 2017年12月21日 * @throws */
@Bean(name =
"redisUtil")
public RedisUtil
redisUtil(RedisTemplate
redisTemplate) { RedisUtil redisUtil =
new RedisUtil(); redisUtil.setRedisTemplate(redisTemplate);
return redisUtil; }
SpringBoot整合Redis的哨兵模式
@Configuration @PropertySource("classpath:config/redis.properties") public class RedisConfig {
@Value("${redis.maxIdle}") private Integer maxIdle; @Value("${redis.maxTotal}") private Integer maxTotal; @Value("${redis.maxWaitMillis}") private Integer maxWaitMillis; @Value("${redis.minEvictableIdleTimeMillis}") private Integer minEvictableIdleTimeMillis; @Value("${redis.numTestsPerEvictionRun}") private Integer numTestsPerEvictionRun; @Value("${redis.timeBetweenEvictionRunsMillis}") private long timeBetweenEvictionRunsMillis; @Value("${redis.testOnBorrow}") private boolean testOnBorrow; @Value("${redis.testWhileIdle}") private boolean testWhileIdle; @Value("${spring.redis.cluster.nodes}") private String clusterNodes; @Value("${spring.redis.cluster.max-redirects}") private Integer mmaxRedirectsac; / * JedisPoolConfig 连接池 * @return */ @Bean public JedisPoolConfig jedisPoolConfig() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); // 最大空闲数 jedisPoolConfig.setMaxIdle(maxIdle); // 连接池的最大数据库连接数 jedisPoolConfig.setMaxTotal(maxTotal); // 最大建立连接等待时间 jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); // 逐出连接的最小空闲时间 默认毫秒(30分钟) jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3 jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun); // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); // 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 jedisPoolConfig.setTestOnBorrow(testOnBorrow); // 在空闲时检查有效性, 默认false jedisPoolConfig.setTestWhileIdle(testWhileIdle); return jedisPoolConfig; } / * 配置redis的哨兵 * @return RedisSentinelConfiguration * @autor lpl * @date 2017年12月21日 * @throws */ @Bean public RedisSentinelConfiguration sentinelConfiguration(){ RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration(); //配置matser的名称 RedisNode redisNode = new RedisNode(hostName, port); redisNode.setName("mymaster"); redisSentinelConfiguration.master(redisNode); //配置redis的哨兵sentinel RedisNode senRedisNode = new RedisNode(senHost1,senPort1); Set
redisNodeSet =
new HashSet<>(); redisNodeSet.add(senRedisNode); redisSentinelConfiguration.setSentinels(redisNodeSet);
return redisSentinelConfiguration; }
/ * 配置工厂 * @param jedisPoolConfig * @return */
@Bean
public JedisConnectionFactory
jedisConnectionFactory(JedisPoolConfig jedisPoolConfig,RedisSentinelConfiguration sentinelConfig) { JedisConnectionFactory jedisConnectionFactory =
new JedisConnectionFactory(sentinelConfig,jedisPoolConfig);
return jedisConnectionFactory; }
/ * 实例化 RedisTemplate 对象 * * @return */
@Bean
public RedisTemplate
functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate
redisTemplate =
new RedisTemplate<>(); initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
return redisTemplate; }
/ * 设置数据存入 redis 的序列化方式,并开启事务 * * @param redisTemplate * @param factory */
private
void
initDomainRedisTemplate(RedisTemplate
redisTemplate, RedisConnectionFactory factory) {
//如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String! redisTemplate.setKeySerializer(
new StringRedisSerializer()); redisTemplate.setHashKeySerializer(
new StringRedisSerializer()); redisTemplate.setHashValueSerializer(
new GenericJackson2JsonRedisSerializer()); redisTemplate.setValueSerializer(
new GenericJackson2JsonRedisSerializer());
// 开启事务 redisTemplate.setEnableTransactionSupport(
true); redisTemplate.setConnectionFactory(factory); }
/ * 封装RedisTemplate * @Title: redisUtil * @return RedisUtil * @autor lpl * @date 2017年12月21日 * @throws */
@Bean(name =
"redisUtil")
public RedisUtil
redisUtil(RedisTemplate
redisTemplate) { RedisUtil redisUtil =
new RedisUtil(); redisUtil.setRedisTemplate(redisTemplate);
return redisUtil; }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218536.html原文链接:https://javaforall.net
