Redis存储的是key-value结构的数据,其中key是字符串类型,value有五种常用的数据类型
- 字符串 : 普通字符串,常用
- 哈希 : 适合存储对象
- 列表 : list按照插入顺序排序,可以有重复元素
- 集合 : set无序集合,没有重复元素
- 有序集合 : sorted set 有序集合,没有重复元素
Redis是当前比较热门的NoSql系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统。与Memcache类似,但是弥补了Memcache的很多不足之处。与Memcache不同的地方在于,Memcache只能将数据写到内存中,不能实现数据同步到硬盘实现持久化,redis则可以定期的将数据存储到硬盘中,实现数据的持久化。
特点:
- redis读取速度是110000次/s 写的速度是81000次/s
- redis的操作都是原子性的
- 支持多种数据结构:string、list、hash、set、zset
一般将经常查询,不经常修改的数据,不是特别重要的数据放到redis作为缓存
使用
在common模块引入依赖
<!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--spring2.X集成redis所需common-pool2--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.6.0</version> </dependency> 写redis的配置文件 (这里需要注意的是需要在启动类中开启包扫描确定可以扫描到common模块中redis的配置类) @EnableCaching @Configuration public class RedisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setConnectionFactory(factory); //key序列化方式 template.setKeySerializer(redisSerializer); //value序列化 template.setValueSerializer(jackson2JsonRedisSerializer); //value hashmap序列化 template.setHashValueSerializer(jackson2JsonRedisSerializer); return template; } @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //解决查询缓存转换异常的问题 ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // 配置序列化(解决乱码的问题),过期时间600秒 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofSeconds(600)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(factory) .cacheDefaults(config) .build(); return cacheManager; } } 配置application.propertities/ yml # 配置redis spring.redis.host=localhost spring.redis.port=6379 spring.redis.database= 0 spring.redis.timeout=1800000 spring.redis.lettuce.pool.max-active=20 spring.redis.lettuce.pool.max-wait=-1 #最大阻塞等待时间(负数表示没限制) spring.redis.lettuce.pool.max-idle=5 spring.redis.lettuce.pool.min-idle=0 在service层加入@Cacheable注解 @Cacheable(key = "'selectIndexList'",value = "banner") @Override public List<CrmBanner> getAllList() { LambdaQueryWrapper<CrmBanner> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.orderByAsc(CrmBanner::getSort); List<CrmBanner> list = baseMapper.selectList(null); return list; } controller @GetMapping("/getlist") public R getList(){ List<CrmBanner> list = bannerService.getAllList(); return R.ok().data("rows",list); }
测试
查看
注意:当第一次查询这个接口数据的时候会执行sql语句,当第二次查询数据的时候就不在执行sql语句了,因为数据已经缓存在redis中。