文章目录
数据缓存
抽象结构:[CacheProvider]、CacheManager、Cache、Entry、Expiry
- Cache,类似Connection,执行缓存操作。CacheManager–DataSource。
- Entry,<K,V>;缓存对象,K、V为String、byte[]类型。序列化。
- Expiry,过期策略。
ConcurrentHashMap、Ehcache、redis
@EnableCaching;开启缓存
1,应用与缓存交互方式?是否需序列化?Entry
线程交互(堆内存、持久化)、进程交互(通信,序列化)。
缓存分类:本地缓存(堆内缓存-GC压力,堆外缓存-序列化)、进程间缓存、远程缓存
按介质分:内存缓存、持久化缓存
非堆内缓存,均需序列化、反序列化。
2,过期机制?Expiry
lru、lfu、fifo、random等
3,缓存刷新机制?
@CacheEvict,清空cache、或key;未有清空多个key。
@Caching,组织多个cache策略
Spring Cache仅支持清空cache、key。
具体缓存框架的Cache,可通过removeAll()等方法清除多个key。
4,springboot缓存结构
CacheManager、Cache、keyGenerator、serializer、注解
5,缓存
缓存-数据复用;数据存储、数据引用。
6,缓存清理
定时清理、服务端自动触发清理(如内存已满)、定期清理(定时判定)
EHCache User Guide
http://www.ehcache.org/generated/2.10.4/pdf/Ehcache_Cache_Server_User_Guide.pdf
Ehcache作为缓存服务器,通过war包,或独立服务器形式提供服务。
使用jar包时,为本地缓存形式,进程内缓存。
两类API:Restful、SOAP(Simple Object Access Protocol)
diskPersistent,boolean;是否持久化,若为true,缓存对象必须序列化。
若对象可能被持久化,建议实现序列化接口。序列化,Serializable接口。
Ehcache jar包为本地缓存,默认为堆内缓存。
Ehcache支持key、value均为对象;通过hashCode()判定key相等。
SpringBoot集成Ehcache
https://www.jianshu.com/p/729e3cc14361
导包:net.sf.ehcache@ehcache、spring-boot-starter-cache
配置:springboot自动配置,spring配置(EhCacheManagerFactoryBean/EhCacheCacheManager、Cache,均为spring包下)。配置manager,配置springboot的cachemanager封装。
配置:EhCacheManagerFactoryBean、CacheManager(EhCacheCacheManager)、[Cache]
API:
- 注入Cache,执行查询
- CacheManager.create()/newInstance();ehcache包下新建
注意:
- 缓存的类实现Serializable
- 代码缓存,结合Optional使用
- key为Object,通过hashCode判定相等。
序列化策略
K为String时,直接输出,为Object输出hashCode;V使用jdk序列化。
定制序列化策略:
- key,通过注解指定
- value,实现Externalizable接口。
持久化
配置,缓存内容可存到硬盘。
过期策略:lru、lfu、fifo
Redis
in-memory database。
bean构建、配置、序列化器、keyGenerator
导包:spring-boot-starter-cache、spring-boot-starter-data-redis(基于spring-data实现);如需使用连接池,导入org.apache.commons#commons-pool2
配置:RedisCacheConfigutation、RedisCacheManager
配置参考:https://blog.youkuaiyun.com/haveqing/article/details/86519992
持久化:RDB快照、AOF日志;类比MySQL同步
spring data redis
配置:RedisConnectionFacotry、RedisTemplate/StringRedisTemplate
LettuceConnectionFactory、JedisConnectionFactory实现RedisConnectionFactory
序列化策略
类比MessageConverter。
持久化、网络传输;IO流操作,基础流:字节流、字符流;故需将对象转为byte[]、String表示,而后传输、输出。
K序列化器为String泛型,若K为Object,使用ConversionService转为String。
V序列化器为Object泛型,默认为jdk;一般改为json。
过期策略
https://www.jianshu.com/p/76d2ad374fcd
内存满后淘汰数据。有过期时间的为volatile
- volatile-lru;最近最少使用
- volatile-ttl;过期时间
- volatile-random;随机
- allkeys-lru;
- allkeys-random;
- no-eviction;不淘汰
其他
持久化策略:RDB数据快照、AOF日志;redis数据只存放于内存,持久化仅作数据备份。
作为Nosql数据库
redisClient:springboot1.5–jedis,springboot2.x–lettuce
redis、jedis
https://blog.youkuaiyun.com/zxl646801924/article/details/82770026
redis基于工厂方法,包spring-data-redis;核心类:JedisConnectionFactory、RedisTemplate
jedis基于连接池,包redis.clients@jedis;核心类:JedisPool、Jedis
SpringBoot整合
jpa
https://www.jianshu.com/p/feef1421ab0b
配置项:spring.redis.*
配置:RedisConnectionFacotry、RedisTemplate/StringRedisTemplate
LettuceConnectionFactory、JedisConnectionFactory实现RedisConnectionFactory
cache
https://www.jianshu.com/p/6943bb8a9ab8
配置项:spring.cache.、spring.cache.redis.
配置:RedisCacheConfigutation、RedisCacheManager
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)
// 一定要先调用该方法设置初始化的缓存名,再初始化相关的配置
.initialCacheNames(cacheNames)
.withInitialCacheConfigurations(configMap)
.build();