springboot redis集群 boot 集成redis,出错,求解答

主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
CSDN &《程序员》编辑/记者,投稿&纠错等事宜请致邮
你只管努力,剩下的交给时光!
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:。个人QQ群:、
个人大数据技术博客:
SpringBoot非官方教程 | 第九篇: springboot整合RedisSpringBoot开发详解(十一) -- Redis在SpringBoot中的整合 - 尼斯湖水鬼的博客 - CSDN博客
SpringBoot开发详解(十一) -- Redis在SpringBoot中的整合
spring boot
各位小伙伴,好久不见。最近一直都没有更新,因为公司的项目一直在抓进度,又是表结构更替,又是重构,还要迭代需求。感觉项目都快做烂了……所以一个公司的好坏真的和领导者有极大的关系,许多程序员真的只是三年程序员,谢三年代码就去转岗管理了,最后导致技术水平有限,管理水平又跟不上。好,我废话少说,开始这次的内容,这次我们聊一下NoSql数据库Redis在SpringBoot中的使用。
Redis在Spring Boot中的集成
Maven依赖引入:
Redis是一个基于内存的日志型可持久化的缓存数据库,保存形式为key-value格式。还不清楚的小伙伴可以先学习一下,Redis在现在的开发中可是很常用的哦。
首先,我们先在maven中引入相关依赖:
&org.springframework.boot&
&spring-boot-starter-data-redis&
之后我们把Redis的相关配置写入yml,这里建议根据之前不同的环境写入不同的配置,Redis默认使用的端口是6379,通常Redis默认使用0号数据库,默认共有16个数据库:
#redis配置
数据库索引
database: 0
服务器地址
host: 127.0.0.1
服务器连接端口
port: 6379
最大连接数(负值表示没有限制)
max-active: 8
最大阻塞等待时间(负值表示没有限制)
max-wait: 1
最大空闲链接
max-idle: 8
最小空闲链接
min-idle: 0
链接超时时间(毫秒)
timeout: 0
此时,我们已经完成了Redis的所有配置,可以直接来使用了,我们写一个测试用例来测试一下:
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class RedisAutoTest {
@Autowired
private StringRedisTemplate stringRedisT
public void save(){
stringRedisTemplate.opsForValue().set("zzp","big z");
Assert.assertEquals("big z",stringRedisTemplate.opsForValue().get("zzp"));
OK,没有问题,同样的我们使用rdm打开看下是否成功存入了。
OK,也没有任何问题。
在这个测试用例中我们使用的StringRedisTemplate,因为我们之前说过redis使用key-value格式保存数据,这里其实保存的就是
public class UserInfo implements Serializable{
private static final long serialVersionUID = 1L;
private String nickN
@Max(value = 999999,message = "超过最大数值")
@Min(value = 000000,message = "密码设定不正确")
private String passW
public UserInfo() {
public String toString() {
return "UserInfo{" +
"tel='" + tel + '\'' +
", nickName='" + nickName + '\'' +
", passWord='" + passWord + '\'' +
public UserInfo(String tel, String nickName, String passWord) {
this.tel =
this.nickName = nickN
this.passWord = passW
public String getTel() {
public void setTel(String tel) {
this.tel =
public String getNickName() {
return nickN
public void setNickName(String nickName) {
this.nickName = nickN
public String getPassWord() {
return passW
public void setPassWord(String passWord) {
this.passWord = passW
然后我们驶向下序列化接口:
public class RedisObjectSerializer implements RedisSerializer&Object& {
private Converter&Object,byte[]& serializer = new SerializingConverter();
private Converter&byte[],Object& deserializer = new DeserializingConverter();
static final byte[] EMPTY_ARRAY = new byte[0];
public byte[] serialize(Object o) throws SerializationException {
if(o == null){
return EMPTY_ARRAY;
return serializer.convert(o);
}catch (Exception e){
return EMPTY_ARRAY;
public Object deserialize(byte[] bytes) throws SerializationException {
if(isEmpty(bytes)){
return null;
return deserializer.convert(bytes);
}catch (Exception e){
throw new SerializationException("Can not deserializer",e);
private boolean isEmpty(byte[] data){
return (data == null || data.length == 0);
之后我们在将RedisTemplate重新配置下,使用我们自己的序列化对象:
@Configuration
public class RedisConfig {
JedisConnectionFactory jedisConnectionFactory(){
new JedisConnectionFactory();
* 存入对象序列化信息
public RedisTemplate&String,UserInfo& redisSerizlizerObj(){
RedisTemplate&String,UserInfo& redisTemplate = new RedisTemplate&String,UserInfo&();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new RedisObjectSerializer());
return redisT
完成该工作后,我们可以继续写测试用例来验证我们的相关配置了
@Autowired
private RedisTemplate&String,UserInfo& T
public void testobjSerializer() throws InterruptedException {
UserInfo user = new UserInfo("111111","snow","112358");
Template.opsForValue().set("User:snow",user);
Assert.assertEquals(true,redisTemplate.hasKey("User:snow"));
测试结果一切正常,我们同样通过rdm可以看到我们所存入的序列化对象:
但是,将每一个对象都写一个RedisTemplate未免太过麻烦,其实我们开发中,会存入对象的toString方法。所以我将存入对象ToString方法的代码页给到大家,大家可以根据自己的需要来使用:
* 存入对象tostring后的信息
public RedisTemplate&String,String& redisTemplate(){
RedisTemplate&String,String& redisTemplate = new StringRedisTemplate();
redisTemplate.setConnectionFactory(jedisConnectionFactory());Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisT
同样通过测试用例来验证可以发现,可以使用:
public void testobj() throws InterruptedException {
UserInfo user = new UserInfo("","snow","112358");
ValueOperations&String,UserInfo& operations = redisTemplate.opsForValue();
operations.set("User:zzp",user);
Thread.sleep(1000);
operations.set("User:zzq",user);
Thread.sleep(1000);
Assert.assertEquals(true,redisTemplate.hasKey("User:zzp"));
Assert.assertEquals(true,redisTemplate.hasKey("User:zzq"));
Redis的使用其实远远不止这些,包括事物等都是可以通过Redis处理的。一般开发中我们会使用Jedis对Redis进行操作,可是由于这时介绍Redis在SpringBoot中集成的,所以就不再多言了,如果有想知道的小伙伴可以告诉我,我在来说说如何使用Jedis操作。
以上所有的代码我已经上传到GitHub
如果心急的小伙伴也可以去clone我已经完成的项目,这个项目中把一些常用功能都写了,并且都写注释啦!!!也希望大家能帮我点个赞哦~~~
我的热门文章> 博客详情
& & & & redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。& &&
1.导入jar包依赖
&dependency&
&&&&&&groupId&org.springframework.boot&/groupId&
&&&&&&artifactId&spring-boot-starter-redis&/artifactId&
&/dependency&
2.相应的配置
#&REDIS&(RedisProperties)
#spring.redis.database=
spring.redis.host=
spring.redis.password=
spring.redis.port=6379&
spring.redis.pool.max-idle=100&
spring.redis.pool.min-idle=1
spring.redis.pool.max-active=1000
spring.redis.pool.max-wait=-1
server.port=8081
3.编写cache管理类
package&com.
import&java.lang.reflect.M
import&org.springframework.cache.CacheM
import&org.springframework.cache.annotation.CachingConfigurerS
import&org.springframework.cache.annotation.EnableC
import&org.springframework.cache.interceptor.KeyG
import&org.springframework.context.annotation.B
import&org.springframework.context.annotation.C
import&org.springframework.data.redis.cache.RedisCacheM
import&org.springframework.data.redis.connection.RedisConnectionF
import&org.springframework.data.redis.core.RedisT
import&org.springframework.data.redis.core.StringRedisT
import&org.springframework.data.redis.serializer.Jackson2JsonRedisS
import&com.fasterxml.jackson.annotation.JsonAutoD
import&com.fasterxml.jackson.annotation.PropertyA
import&com.fasterxml.jackson.databind.ObjectM
&&&&&*&缓存管理(注解用)
&&&&&*&@author&Administrator
&&&&@Configuration
&&&&@EnableCaching
&&&&public&class&CacheService&extends&CachingConfigurerSupport&{
&&&&&&&&&&&&
&&&&&&&&/**
&&&&&*&生成key的策略
&&&&&*&@return
&&&&public&KeyGenerator&keyGenerator()&{
&&&&&&&&return&new&KeyGenerator()&{
&&&&&&&&&&&&@Override
&&&&&&&&&&&&public&Object&generate(Object&target,&Method&method,&Object...&params)&{
&&&&&&&&&&&&&&&&StringBuilder&sb&=&new&StringBuilder();
&&&&&&&&&&&&&&&&sb.append(target.getClass().getName());
&&&&&&&&&&&&&&&&sb.append(method.getName());
&&&&&&&&&&&&&&&&for&(Object&obj&:&params)&{
&&&&&&&&&&&&&&&&&&&&sb.append(obj.toString());
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&return&sb.toString();
&&&&&&&&&&&&}
&&&&&&&&};
&&&&&*&管理缓存
&&&&&*&@param&redisTemplate
&&&&&*&@return
&&&&@SuppressWarnings("rawtypes")
&&&&public&CacheManager&cacheManager(RedisTemplate&redisTemplate)&{
&&&&&&&&RedisCacheManager&rcm&=&new&RedisCacheManager(redisTemplate);
&&&&&&&&//设置缓存过期时间
&&&&&&&&//&rcm.setDefaultExpiration(60);//秒
&&&&&&&&//设置value的过期时间
&&&&&&&&Map&String,Long&&map=new&HashMap();
&&&&&&&&map.put("test",60L);
&&&&&&&&rcm.setExpires(map);
&&&&&&&&return&
&&&&&*&RedisTemplate配置
&&&&&*&@param&factory
&&&&&*&@return
&&&&public&RedisTemplate&String,&String&&redisTemplate(RedisConnectionFactory&factory)&{
&&&&&&&&StringRedisTemplate&template&=&new&StringRedisTemplate(factory);
&&&&&&&&Jackson2JsonRedisSerializer&jackson2JsonRedisSerializer&=&new&Jackson2JsonRedisSerializer(Object.class);
&&&&&&&&ObjectMapper&om&=&new&ObjectMapper();
&&&&&&&&om.setVisibility(PropertyAccessor.ALL,&JsonAutoDetect.Visibility.ANY);
&&&&&&&&om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
&&&&&&&&jackson2JsonRedisSerializer.setObjectMapper(om);
&&&&&&&&template.setValueSerializer(jackson2JsonRedisSerializer);//如果key是String 需要配置一下StringSerializer,不然key会乱码 /XX/XX
&&&&&&&&template.afterPropertiesSet();
&&&&&&&&return&
4.常用的操作redis的方法
package&com.
import&java.io.S
import&java.util.S
import&java.util.concurrent.TimeU
import&org.apache.log4j.L
import&org.springframework.beans.factory.annotation.A
import&org.springframework.data.redis.core.RedisT
import&org.springframework.data.redis.core.ValueO
import&org.
&*&redicache&工具类
@SuppressWarnings("unchecked")
@Component
public&class&RedisUtil&{
@SuppressWarnings("rawtypes")
@Autowired
private&RedisTemplate&redisT
&*&批量删除对应的value
&*&@param&keys
public&void&remove(final&String...&keys)&{
for&(String&key&:&keys)&{
remove(key);
&*&批量删除key
&*&@param&pattern
public&void&removePattern(final&String&pattern)&{
Set&Serializable&&keys&=&redisTemplate.keys(pattern);
if&(keys.size()&&&0)
redisTemplate.delete(keys);
&*&删除对应的value
&*&@param&key
public&void&remove(final&String&key)&{
if&(exists(key))&{
redisTemplate.delete(key);
&*&判断缓存中是否有对应的value
&*&@param&key
&*&@return
public&boolean&exists(final&String&key)&{
return&redisTemplate.hasKey(key);
&*&读取缓存
&*&@param&key
&*&@return
public&Object&get(final&String&key)&{
Object&result&=&
ValueOperations&Serializable,&Object&&operations&=&redisTemplate.opsForValue();
result&=&operations.get(key);
&*&写入缓存
&*&@param&key
&*&@param&value
&*&@return
public&boolean&set(final&String&key,&Object&value)&{
boolean&result&=&
ValueOperations&Serializable,&Object&&operations&=&redisTemplate.opsForValue();
operations.set(key,&value);
}&catch&(Exception&e)&{
e.printStackTrace();
&*&写入缓存
&*&@param&key
&*&@param&value
&*&@return
public&boolean&set(final&String&key,&Object&value,&Long&expireTime)&{
boolean&result&=&
ValueOperations&Serializable,&Object&&operations&=&redisTemplate.opsForValue();
operations.set(key,&value);
redisTemplate.expire(key,&expireTime,&TimeUnit.SECONDS);
}&catch&(Exception&e)&{
e.printStackTrace();
5.在方法前面加上缓存
@RequestMapping("/")
@Cacheable(value="test")
public&String&getSessionId(HttpSession&session){
redisUtil.set("123",&"测试");
System.out.println("进入了方法");
String&string=&redisUtil.get("123").toString();
@Cacheable参数
value &指明缓存将被存到什么地方。
key & &&Spring默认使用被@Cacheable注解的方法的签名来作为key
condition = "#age & 25"&数将指明方法的返回结果是否被缓存。
本文地址(防爬虫不标注来源):
人打赏支持
public class PageImplBean extends PageImpl {
private static final long serialVersionUID = 1L;
private int totalP
private int numberOfE
private long totalE
private boolean previousP
private boolean firstP
private boolean nextP
private boolean lastP
public PageImplBean() {
super(new ArrayList());
public int getNumber() {
public void setNumber(int number) {
this.number =
public int getSize() {
public void setSize(int size) {
this.size =
public int getTotalPages() {
return totalP
public void setTotalPages(int totalPages) {
this.totalPages = totalP
public int getNumberOfElements() {
return numberOfE
public void setNumberOfElements(int numberOfElements) {
this.numberOfElements = numberOfE
public long getTotalElements() {
return totalE
public void setTotalElements(long totalElements) {
this.totalElements = totalE
public boolean isPreviousPage() {
return previousP
public void setPreviousPage(boolean previousPage) {
this.previousPage = previousP
public boolean isFirstPage() {
return firstP
public void setFirstPage(boolean firstPage) {
this.firstPage = firstP
public boolean isNextPage() {
return nextP
public void setNextPage(boolean nextPage) {
this.nextPage = nextP
public boolean isLastPage() {
return lastP
public void setLastPage(boolean lastPage) {
this.lastPage = lastP
public List getContent() {
public void setContent(List content) {
this.content =
public Sort getSort() {
public void setSort(Sort sort) {
this.sort =
public PageImpl pageImpl() {
return new PageImpl(getContent(), new PageRequest(getNumber(),
getSize(), getSort()), getTotalElements());
结果报了Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Reque nested exception is java.lang.ClassCastException: org.springframework.data.domain.PageImpl cannot be cast to com.absurd.core.model.PageImplBean] with root cause
这是springBoot的配置,不是spring xml配置的方式。
引用来自“王念博客”的评论这是springBoot的配置,不是spring xml配置的方式。你的意思是 他默认会去application.properties去寻找对应的redis的属性,比如host,timeout,然后注入到redis吗?
引用来自“王念博客”的评论这是springBoot的配置,不是spring xml配置的方式。引用来自“Kevin_Zhan”的评论你的意思是 他默认会去application.properties去寻找对应的redis的属性,比如host,timeout,然后注入到redis吗?差不多就是这个意思,你如果加了spring-boot-starter实现的包,再启动Springboot项目就会去application.properties里找对应的配置初始化第三方包的配置,如果你之前不了解Springboot的话可能跑个简单的例子就明白啦。
引用来自“absurd717”的评论结果报了Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Reque nested exception is java.lang.ClassCastException: org.springframework.data.domain.PageImpl cannot be cast to com.absurd.core.model.PageImplBean] with root cause哥们、请教一下、这个问题你解决了没有?
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥

我要回帖

更多关于 springboot redis集群 的文章

 

随机推荐