spring boot 的redis 之初理解
2024-09-04 04:12:28
项目到末尾了快, 这几天安排我结合业务场景给项目加上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注解使当前缓存失效。 但是这就导致了每次更改都要重新读库一次。 有待优化。
最新文章
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(81)-数据筛选(万能查询)
- 新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法
- 设计模式(十三) 职责链(chain of responsibility)
- Python基础-字符编码与转码
- 剑指offer:赋值运算符函数和复制构造函数
- 【HTML】Jquery前台传参及接收
- hdoj 1872 稳定排序
- asp.net 中使用JQuery Ajax 上传文件
- linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例
- C++得到最大的int值
- Android实现动画循环的方式
- ios layer 动画
- 浅谈 EF CORE 迁移和实例化的几种方式
- ubuntu下使用nginx搭建流媒体服务器,实现视频点播
- 基于Bootstrap的Metro风格模板
- git分支与主干合并操作
- MongoDB Schema Design
- (3)arp协议
- JS全局变量与局部变量
- wireshark数据包分析
热门文章
- VC++ 对话框下使用工具栏
- ⭐register_chrdev、register_chrdev_region以及alloc_chrdev_region之间的区别
- linux初级学习笔记三:linux操作系统及常用命令,及如何复制和移动文件!(视频序号:02_4)
- org.apache.hadoop.hbase.NotServingRegionException: Region is not online 错误
- 多线程-threading模块2
- sublime text 3中修改tab键为缩进4个空格
- python学习笔记2-条件语句
- Codeforces - 559B - Equivalent Strings - 分治
- 算法学习--Day3
- = =写个prim希望能够巨巨们看的懂