spring boot整合reids 然后实现缓存分页(方法之一) 以及RedisTemplate存到reids 里面get 就消失的坑

时间:2023-02-26 12:03:31

业务需求 首页 实现缓存分页

spring boot 整合redis   (我的是2.0.3版本的)

在pom 文件写上依赖包即可

<dependency><!--依赖包-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency> <dependency><!--设置reids配置需要的依赖包-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

在application.yml里面配置 相关的信息  如下图

spring boot整合reids 然后实现缓存分页(方法之一) 以及RedisTemplate存到reids 里面get 就消失的坑

我是安装在本地windows上    host 127.0.0.1  安装在linux上需写上其IP地址

这个时候 就可以使用redis 进行相关操作

redis相关操作(我这里懒得写) 请参考https://blog.csdn.net/xiaochunping9987/article/details/37900361 这篇博客

但是使用 RedisTemplate 存List到redis 里面 get 一次就会消失     最后发现原因是没有对reids 进行相关设置 导致 redis的事务不一致 导致key 取一次就消失

所以强烈建议 先进行redis 配置 在去使用redis 存数据

配置类如下


package com.wechat.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer; /**
* @Auther: wxf
* @Date: 2018/7/10 15:20
*/
@Configuration
@EnableCaching//开启注解
public class RedisConfig {
//缓存管理器 spring boot 2.0后 配置缓存管理器 和2.0以前 不一样 根据自己的版本 配置
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisTemplate) {
return RedisCacheManager.create(redisTemplate);
}
// 以下两种redisTemplate*根据场景选择
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper); template.setValueSerializer(serializer);
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
     //这里设置redis事务一致
template.setEnableTransactionSupport(true);
return template;
}
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(factory);
stringRedisTemplate.setEnableTransactionSupport(true);
return stringRedisTemplate;
}
}

配置完后 就可以进行 reids 相关操作

现在进行 redis的 list分页的相关操作  最后两个方法 是比较重要的


package com.wechat.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @Auther: wxf
* @Date: 2018/7/4 16:43
*/
@Service
public class RedisService {
@Autowired
StringRedisTemplate stringRedisTemplate;
@Resource(name="stringRedisTemplate")
ValueOperations<String, String> valOpsStr; @Autowired
RedisTemplate<Object, Object> redisTemplate;
@Resource(name = "redisTemplate")
ValueOperations<Object, Object> valOpsObj; /**
* 根据指定key获取String
* @param key
* @return
*/
public String getStr(String key){
String s = valOpsStr.get(key); if(s==null){
return "暂无对应的值";
}else{
return s;
}
}
/**
* 设置Str缓存
* @param key
* @param val
*/
public void setStr(String key, String val){
valOpsStr.set(key,val); }
/**
* 删除指定key
* @param key
*/ public void del(String key){
stringRedisTemplate.delete(key);
}
/**
* 根据指定o获取Object
* @param o
* @return
*/
public Object getObj(Object o) {
Object o1 = valOpsObj.get(o);
if(o1==null){
return o1;
}else{
return o1;
}
} /**
* 设置obj缓存
* @param key
* @param value
*/
public void setObj(Object key, Object value){ valOpsObj.set(key, value);
} /**
* 删除Obj缓存
* @param o
*/
public void delObj(Object o){
redisTemplate.delete(o);
} /** 添加对象到redis 里面的list中
* redis中的 list 是双向的 所以添加的时候需要注意
* rightPush 先进先出 leftPush 先进后出 这里 需要注意
* @param key list 对应的key
* @param obj 需要存的对象
*/
public void addList(String key,Object obj){
redisTemplate.opsForList().rightPush(key,obj);
} /**
* opsForList().range(key, start, end); 取范围值 redis里面的list下标从0开始
* 流程 拿到key 对应的list 取 0 到 5 和 mysql的limt 类似 注意下标即可
* 从redis list 里面的获取数据分页
* @param key redis list 对应的key
* @param start 开始下标
* @param end 介绍下标
* @return 返回list给前端
*/
public List getListPage(String key, int start, int end){
return (List)redisTemplate.opsForList().range(key, start, end);
}
}
 

现在开始测试

package com.wechat.controller;
import com.wechat.dao.UserMapper;
import com.wechat.pojo.User;
import com.wechat.service.RedisService;
import com.wechat.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List; /**
* @Auther: wxf
* @Date: 2018/6/28 10:21
*/
@RestController
@Slf4j
public class TestContorller {
@Autowired
UserMapper userMapper;
@Autowired
UserService userService;
@Autowired
RedisService redisService; /**
* 查询所有用户到redis中
* @return
*/
@RequestMapping("/test")
public List<User> selectAll(){
Object user1 = redisService.getObj("user");
if(user1==null){
List<User> users = userMapper.selectAll();
redisService.setObj("user",users);
log.info("没有缓存走数据库");
return users;
}else{
List<User> listUser=(List)user1;
log.info("有缓存");
return listUser;
}
} /**
* 我这里是把 user 信息存到object 中的 所有我要取出来用RedisTemplate 进行对 list的操作
*
*/
@RequestMapping("/add")
public void addTest(){
List<User> user = (List)redisService.getObj("user");
for (User u: user) {
//这里循环user 把每个对象存到 redis中list中
redisService.addList("list",u);
} } /**
* 这里取key 对应的list 那0 到 1 下标的 对象 也就是2个对象
* @return
*/
@RequestMapping("/aaa")
public List aaa(){
return redisService.getListPage("list",0,1);
} }

第一次 进test请求 前端截图如下

spring boot整合reids 然后实现缓存分页(方法之一) 以及RedisTemplate存到reids 里面get 就消失的坑

后台 截图

spring boot整合reids 然后实现缓存分页(方法之一) 以及RedisTemplate存到reids 里面get 就消失的坑

没有缓存  直接走的数据库读数据

第二次请求 test

spring boot整合reids 然后实现缓存分页(方法之一) 以及RedisTemplate存到reids 里面get 就消失的坑

数据一样的

后台 不一样

spring boot整合reids 然后实现缓存分页(方法之一) 以及RedisTemplate存到reids 里面get 就消失的坑

有缓存 现在 只想 add请求

add没有返回值 所以 我们直接进redis 看

spring boot整合reids 然后实现缓存分页(方法之一) 以及RedisTemplate存到reids 里面get 就消失的坑

redis 里面已经多了 key 为list 的list集合数据的数据spring boot整合reids 然后实现缓存分页(方法之一) 以及RedisTemplate存到reids 里面get 就消失的坑

可以看到 只有两条数据了

实现 动态的分页   第一次返回给前端总条数  让前端把或者后端把页码分出来 然后根据前端传过来的页码和一页几条 来动态取list的区间值 实现redis 分页

总结 : spring boot 使用redis 很简单  但是 需要进行redis的相关配置和设置 不然就会出现 存一次 取一次 redis中的key 消失问题

   redis 没有直接分页的方法 现在根据区间值来分页  或许还有更好的方法  知道的大佬 希望在下面留言 谢谢!!!!

spring boot整合reids 然后实现缓存分页(方法之一) 以及RedisTemplate存到reids 里面get 就消失的坑的更多相关文章

  1. Spring Boot整合tk&period;mybatis及pageHelper分页插件及mybatis逆向工程

    Spring Boot整合druid数据源 1)引入依赖 <dependency> <groupId>com.alibaba</groupId> <artif ...

  2. spring boot整合redis&comma;以及设置缓存过期时间

    spring-boot 整合 redis 注:redis服务器要先开启 pom文件: <dependency> <groupId>org.springframework.boo ...

  3. spring boot 整合pagehelper分页插件

    Spring Boot 整合pagehelper分页插件 测试环境: spring boot  版本 2.0.0.M7 mybatis starter 版本  1.3.1 jdk 1.8 ------ ...

  4. 另一种缓存,Spring Boot 整合 Ehcache

    用惯了 Redis ,很多人已经忘记了还有另一个缓存方案 Ehcache ,是的,在 Redis 一统江湖的时代,Ehcache 渐渐有点没落了,不过,我们还是有必要了解下 Ehcache ,在有的场 ...

  5. SpringBoot入门系列(七)Spring Boot整合Redis缓存

    前面介绍了Spring Boot 中的整合Mybatis并实现增删改查,.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/ ...

  6. Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 – <史蒂夫·乔布斯传> 』 运行环境: ...

  7. Spring Boot整合Mybatis并完成CRUD操作

    MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...

  8. Spring Boot整合Elasticsearch

    Spring Boot整合Elasticsearch   Elasticsearch是一个全文搜索引擎,专门用于处理大型数据集.根据描述,自然而然使用它来存储和搜索应用程序日志.与Logstash和K ...

  9. Spring Boot&lpar;十四&rpar;:spring boot整合shiro-登录认证和权限管理

    Spring Boot(十四):spring boot整合shiro-登录认证和权限管理 使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉 ...

随机推荐

  1. 夺命雷公狗—angularjs—23—copy拷贝对象

    copy这在angularjs中是一个拷贝对象的方法: <!DOCTYPE html> <html lang="en" ng-app="myapp&qu ...

  2. Filezilla Server 配置大全

    一个开源.免费的FTP服务端程序,Windows 安装程序(0.9.50 beta):右键另存为. 首先说一下FTP的二种模式:主动模式(port mode)与被动模式(passive mode),网 ...

  3. CORS协议与Spring注解的冲突

    众所周知,HTML5的CORS协议,支持各种request method,远胜于仅支持get方式的JSONP. 但今天,我用CORS协议,却一直不成功. 跨域异常,如图 POST http://10. ...

  4. 【Android】Android 多个APK数据共享

    Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户(Android 系统是基于Linux)的.所以不同APK(用户)间互相访问数据默认是 ...

  5. 容器工厂(原型&amp&semi;单例)

    上一篇讲的是容器工厂的原型. 我们可以不必通过new关键之创建实例,可以直接取容器里面的实例. 我们可以发现,在对比他们的地址值的时候,他们是相同的为true. 如果我们需要的是不一样的呢.也就是有一 ...

  6. php添加pdo&lowbar;mysql&period;so的扩展

    1. 首先进入你下载的php的安装包里找到pdo_mysql文件夹. /usr/local/php-/ext/pdo_mysql ps:有些教程说从http://pecl.php.net/这个网站上下 ...

  7. linux 切割文件的命令

    Head -1000 access.2016.log >> 10000_access.log

  8. 007&period;KVM虚机时间-快照管理

    一 快照管理 1.1 创建快照 [root@kvm-host ~]# virsh snapshot-create vm03-centos6.8 [root@kvm-host ~]# virsh sna ...

  9. Python 为什么要用yield

    可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ?我们先抛开 generator,以一个常见的编程题目来展示 yield 的概 ...

  10. HDU 2710

    Max Factor Time Limit: 2000/1000 MS(Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...