《电子商务网站建设 》,求个网站好人有好报2023,国内虚拟助手网站,长沙亿仁网络科技有限公司1 什么是缓存第一个问题#xff0c;首先要搞明白什么是缓存#xff0c;缓存的意义是什么。对于普通业务#xff0c;如果要查询一个数据#xff0c;一般直接select数据库进行查找。但是在高流量的情况下#xff0c;直接查找数据库就会成为性能的瓶颈。因为数据库查找的流程…1 什么是缓存第一个问题首先要搞明白什么是缓存缓存的意义是什么。对于普通业务如果要查询一个数据一般直接select数据库进行查找。但是在高流量的情况下直接查找数据库就会成为性能的瓶颈。因为数据库查找的流程是先要从磁盘拿到数据再刷新到内存再返回数据。磁盘相比于内存来说速度是很慢的为了提升性能就出现了基于内存的缓存。这种基于内存的缓存由于无法跟磁盘频繁进行存储所以无法保证数据的完整性随时有可能丢失所以架构一般使用数据库加缓存的方式数据库用来持久化数据缓存用来处理大流量。2 本地缓存和集中式缓存缓存按照存储方式可以分为这本地缓存和集中式缓存。本地缓存顾名思义就是存储在本地上例如静态变量就可以说是一种本地缓存存储在了JVM中或者说自己本地搭建的项目用的redis也算是本地缓存因为缓存和应用都在一台机器上。本地缓存效率很高直接读取内存没有网络延迟但是可用性很低因为出现单点故障的话数据库和系统都会宕机。对于大型项目来说都会有集中式缓存例如redis集群。缓存和应用服务器是分离的服务器需要通过网络请求从缓存获取数据一般应用服务器也会采取集群的方式这样可以保证高可用数据不易丢失而且也能保证各个服务器的缓存数据一致。对于分布式应用来说本地缓存还会出现缓存不一致的问题因为每个服务器的本地缓存都是独立的。3 本地缓存的优点刚才说了这么多本地缓存的缺点那为什么还要用呢因为如果都放在集中式缓存中网络延迟会成为性能的瓶颈。因为不在本地内存读取的时间需要加上网络通信的时间。所以在对性能要求更大或者缓存内容不需要持久化、不需要一致性的情况下本地缓存更适合。所以一般的大型项目都采用本地缓存和集中式缓存混合使用的方式。4 Spring对于缓存的支持终于说到正题本地缓存可以通过spring更简单的管理和使用。springboot和springmvc都支持缓存其中CacheManager是Spring提供的缓存接口。4.1 spring支持的CacheManagerCacheManager描述SimpleCacheManager使用简单的 Collection 来存储缓存主要用于测试ConcurrentMapCacheManager使用 ConcurrentMap 来存储缓存NoOpCacheManager仅测试用途不会实际缓存数据EhCacheCacheManager使用 EhCache 作为缓存技术GuavaCacheManager使用 Google Guava 的 GuavaCache 作为缓存技术HazelcastCacheManager使用 Hazelcast 作为缓存技术JCacheCacheManager支持 JCache(JSR-107) 标准的实现作为缓存技术如 ApacheCommonsJCSRedisCacheManager使用 Redis 作为缓存技术看着非常多实际上正常用的只有ConcurrentMapCacheManagerEhCacheCacheManagerGuavaCacheManager一般使用redis我们需要更灵活的对redis键值进行操作所以不用RedisCacheManager我们重点去讲一下这个GuavaCacheManager。4.2 GuavaCacheGuava是谷歌开源的Java库其中的代表就有这个缓存。GuavaCache的原理大概是LRUConcurrentHashMap加载在JVM的本地缓存4.3 引入依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-cache/artifactId/dependency
dependencygroupIdcom.google.guava/groupIdartifactIdguava/artifactIdversion18.0/version
/dependency
//有可能需要这个
dependencygroupIdorg.springframework/groupIdartifactIdspring-context-support/artifactIdversion4.2.5.RELEASE/version
/dependency4.4 创建配置类EnableCaching
Configuration
public class GuavaCacheConfig {Beanpublic CacheManager cacheManager() {GuavaCacheManager cacheManager new GuavaCacheManager();cacheManager.setCacheBuilder(CacheBuilder.newBuilder().expireAfterWrite(3, TimeUnit.MINUTES));return cacheManager;}
}EnableCaching用来开启注解功能这里设置的失效时间是3分钟。Guava Cache 除了代码中提到的设置缓存过期时间的策略外还有其他的策略。下面是 Guava Cache 设置缓存过期时间的策略expireAfterAccess: 当缓存项在指定的时间段内没有被读或写就会被回收。expireAfterWrite当缓存项在指定的时间段内没有更新就会被回收,如果我们认为缓存数据在一段时间后数据不再可用那么可以使用该种策略。refreshAfterWrite当缓存项上一次更新操作之后的多久会被刷新。4.5 缓存注解标题终于出现了注解解释Cacheable在方法执行前 Spring 先查看缓存中是否有数据若有则直接返回缓存数据若无数据调用方法将方法返回值放入缓存中CachePut无论怎样都会将方法的返回值放到缓存中。CacheEvict将一条或多条数据从缓存中删除Caching可以通过 Caching 注解组合多个注解策略在一个方法上我这里就主要解释下Cacheable的用法因为这个比较常见其他的我也没用过4.6 Cacheable的用法常用参数有参数解释value名字1key名字2condition条件判断condition#id1表示id大于1的才缓存unless条件判断 unless#id1表示id等于1的不缓存#代表的是EL表达式这里的key和value和我们以为的缓存键值对是不一样的valuekey 只是我们缓存键的名字真正的值是方法的返回值。举一个例子 Cacheable(value olympic_match_new_action,key get_relate_news_#rsc)public ListMatchNewsVO getRelateNews(String rsc){.... }一般value取service名key取方法名取名按照数据库的下划线方式。后面那个#rsc指的是传进来的参数这些都是键。返回的List就是缓存的值。5 Cacheable失效的原因在配置正常的情况下本人亲历的失效原因就是一个类的方法调用了带有缓存的方法结果缓存失效。我使用service的A方法想调用这个service的缓存B方法这样是不行的。原因是Cacheable是由AOP代理实现生成了带有缓存的代理类。其他类想调用这个类的缓存方法时会去调用这个代理类的方法实现缓存功能。但是类内部调用这个方法就不会去调用代理类的方法导致缓存失效6 总结网上关于spring本地缓存的文章很少很杂我稍微总结了一下发了出来有自己的理解也有网上的摘抄。难免会有错误希望大家指正