spring boot整合reids 然后实现缓存分页(方法之一) 以及RedisTemplate存到reids 里面get 就消失的坑
业务需求 首页 实现缓存分页
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里面配置 相关的信息 如下图
我是安装在本地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请求 前端截图如下
后台 截图
没有缓存 直接走的数据库读数据
第二次请求 test
数据一样的
后台 不一样
有缓存 现在 只想 add请求
add没有返回值 所以 我们直接进redis 看
redis 里面已经多了 key 为list 的list集合数据的数据
可以看到 只有两条数据了
实现 动态的分页 第一次返回给前端总条数 让前端把或者后端把页码分出来 然后根据前端传过来的页码和一页几条 来动态取list的区间值 实现redis 分页
总结 : spring boot 使用redis 很简单 但是 需要进行redis的相关配置和设置 不然就会出现 存一次 取一次 redis中的key 消失问题
redis 没有直接分页的方法 现在根据区间值来分页 或许还有更好的方法 知道的大佬 希望在下面留言 谢谢!!!!
spring boot整合reids 然后实现缓存分页(方法之一) 以及RedisTemplate存到reids 里面get 就消失的坑的更多相关文章
- Spring Boot整合tk.mybatis及pageHelper分页插件及mybatis逆向工程
Spring Boot整合druid数据源 1)引入依赖 <dependency> <groupId>com.alibaba</groupId> <artif ...
- spring boot整合redis,以及设置缓存过期时间
spring-boot 整合 redis 注:redis服务器要先开启 pom文件: <dependency> <groupId>org.springframework.boo ...
- spring boot 整合pagehelper分页插件
Spring Boot 整合pagehelper分页插件 测试环境: spring boot 版本 2.0.0.M7 mybatis starter 版本 1.3.1 jdk 1.8 ------ ...
- 另一种缓存,Spring Boot 整合 Ehcache
用惯了 Redis ,很多人已经忘记了还有另一个缓存方案 Ehcache ,是的,在 Redis 一统江湖的时代,Ehcache 渐渐有点没落了,不过,我们还是有必要了解下 Ehcache ,在有的场 ...
- SpringBoot入门系列(七)Spring Boot整合Redis缓存
前面介绍了Spring Boot 中的整合Mybatis并实现增删改查,.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/ ...
- Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 – <史蒂夫·乔布斯传> 』 运行环境: ...
- Spring Boot整合Mybatis并完成CRUD操作
MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...
- Spring Boot整合Elasticsearch
Spring Boot整合Elasticsearch Elasticsearch是一个全文搜索引擎,专门用于处理大型数据集.根据描述,自然而然使用它来存储和搜索应用程序日志.与Logstash和K ...
- Spring Boot(十四):spring boot整合shiro-登录认证和权限管理
Spring Boot(十四):spring boot整合shiro-登录认证和权限管理 使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉 ...
随机推荐
- Android 记录点滴
1:关于断点 设置断点点三角是进不去的,这个是类似c#的release 正式版, 点第二个红圈内的debug的那个按钮才可以 . 这个按钮可以让程序及时进入当前断点处 2:对于背景颜色 andro ...
- 查看linux中tcp连接数
一.查看哪些IP连接本机 netstat -an 二.查看TCP连接数 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议 ...
- golang环境 centos 7
https://blog.csdn.net/ggq89/article/details/82682171 Linux下Go的安装.配置 .升级和卸载 https://blog.csdn.net/we ...
- java 线程池简单例子
package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import com.hra.riskprice.po ...
- 操作系统学习笔记(三) windows内存管理
//系统物理页面是由 (Page Frame Number Database )简称PFN数据库来进行管理,实际上是一个数组,每个物理页面都对应一个PFN项. 进程的地址空间是通过VAD(Virtua ...
- 提交操作自动遮蔽实现之ajax
有时候,我们期望一些提交操作自动增加遮蔽效果,提交成功时自动去除遮蔽. 方案: 1. 提交前增加遮蔽逻辑,成功后增加去除遮蔽逻辑,但是不够智能 2.通过ajax拦截,实现自动添加\去除遮蔽效果 aja ...
- collection管理程序中不同类别的资源
在一个计算图中,可以通过collection管理不同类别的资源,如通过tf.add_to_collection函数可以将资源加入一个或多个集合中,然后通过tf.get_collection获取一个集合 ...
- Maths | 离散K-L变换/ 主成分分析法
目录 1. 概述 2. K-L变换方法和原理推导 2.1. 向量分解 2.2. 向量估计及其误差 2.3. 寻找最小误差对应的正交向量系 3. K-L变换高效率的本质 4. PCA在编.解码应用上的进 ...
- html-minifier中文文档
HTMLMinifier是一个高度可配置的.经过良好测试的.基于javascript的HTML缩小器.参见相应的博客文章,了解它的工作原理.每个选项的描述.测试结果和结论.在线测试套件.还可以看到相应 ...
- B树之C语言实现(包含查找、删除、插入)
B树的定义 一棵m阶B树(Balanced Tree of order m),或为空树,或为满足下列特性对的m叉树. 树中每个结点最多含有m棵子树. 若根结点不是叶子结点,则至少有2个子树. 除根结点 ...