SpringBoot:一二级分布式缓存
Posted mengy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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应用自身的一级缓存。
数据修改、删除(先删除本地,然后广播其他节点执行删除):
以上是关于SpringBoot:一二级分布式缓存的主要内容,如果未能解决你的问题,请参考以下文章
架构实战篇:MyBatis一级二级,并整合ehcache分布式缓存的使用,附演示实例
Mybatis自定义分布式二级缓存实现与遇到的一些问题解决方案!
springboot+mybatis+redis实现分布式缓存
SpringBoot整合Redis以及缓存穿透缓存雪崩缓存击穿的理解如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁