SpringBoot:一二级分布式缓存
前言
缓存系统的用来代替直接访问数据库,用来提升系统性能,减小数据库负载。早期缓存跟系统在一个虚拟机里,这样内存访问,速度最快。 后来应用系统水平扩展,缓存作为一个独立系统存在,如redis,但是每次从缓存获取数据,都还是要通过网络访问才能获取,效率相对于早先从内存里获取,还是不够逆天快。如果一个应用,比如传统的企业应用,一次页面显示,要访问数次redis,那效果就不是特别好,性能不够快不说,还容易使得Reids负载过高,Redis的主机出现各种物理故障。因此,现在有人提出了一二级缓存。即一级缓存跟系统在一个虚拟机内,这样速度最快。二级缓存位于redis里,当一级缓存没有数据的时候,再从redis里获取,并同步到一级缓存里。这跟CPU的一级缓存,二级缓存是一个道理。当然也面对同样的问题。
缓存概念
Cache 通常有如下组件构成
- CacheManager:用来创建,管理,管理多个命名唯一的Cache。如可以有组织机构缓存,菜单项的缓存,菜单树的缓存等
- Cache:类似Map那样的Key—Value存储结构,Value部分 通常包含了缓存的对象,通过Key来取得缓存对象
- 缓存项:存放在缓存里的对象,常常需要实现序列化接口,以支持分布式缓存。
- Cache存储方式:缓存组件的可以将对象放到内存,也可以是其他缓存服务器,Spring Boot 提供了一个基于ConcurrentMap的缓存,同时也集成了Redis,EhCache 2.x,JCache缓存服务器等
- 缓存策略:通常Cache 还可以有不同的缓存策略,如设置缓存最大的容量,缓存项的过期时间等
- 分布式缓存:缓存通常按照缓存数据类型存放在不同缓存服务器上,或者同一类型的缓存,按照某种算法,不同key的数据放在不同的缓存服务器上。
- Cache Hit:当从Cache中取得期望的缓存项,我们通常称之为缓存命中。如果没有命中我们称之为Cache Miss,意味着需要从数据来源处重新取出并放回Cache中
- Cache Miss:缓存丢失,根据Key没有从缓存中找到对应的缓存项
- Cache Evication:缓存清除操作。
- Hot Data:热点数据,缓存系统能调整算法或者内部存储方式,使得将最有可能频繁访问的数据能尽快访问到。
- On-Heap:Java分配对象都是在堆内存里,有最快的获取速度。由于虚拟机的垃圾回收管理,缓存放过多的对象会导致垃圾回收时间过长,从而有可能影响性能。
- Off-Heap:堆外内存,对象存放到在虚拟机分配的堆外内存,因此不受垃圾回收管理的管理,不影响系统系统,但堆外内存的对象要被使用,还要序列化成堆内对象。很多缓存工具会把不常用的对象放到堆外,把热点数据放到堆内。
一二级缓存服务器
SpringBoot自带的Redis缓存非常容易使用,但由于通过网络访问了Redis,效率还是比传统的跟应用部署在一起的一级缓存略慢。
本章中,扩展RedisCacheManager和RedisCache,在访问Redis之前,先访问一个ConcurrentHashMap实现的简单一级缓存,如果有缓存项,则返回给应用,如果没有,再从Redis里取,并将缓存对象放到一级缓存里
数据读取:
当缓存项发生变化的时候,注解@CachePut 和 @CacheEvict会触发RedisCache的put( Object key, Object value)和evict(Object key)操作,俩级缓存需要同时更新ConcurrentHashMap和Redis缓存,且需要通过Redis的Pub发出通知消息,其他Spring Boot应用通过Sub来接收消息,同步更新Spring Boot应用自身的一级缓存。
数据修改、删除(先删除本地,然后广播其他节点执行删除):
相关推荐
loviezhang 2020-06-08
Cheetahcubs 2020-05-06
ol0 2020-05-02
loviezhang 2020-03-28
middleware0 2020-05-06
枫叶上的雨露 2020-05-02
粗茶淡饭 2020-05-27
blncle 2020-03-20
YZR 2020-02-29
枫叶上的雨露 2020-01-09
nbfcome 2019-11-13
Cheetahcubs 2019-10-30
LandryBean 2019-10-30
zhangll00 2019-10-27
summerZBH 2019-04-11
wera00 2014-08-13