项目到末尾了快, 这几天安排我结合业务场景给项目加上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注解使当前缓存失效。 但是这就导致了每次更改都要重新读库一次。 有待优化。

最新文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(81)-数据筛选(万能查询)
  2. 新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法
  3. 设计模式(十三) 职责链(chain of responsibility)
  4. Python基础-字符编码与转码
  5. 剑指offer:赋值运算符函数和复制构造函数
  6. 【HTML】Jquery前台传参及接收
  7. hdoj 1872 稳定排序
  8. asp.net 中使用JQuery Ajax 上传文件
  9. linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例
  10. C++得到最大的int值
  11. Android实现动画循环的方式
  12. ios layer 动画
  13. 浅谈 EF CORE 迁移和实例化的几种方式
  14. ubuntu下使用nginx搭建流媒体服务器,实现视频点播
  15. 基于Bootstrap的Metro风格模板
  16. git分支与主干合并操作
  17. MongoDB Schema Design
  18. (3)arp协议
  19. JS全局变量与局部变量
  20. wireshark数据包分析

热门文章

  1. VC++ 对话框下使用工具栏
  2. ⭐register_chrdev、register_chrdev_region以及alloc_chrdev_region之间的区别
  3. linux初级学习笔记三:linux操作系统及常用命令,及如何复制和移动文件!(视频序号:02_4)
  4. org.apache.hadoop.hbase.NotServingRegionException: Region is not online 错误
  5. 多线程-threading模块2
  6. sublime text 3中修改tab键为缩进4个空格
  7. python学习笔记2-条件语句
  8. Codeforces - 559B - Equivalent Strings - 分治
  9. 算法学习--Day3
  10. = =写个prim希望能够巨巨们看的懂