zoukankan      html  css  js  c++  java
  • 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注解使当前缓存失效。 但是这就导致了每次更改都要重新读库一次。 有待优化。

  • 相关阅读:
    MySql不同版本对表名大小写敏感!
    jQuery Intellisense in VS 2008
    控制台方式运行java程序示例
    有关SQL Server 2008安装时“安全程序支持规则”失败的解决方法
    正则表达式实现验证的技术总结
    网站开发架构设计要求
    jquery select控件的相关操作
    Windows Embedded Standard 7 开发随笔
    一步步做自己的webinstall安装包
    仿新浪新闻中异步替换关键字
  • 原文地址:https://www.cnblogs.com/qiaoyutao/p/10288788.html
Copyright © 2011-2022 走看看