spring-cache
注解:
@cacheable // 在方法调用前,先在缓存中去找,若没有,则在方法调用结束后,放到缓存中,属性cachenames、key。key中可以使用spel表达式,如#id,#root.args[0]
@cacheput // 每次调用方法,都会刷新缓存。默认是调用方法后刷新;属性可以使用 #result.xx
@cacheevict // 清楚缓存
@caching // 复杂的配置逻辑
@cacheconfig // 抽取出同一个service*同的配置
springboot-cache缓存原理:
1、自动配置类;cacheautoconfiguration
2、缓存的配置类
org.springframework.boot.autoconfigure.cache.genericcacheconfiguration
org.springframework.boot.autoconfigure.cache.jcachecacheconfiguration
org.springframework.boot.autoconfigure.cache.ehcachecacheconfiguration
org.springframework.boot.autoconfigure.cache.hazelcastcacheconfiguration
org.springframework.boot.autoconfigure.cache.infinispancacheconfiguration
org.springframework.boot.autoconfigure.cache.couchbasecacheconfiguration
org.springframework.boot.autoconfigure.cache.rediscacheconfiguration
org.springframework.boot.autoconfigure.cache.caffeinecacheconfiguration
org.springframework.boot.autoconfigure.cache.guavacacheconfiguration
org.springframework.boot.autoconfigure.cache.simplecacheconfiguration【默认】
org.springframework.boot.autoconfigure.cache.noopcacheconfiguration
3、哪个配置类默认生效:simplecacheconfiguration;
4、simplecacheconfiguration给容器中注入了一个cachemanager:concurrentmapcachemanager
5、concurrentmapcachemanager可以获取和创建concurrentmapcache类型的缓存组件;他的作用将数据保存在concurrentmap中;
默认使用的是concurrentmapcachemanager==concurrentmapcache;将数据保存在 concurrentmap<object, object>中
开发中使用缓存中间件;redis、memcached、ehcache;
整合redis作为缓存
redis 是一个开源(bsd许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
1、安装redis:使用docker;
2、引入redis的starter
3、配置redis
4、测试缓存
原理:cachemanager===cache 缓存组件来实际给缓存中存取数据
1)、引入redis的starter,容器中保存的是 rediscachemanager;
2)、rediscachemanager 帮我们创建 rediscache 来作为缓存组件;rediscache通过操作redis缓存数据的
3)、默认保存数据 k-v 都是object;利用序列化保存;当key-value都是object的时候,会使用序列化保存,默认是使用jdk的序列化机制
如何保存为json
1、引入了redis的starter,cachemanager变为 rediscachemanager;
2、默认创建的 rediscachemanager 操作redis的时候使用的是 redistemplate<object, object>
3、redistemplate<object, object> 是 默认使用jdk的序列化机制
4)、自定义cachemanager;
5)、key值命名;
//存到redis的key值会多一个前缀,默认会将cachename作为key的前缀
cachemanager.setuseprefix(true);