spring boot 的redis 之初理解
项目到末尾了快, 这几天安排我结合业务场景给项目加上redis 缓存, 我接到这个任务也是懵逼了一会儿; 问了一句让我自己先想办法,没办法硬着头皮查吧, 要不不得不说spring boot 还是好用,直接就支持集成了redis. 下面先说说怎样用,
第一步: 先说说怎样配置:
spring boot的项目的pom.xml中加入如下依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
第二步: 在application.yml中配置redis的相关参数

database:是redis数据库的索引, 途中写错了,请谅解。
第三步: 定义redis 的配置类,对redis 进行相关配置
/**
* Configuration 注解的作用是将类标记为spring boot 的配置类, 在启动时会读取其中的配置。
*/
@Configuration
public class RedisConfig { @Value("${spring.redis.host}") // 读取上面配置参数中的值.,
private String host; @Value("${spring.redis.port}")
private int port; @Value("${spring.redis.database}")
private int database; /**
* 实例化 RedisTemplate 对象
*
* @return
*/
@Bean
public RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
return redisTemplate;
}
/**
* 设置数据存入 redis 的序列化方式,并开启事务
*
* @param redisTemplate
* @param factory
*/
private void initDomainRedisTemplate(RedisTemplate<String, 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);
}
/**
* 注入封装RedisTemplate
* @Title: redisUtil
* @return RedisUtil
* @autor lpl
* @date 2017年12月21日
* @throws
*/
@Bean(name = "redisUtil")
public RedisUtil redisUtil(RedisTemplate<String, Object> redisTemplate) {
RedisUtil redisUtil = new RedisUtil();
redisUtil.setRedisTemplate(redisTemplate);
return redisUtil;
}
}
第四步: 在项目中使用,这里是以注解的方式来使用
下面就介绍四个常用注解和他们的常用属
@CacheConfig(cacheNames = "cache-user") // 该注解用来配置一些redis的公用信息,cacheNames 是缓存名称
public interface SecUserPojoMapper {
/**
* This method was generated by MyBatis Generator. This method corresponds to
* the database table SEC_USER
*
* @mbggenerated
*/
@CacheEvict(key = "#id")
int deleteByPrimaryKey(Long id); /**
* This method was generated by MyBatis Generator. This method corresponds to
* the database table SEC_USER
*
* @mbggenerated
*/
@Cacheput // 该注解用来刷新缓存,并把方法的返回值放入redis缓存中。也就是说改方法无论如何都会执行的 注意,是方法的返回值,比如这个保存的方法,一般的返回值是受影响的记录的条数,如果想保存保存的数据,那么
// 就要对方法进行重构,让方法返回插入的数据
int insert(SecUserPojo record); /**
* This method was generated by MyBatis Generator. This method corresponds to
* the database table SEC_USER
*
* @mbggenerated
*/
@CacheEvict // 此注解用来使指定key或者指定缓存名称的缓存失效,也就是清楚缓存。
int insertSelective(SecUserPojo record); /**
* 被该注解标记的方法在执行前会先去redis中查找,如果找到就不执行方法直接返回结果,如果找不到那么就执行方法,并且把方法的返回值写入redis。
其中的value属性是用来指定缓存的名称,与@Cacheable注解的cachenames的作用相同,如果都配置那么会以该注解的为最后值, key 属性用来指定写入和读取时候的键,
仅支持spEL表达式,而不支持固定写死的值, 下面#id 取的是参数中的id的值为key
*
* @mbggenerated
*/
@Cacheable(value="myCache", key = "#id")
SecUserPojo selectByPrimaryKey(Long id);
到这里spring boot redis 的使用就大概介绍完了。 下面说说我遇到的问题以及解决办法
::: 在我标记的方法中有一个是没有传参的,这就导致了我无法自定义key,所以也就让redis自动生成了key ,我即是,我在查询的时候先从缓存中读取。 在涉及到该条查询记录改变的方法的上面加上@Cacheput(value="notice")注解来更新缓存,遇到的问题是我在改变数据的方法执行时并没有更新指定的缓存。而是在名为notice的缓存中新增了一条按照当前类名为缓存名的新的缓存。 导致这个问题的原因是: 我在读取数据的时候读出来的是多条数据一起写入了redis。 但是新增的方法是一次一条数据,并且由于读取的时候没有传入参数,没有办法指定key,这就导致了上面的问题;由于目前对redis的理解不太深入 解决的方法就是我换成了@CacheEvict注解使当前缓存失效。 但是这就导致了每次更改都要重新读库一次。 有待优化。
spring boot 的redis 之初理解的更多相关文章
- Spring Boot2 系列教程(二十六)Spring Boot 整合 Redis
在 Redis 出现之前,我们的缓存框架各种各样,有了 Redis ,缓存方案基本上都统一了,关于 Redis,松哥之前有一个系列教程,尚不了解 Redis 的小伙伴可以参考这个教程: Redis 教 ...
- 【redis】spring boot利用redis的Keyspace Notifications实现消息通知
前言 需求:当redis中的某个key失效的时候,把失效时的value写入数据库. github: https://github.com/vergilyn/RedisSamples 1.修改redis ...
- 玩转spring boot——结合redis
一.准备工作 下载redis的windows版zip包:https://github.com/MSOpenTech/redis/releases 运行redis-server.exe程序 出现黑色窗口 ...
- Spring Boot使用Redis进行消息的发布订阅
今天来学习如何利用Spring Data对Redis的支持来实现消息的发布订阅机制.发布订阅是一种典型的异步通信模型,可以让消息的发布者和订阅者充分解耦.在我们的例子中,我们将使用StringRedi ...
- 15套java架构师、集群、高可用、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程
* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...
- spring boot集成redis实现session共享
1.pom文件依赖 <!--spring boot 与redis应用基本环境配置 --> <dependency> <groupId>org.springframe ...
- Spring Boot + Mybatis + Redis二级缓存开发指南
Spring Boot + Mybatis + Redis二级缓存开发指南 背景 Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一.Mybat ...
- spring boot 结合Redis 实现工具类
自己整理了 spring boot 结合 Redis 的工具类引入依赖 <dependency> <groupId>org.springframework.boot</g ...
- (转)spring boot整合redis
一篇写的更清晰的文章,包括redis序列化:http://makaidong.com/ncjava/330749_5285125.html 1.项目目录结构 2.引入所需jar包 <!-- Sp ...
随机推荐
- Hadoop MapReduce两种架构 以及 YARN
一.MRv1 Master - Slave 模式 存在JobTracker单点失败的问题,在YARN得到了解决. 主要包含4部分:JobTracker,TaskTracker,Task,Client ...
- bzoj3134: [Baltic2013]numbers
稍微用脑子想一想,要是一个回文数,要么s[i]==s[i+1]要么s[i]==s[i+2]就可以实锤了 所以多开两维表示最近两位选的是什么数就完了 注意前导0 #include<cstdio&g ...
- KMP 、扩展KMP、Manacher算法 总结
一. KMP 1 找字符串x是否存在于y串中,或者存在了几次 HDU1711 Number Sequence HDU1686 Oulipo HDU2087 剪花布条 2.求多个字符串的最长公共子串 P ...
- DedeCms最新文章显示红色日期或加上new字或new小图片
DedeCMS发布的文章显示红色日期或加上new字或new小图片,给近三天(或当天)发布的文章显示红色日期或加上new字或new小图片等,都是围绕pubdate做文章,写扩展的. 1.红色的日期 ...
- 一个小bug,关于fuse_mount_sys
在mount.c 中的 int fuse_mount_sys 函数中,如果注销掉 fd的open语句,此时fd一般为0. 然后,用普通用户运行ssfs且不加-f参数,一切显示正常 fuse_moun ...
- ios 图片拉伸方法
前提:要注意图片的size和展示的图片view的size的大小. 假如图片高度50,展示图片view的高度30,拉伸会变成剪切. 如果图片尺寸不对,可以用mac自带的图片编辑器修改大小: 双击打开图 ...
- 【Codeforces 947A】 Primal Sport
[题目链接] 点击打开链接 [算法] 不难看出,x1的范围是[x2-P(x2)+1,x2],x0的范围是[x1-P(x1)+1,x1] 我们可以先做一遍线性筛,然后暴力就可以了 [代码] #inclu ...
- ES6之拷贝对象
function copyObject(orig) { var copy = Object.create(Object.getPrototypeOf(orig)); //创建一个新的原型对象 copy ...
- springboot读写分离--temp
我最初的想法是: 读方法走读库,写方法走写库(一般是主库),保证在Spring提交事务之前确定数据源. 保证在Spring提交事务之前确定数据源,这个简单,利用AOP写个切换数据源的切面,让他的优先级 ...
- flex兼容新
/* 子元素-平均分栏 */.flex1 { -webkit-box-flex: 1; /* OLD - iOS 6-, Safari 3.1-6 */ -moz-box-flex: 1; /* OL ...