日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Redis缓存之自定义CacheManager

發(fā)布時(shí)間:2023/12/18 编程问答 28 如意码农
生活随笔 收集整理的這篇文章主要介紹了 Redis缓存之自定义CacheManager 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

測試緩存:
原理:
CacheManager===Cache 緩存組件來實(shí)際給緩存中存儲(chǔ)數(shù)據(jù)
1,引入redis的starter,容器中保存的是RedisCacheManager
2,RedisCacheManager 幫我們創(chuàng)建RedisCache 來作為緩存組件;
RedisCache通過操作redis來緩存數(shù)據(jù)
3,默認(rèn)保存數(shù)據(jù) K -V 都是通過序列化來保存的;

關(guān)于能存儲(chǔ)redis。第二次查不能反序列化出來的問題。
原因:存的是dept的緩存數(shù)據(jù),而CacheManager默認(rèn)使用RedisTemplate<Object, Employee>來操作redis
解決方法:
自定義CacheManager:
1> 引入了redis的starter,cacheManager變?yōu)镽edisCacheManager
2> 默認(rèn)創(chuàng)建的RedisCacheManager 操作redis的時(shí)候使用的是 RedisTemlate<Object,Object>
3> RedisTemlate<Object,Object> 是默認(rèn)使用jdk序列化機(jī)制
4> 自定義CacheManager

@Configuration
public class MyRedisConfig { //員工緩存
@Bean
public RedisTemplate<Object, Employee> empRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Employee> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer<Employee> ser = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
template.setDefaultSerializer(ser);
return template;
} //員工緩存
//CacheManagerCustomizers 可以定制緩存的一些規(guī)則
@Bean
@Primary //默認(rèn)緩存管理器 必須得有默認(rèn)
public RedisCacheManager employeeCacheManager(RedisTemplate<Object, Employee> empRedisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(empRedisTemplate);
//key多了一個(gè)前綴 //使用前綴,默認(rèn)把cacheName作為前綴
cacheManager.setUsePrefix(true);
return cacheManager;
} //部門緩存
@Bean
public RedisTemplate<Object, Department> deptRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Department> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer<Department> ser = new Jackson2JsonRedisSerializer<Department>(Department.class);
template.setDefaultSerializer(ser);
return template;
} //部門緩存
@Bean
public RedisCacheManager deptCacheManager(RedisTemplate<Object, Department> deptRedisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(deptRedisTemplate);
cacheManager.setUsePrefix(true);
return cacheManager;
}
}
  1. @Primary 當(dāng)自定義兩個(gè)CacheManager的時(shí)候。必須指定一個(gè)為默認(rèn)的
  2. 針對不同的service可以直接標(biāo)注CacheManager,同時(shí)如果有默認(rèn)指定,可以省略不寫
    @CacheConfig(cacheNames = "dept",cacheManager = "deptCacheManager")
    @Service
    public class DeptService {
    @CacheConfig(cacheNames = "emp"/*,cacheManager = "employeeCacheManager"*/)
    @Service
    public class EmployeeService {
  3. 以上都是注解形式的緩存,編碼形式的緩存寫法:
       //方法內(nèi),編碼方式做緩存
    @Qualifier("deptCacheManager")
    @Autowired
    RedisCacheManager deptCacheManager; //在方法內(nèi)做緩存寫法
    public Department getDeptById(Integer id){
    System.out.println("查詢部門id為"+id+"...........");
    Department dept = departmentMapper.getDeptById(id);
    Cache deptCache=deptCacheManager.getCache("dept");//相當(dāng)于 @Cacheable(cacheNames = "dept")
    deptCache.put("dept:1",dept);
    return dept;
    }

總結(jié)

以上是生活随笔為你收集整理的Redis缓存之自定义CacheManager的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。