关于springboot使用redis的信息
本篇文章给大家谈谈springboot使用redis,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Springboot使用redis的setnx和getset实现并发锁、分布式锁
- 2、springboot--redis配置
- 3、3分钟搞定springboot整合redis
- 4、SpringBoot连接redis哨兵模式
Springboot使用redis的setnx和getset实现并发锁、分布式锁
在日常开发中,很多业圆搏务场景必须保证原子性。举几个例子:
如果你只有一台服务器,只运行一个Java程序,那么可以使用Java语言自身的一些锁来实现原子性。但如果我们有多台服务器,甚至不同服务器上跑的是不同的语言。那这时候,我们就需要一个跨平台、跨语言的加锁方式。redis就是其中最方便的一种。
使用redis实现并发锁,主要是靠两个redis的命令:setnx和getset。
那我们的设计思路就是:
上面的代码使用了一个RedisService的类薯升,里面主要是简单封装了一数腔老下redis的操作,你可以替换为自己的service。代码如下:
以上代码有任何疑问,可以点击右侧边栏联系作者。收费5毛~交个朋友,欢迎来撩!
版权声明:《Springboot使用redis的setnx和getset实现并发锁、分布式锁》为CoderBBB作者「ʘᴗʘ」的原创文章,转载请附上原文出处链接及本声明。
原文链接:
[img]springboot--redis配置
基于spring.version:4.x;
4.2.4.RELEASE
不同spring版本敏枯世对应的redis版本也不一败慎样,配置桥肢类也会不同。
添加pom:
redis参数配置:RedisConfig.class
redis配置类:RedisConfiguration.class
redis工具类:redisUtils.class
示例使用
3分钟搞定springboot整合redis
不多说直接上代码:
!-- redis --
dependency
groupIdorg.springframework.boot/groupId
artifactIdspring-boot-starter-data-redis/artifactId
exclusions
exclusion
groupIdredis.clients/groupId
artifactIdjedis/artifactId
/exclusion
exclusion
groupIdio.lettuce/groupId
artifactIdlettuce-core/artifactId
/exclusion
/exclusions
/dependency
!-- 添加jedis客户端 --
dependency
groupIdredis.clients/groupId
artifactIdjedis/artifactId
/dependency
!--spring2.0集成redis所需common-pool2--
!-- 必须加上,jedis依赖此 --
dependency
groupIdorg.apache.commons枯卖/groupId
artifactIdcommons-pool2/artifactId
version2.5.0/version
/dependency
!-- 将作为Redis对象序列化器 --
dependency
groupIdcom.alibaba/groupId
artifactIdfastjson/artifactId
version1.2.47/version
/dependency
#Matser的ip地址
redis.hostName=172.16.44.148
#端口号
redis.port=6379
#如果有密码
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
package com.junsi.demo.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import com.junsi.demo.utils.RedisUtil;
import redis.clients.jedis.JedisPoolConfig;
/**
* Redis配置类
* @author pzx
* 2019年6月8日
*/
@Configuration
@PropertySource("classpath: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);
// 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
// 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
// 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
// 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
jedisPoolConfig.setTestOnBorrow(testOnBorrow);
// 在空闲时检查有效性, 默认false
jedisPoolConfig.setTestWhileIdle(testWhileIdle);
return jedisPoolConfig;
}
/**
* @param jedisPoolConfig
* @return
*/
@Bean
public JedisConnectionFactory JedisConnectionFactory(JedisPoolConfig jedisPoolConfig){
JedisConnectionFactory JedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);
//连接池
JedisConnectionFactory.setPoolConfig(jedisPoolConfig);
//IP地址
JedisConnectionFactory.setHostName("172.16.44.148");
//端口号
JedisConnectionFactory.setPort(6379);
//如果Redis设置有密码
//JedisConnectionFactory.setPassword(password);
//客户端超时时间单位是毫秒
JedisConnectionFactory.setTimeout(5000);
return JedisConnectionFactory;
}
/**
* 实例化 RedisTemplate 对象
*
* @return
*/
@Bean
public RedisTemplateString, Object functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplateString, Object redisTemplate = new RedisTemplate();
initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
return redisTemplate;
}
/**
* 设置数据存入 redis 的序列化方式,并开启事务
*
* @param redisTemplate
* @param factory
*/
private void initDomainRedisTemplate(RedisTemplateString, Object 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);
}
@Bean(name = "redisUtil")
public RedisUtil redisUtil(RedisTemplateString, Object redisTemplate) {
RedisUtil redisUtil = new RedisUtil();
redisUtil.setRedisTemplate(redisTemplate);
return redisUtil;
}
}
SpringBoot连接redis哨兵模式
设置 sentinel-26377.conf 的 protected-mode no ;默认是该字段值是yes
修改问题[1]中为redis集群master节点的真实地址;
修改问题[2]中为 bind 0.0.0.0
【注】redisTemplate实际上是对其他哗颂咐框架的的封装,springboot2.x以上底层实现由jedis变为了lettuce。而且lettuce会根据樱亩配置自动选择是否用单机或者哨兵模式。
【1】 Redis 哨兵模式 设置密码
【2】 sentinel搭建redis集群经验总结
【3】SpringBoot2.x使用乱纯Lettuce连接redis哨兵报错:RedisConnectionException: Unable to connect to 127.0.0.1:16379]:
【4】解决使用jedis连接是报DENIED Redis is running in protected mode错误:
关于springboot使用redis和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。