- 本地缓存:速度快、效率高,但分布式环境下容易出现数据不一致的问题、且缓存的数据量一般不能太大,常见的比如guava、ehcache、caffeine
实现:
可以自己用ConcurrentLinkedHashMap实现
ehcache:纯java的进程内缓存框架,快速精干,是hibernate默认的缓存管理器,缓存数据的存储有内存、硬盘两级,无需担心容量问题
caffeine:基于java8,高性能、高命中率、低内存占用,性能极高,在spring 2.x中取代guava成为默认的本地缓存组件,只在内存中存储缓存的数据
spring整合caffeine
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> </dependency>
spring: cache: type: caffeine cache-names: privilege #需要和本地缓存注解的名称一样,并且不要注入 caffeine: spec: initialCapacity=50,maximumSize=500,expireAfterWrite=10m 初始容量 initialCapacity 最大容量 maximumSize 过期时间 expireAfterWrite
启动类加入开启缓存注解 @EnableCaching查询的实现类里面加入注解@Cachebale注解,value值和nacos里配置的一样
本地缓存的使用场景:
小数据量的缓存,查询次数多,数据不容易变的数据做本地缓存。
我的使用场景是为了防止数据泄漏,所以需要每个接口都做了统一的权限查询,但是权限在草稿状态的时候是可以修改的,但是询单一但发布,除了数据库进行修改,是不会有其他的变动的。所以权限一但赋予,基本是不会变更的,且因为每个接口都进行了鉴权,所以查询的频率会比较高。但是数据量又不是特别的高,活跃的用户并不算很多。所以选择了本地缓存。