一、Redis介绍

Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统 (区别于MySQL的二维表格的形式存储。)。和Memcache类似,但很大程度补偿了Memcache的不 足。和Memcache一样,Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到 内存中,无法自动定期写入硬盘,这就表示,一断电或重启,内存清空,数据丢失。所以Memcache的 应用场景适用于缓存无需持久化的数据。而Redis不同的是它会周期性的把更新的数据写入磁盘或者把修 改操作写入追加的记录文件,实现数据的持久化。
Redis的特点:

  1. Redis读取的速度是110000次/s,写的速度是81000次/s
  2. 原子 。Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行
  3. 支持多种数据结构:string(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合)
  4. 持久化,集群部署
  5. 支持过期时间,支持事务,消息订阅

    二、项目集成Redis(谷粒学院)

    2.1 在common模块添加依赖

    由于redis缓存是公共应用,所以我们把依赖与配置添加到了common模块下面,在common模块pom.xml下添加以下依赖。

    1. <!-- redis -->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-data-redis</artifactId>
    5. </dependency>
    6. <!-- spring2.X集成redis所需common-pool2-->
    7. <dependency>
    8. <groupId>org.apache.commons</groupId>
    9. <artifactId>commons-pool2</artifactId>
    10. <version>2.6.0</version>
    11. </dependency>

    2.2 在service-base模块添加redis配置类

    image.png
    RedisConfig:

    1. @EnableCaching
    2. @Configuration
    3. public class RedisConfig extends CachingConfigurerSupport {
    4. @Bean
    5. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory
    6. factory) {
    7. RedisTemplate<String, Object> template = new RedisTemplate<>();
    8. RedisSerializer<String> redisSerializer = new StringRedisSerializer();
    9. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
    10. Jackson2JsonRedisSerializer(Object.class);
    11. ObjectMapper om = new ObjectMapper();
    12. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    13. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    14. jackson2JsonRedisSerializer.setObjectMapper(om);
    15. template.setConnectionFactory(factory);
    16. //key序列化方式
    17. template.setKeySerializer(redisSerializer);
    18. //value序列化
    19. template.setValueSerializer(jackson2JsonRedisSerializer);
    20. //value hashmap序列化
    21. template.setHashValueSerializer(jackson2JsonRedisSerializer);
    22. return template;
    23. }
    24. @Bean
    25. public CacheManager cacheManager(RedisConnectionFactory factory) {
    26. RedisSerializer<String> redisSerializer = new StringRedisSerializer();
    27. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
    28. Jackson2JsonRedisSerializer(Object.class);
    29. //解决查询缓存转换异常的问题
    30. ObjectMapper om = new ObjectMapper();
    31. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    32. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    33. jackson2JsonRedisSerializer.setObjectMapper(om);
    34. // 配置序列化(解决乱码的问题),过期时间600秒
    35. RedisCacheConfiguration config =
    36. RedisCacheConfiguration.defaultCacheConfig()
    37. .entryTtl(Duration.ofSeconds(600))
    38. .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
    39. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
    40. .disableCachingNullValues();
    41. RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
    42. .cacheDefaults(config)
    43. .build();
    44. return cacheManager;
    45. }
    46. }

    2.3 在接口中添加redis缓存

    由于首页数据变化不是很频繁,而且首页访问量相对较大,所以我们有必要把首页接口数据缓存到redis缓存中,减少数据库压力和提高访问速度。

    2.3.1 SpringBoot缓存注解

  6. 缓存@Cacheable

    根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。 其属性值如下:

属性/方法名 解释
value 缓存名,必填,指定缓存存放在哪块命名空间
cacheNames 与value差不多,二选一即可
key 可选属性,可以使用SpEL标签自定义缓存的key
  1. 缓存@CachePut

    使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。属性值如下:

属性/方法名 解释
value 缓存名,必填,指定缓存存放在哪块命名空间
cacheNames 与value差不多,二选一即可
key 可选属性,可以使用SpEL标签自定义缓存的key
  1. 缓存@CacheEvict

    使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上,属性值如下:

属性/方法名 解释
value 缓存名,必填,指定缓存存放在哪块命名空间
cacheNames 与value差不多,二选一即可
key 可选属性,可以使用SpEL标签自定义缓存的key
allEntries 是否清空所有缓存,默认为false。如果指定为true,则方法调用后将立刻清空所有的缓存。
beforeInvocation 是否在方法执行前就清空,默认为false。如果指定为true,则在方法执行前就会清空缓存