二、Redis
将方法查询结果保存在ConcurrentMap中是一种临时性的方案,一旦应用重启所有的缓存全部被清除了,所以最好还是使用EhCache、Redis中间件用作缓存,可以将缓存进行持久化
整合Redis
Spring Boot整合Redis只需要在pom文件中添加redis-starter
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 复制代码
配置Redis
# 默认就是使用localhost spring: redis: port: 6379 host: localhost password: 12345 database: 0 复制代码
如果使用本地安装的redis,端口为6379并且没有密码,可以不用配置连接信息,直接使用默认的配置即可
Redis自动配置类是RedisAutoConfiguration
该类往容器中添加了两个组件RedisTemplate和StringRedisTemplate,其中RedisTemplate是用于操作K、V都是字符串的数据,RedisTemplate用于操作K、V都是对象的数据
操作 String 类型数据
在test包下新建测试类StringRedisTemplateTest,导入StringRedisTemplate
@SpringBootTest public class StringRedisTemplateTest { @Autowired private StringRedisTemplate stringRedisTemplate; @Test public void testValue(){ stringRedisTemplate.opsForValue().append("hello","thor"); String hero = stringRedisTemplate.opsForValue().get("hello"); System.out.println("读取到的数据为:" + hero); } } 复制代码
通过opsForValue()的append()方法和get()方法可以往redis中添加和读取数据
操作 List 类型数据
新增一个测试方法testList(),操作List类型数据
@Test public void testList(){ stringRedisTemplate.opsForList().leftPush("heros","thor"); stringRedisTemplate.opsForList().rightPushAll("heros","banner", "stark", "clint"); String hero = stringRedisTemplate.opsForList().index("heros",2); System.out.println("索引为2位置的元素为:" + hero); System.out.println("左侧弹出一个元素" + stringRedisTemplate.opsForList().leftPop("heros")); } 复制代码
redisTemplate 操作对象
新建一个测试类RedisTemplateTest
@SpringBootTest public class RedisTemplateTest { @Autowired private RedisTemplate redisTemplate; @Autowired private TeslaService teslaService; @Test public void testObject(){ Tesla tesla = teslaService.getTeslaById(1166057546); redisTemplate.opsForValue().set("1166057546",tesla); // 获取存储的对象 Tesla teslaAtRedis = (Tesla) redisTemplate.opsForValue().get("1166057546"); System.out.println("Redis中存储的对象:" + teslaAtRedis); } } 复制代码
这是因为没有实现序列化接口导致的报错
使entity包下的Tesla实体类和Factory实体类实现序列化Serializable接口
再次测试
查看Redis中存储的数据
默认保存对象,使用jdk序列化机制,序列化的数据保存到redis中,如果想要保存json格式的数据就需要自定义RedisTemplate,使用指定的序列化规则
将LilithCacheKeyGeneartor重命名为LilithConfig,作为自定义主配置类,增加自定义的RedisTemplate
@Bean public RedisTemplate<Object, Tesla> teslaRedisTemplate(RedisConnectionFactory factory){ RedisTemplate<Object, Tesla> teslaRedisTemplate = new RedisTemplate<>(); teslaRedisTemplate.setConnectionFactory(factory); teslaRedisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Tesla.class)); return teslaRedisTemplate; } 复制代码
Jackson2JsonRedisSerializer序列化器可以在redis中保存Json格式数据
@Autowired private RedisTemplate<Object, Tesla> teslaRedisTemplate; @Test public void testObjectByTeslaRedisTemplate(){ Tesla tesla = teslaService.getTeslaById(1166057547); teslaRedisTemplate.opsForValue().set("1166057547", tesla); // 获取存储的对象 Tesla teslaAtRedis = teslaRedisTemplate.opsForValue().get("tesla"); System.out.println("Redis中存储的对象:" + teslaAtRedis); } 复制代码
再次查看redis中保存的数据的格式已经变为json格式
三、Redis整合CacheManager
引入redis的starter后,在application.yml配置文件中开启debu=true,查看控制台输出内种中有哪些组件匹配上了
注意有两个RedisCacheConfiguration,这里匹配上的是autoconfigure.cache
包下的RedisCacheConfiguration
RedisCacheConfiguration配置类往容器中添加了一个RedisCacheManager缓存管理器,并且容器中存在RedisConnectionFactory的前提下才会导入RedisCacheManager
RedisCacheManager通过loadCaches()方法来获取缓存
如果不存在就通过createRedisCache()方法来创建缓存
RedisCacheManager可以创建RedisCache来作为缓存组件,RedisCache通过操作redis缓存数据。