Redis

一、Redis介绍

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

Redis的特点:

1.Redis读取的速度是110000次ls,写的速度是81000次/s;

2.原子。Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。

3.支持多种数据结构:string〈字符串);list〈列表〉;hash〈哈希〉,set〈集合〉;zset(有序集合)

4.持久化,集群部署

5.支持过期时间,支持事务,消息订阅


  • 基于key-value进行存储的
  • 支持多种数据结构:string(字符串)﹔ list(列表); hash(哈希),set(集合)﹔ zset(有序集合)本支持持久化,通过内存进行存储的,也可以存到硬盘里面
  • 支持过期时间,支持事务
  • 一般来说,把经常进行查询的,不经常修改,不是特别重要的数据放到redis作为缓存

二、项目集成

1.引入依赖pom.xml

  1. <!-- redis -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.commons</groupId>
  8. <artifactId>commons-pool2</artifactId>
  9. </dependency>

2.创建redis配置类

  1. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  2. import com.fasterxml.jackson.annotation.PropertyAccessor;
  3. import com.fasterxml.jackson.databind.DeserializationFeature;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import org.springframework.cache.CacheManager;
  6. import org.springframework.cache.annotation.CachingConfigurerSupport;
  7. import org.springframework.cache.annotation.EnableCaching;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import org.springframework.data.redis.cache.RedisCacheConfiguration;
  11. import org.springframework.data.redis.cache.RedisCacheManager;
  12. import org.springframework.data.redis.connection.RedisConnectionFactory;
  13. import org.springframework.data.redis.core.RedisTemplate;
  14. import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
  15. import org.springframework.data.redis.serializer.RedisSerializationContext;
  16. import org.springframework.data.redis.serializer.RedisSerializer;
  17. import org.springframework.data.redis.serializer.StringRedisSerializer;
  18. import java.time.Duration;
  19. @EnableCaching //开启缓存
  20. @Configuration
  21. public class RedisConfig extends CachingConfigurerSupport {
  22. @Bean
  23. public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory) {
  24. RedisTemplate<String,Object> template = new RedisTemplate<>();
  25. template.setConnectionFactory(factory);
  26. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  27. ObjectMapper om = new ObjectMapper();
  28. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  29. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  30. om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  31. jackson2JsonRedisSerializer.setObjectMapper(om);
  32. StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
  33. template.setKeySerializer(stringRedisSerializer);
  34. template.setHashKeySerializer(stringRedisSerializer);
  35. template.setValueSerializer(jackson2JsonRedisSerializer);
  36. template.setHashValueSerializer(jackson2JsonRedisSerializer);
  37. template.afterPropertiesSet();
  38. return template;
  39. }
  40. @Bean
  41. public CacheManager cacheManager(RedisConnectionFactory factory){
  42. RedisSerializer<String> redisSerializer = new StringRedisSerializer();
  43. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
  44. //解决查询缓存转换异常的问题
  45. ObjectMapper om = new ObjectMapper();
  46. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  47. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  48. jackson2JsonRedisSerializer.setObjectMapper(om);
  49. //配置序列化(解决乱码的问题),过期时间600秒
  50. RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
  51. .entryTtl(Duration.ofSeconds(600))
  52. .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
  53. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
  54. .disableCachingNullValues();
  55. RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
  56. .cacheDefaults(config)
  57. .build();
  58. return cacheManager;
  59. }
  60. }

3.在接口中添加redis缓存

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

3.1 SpringBoot缓存注解

(1)缓存@Cacheable

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

属性/方法 解释
value 缓存名,必填,它指定了你的缓存存放在哪块命名空间
cacheName 与value差不多,二选一即可
key 可选属性,可以使用SpEL标签自定义缓存的key,key = “‘getBannerAll’”

(2)缓存@CachePut

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

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

(3)缓存@CacheEvict

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

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