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