java清缓存前可以进后台方法,清完缓存不进了

Python023

java清缓存前可以进后台方法,清完缓存不进了,第1张

关于java清缓存前可以进后台方法,清完缓存不进了相关资料如下

java我们在使用缓存时,往往先尝试去缓存中取值,如果没有,再去数据库取值,如果数据库也没有值,则根据业务需求,返回空或者抛异常。

如果用户一直访问一个数据库不存在的数据,比如id为-1的数据,就会导致每次请求都会先去缓存查一次,然后再去数据库查一次,造成严重的性能问题。这种情况就叫缓存穿透。

解决方案

以下几种解决方案:对请求参数做校验,比如用户鉴权校验,id做基础校验,id <= 0的直接拦截。

如果查询到数据库没有值,也将对应的key存进缓存中,value为null。这样下次查询就直接从缓存返回了。但这里的key的缓存时间应该比较短,比如30s。防止后面在数据库插入了这条数据,而用户获取不到。

使用布隆过滤器,判断一个key是否已经查过了,如果已经查过了,就不去数据库查询。

缓存击穿

缓存击穿指的是,一个key的访问量非常大,比如某秒杀活动,有1w/s的并发量。这个key在某一时刻过期,那这些大量的请求就会一瞬间到数据库,数据库可能会直接崩溃。

解决方案

缓存击穿的解决方案也有几种,可以配合使用:对于热点数据,慎重考虑过期时间,确保热点期间key不会过期,甚至有些可以设置永不过期。

使用互斥锁(比如Java的多线程锁机制),第一个线程访问key的时候就锁住,等查询数据库返回后,把值插入到缓存后再释放锁,这样后面的请求就可以直接取缓存里面的数据了。

缓存雪崩

缓存雪崩指的是,在某一时刻,多个key失效。这样就会有大量的请求从缓存中获取不到值,全部到数据库。还有另一种情况,就是缓存服务器宕机,也算做缓存雪崩。

解决方案

针对上述两种情况,缓存雪崩有两种解决方案:对每个key的过期时间设置一个随机值,而不是所有key都相同。

使用高可用的分布式缓存集群,确保缓存的高可用性,比如redis-cluster。

一、什么是缓存

1、Cache是高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问

2、凡是位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为 Cache

常见的缓存技术有哪些?

一、操作系统缓存

1、文件系统提供的Disk Cache:操作系统会把经常访问到的文件内容放入到内存当中,由文件系统来管理

2、当应用程序通过文件系统访问磁盘文件的时候,操作系统从Disk Cache当中读取文件内容,加速了文件读取速度

3、Disk Cache由操作系统来自动管理,一般不用人工干预,但应当保证物理内存充足,以便于操作系统可以使用尽量多的内存充当Disk Cache,加速文件读取速度

4、特殊的应用程序对文件系统Disk Cache有很高的要求,会绕开文件系统Disk Cache,直接访问磁盘分区,自己实现Disk

5、Cache策略

Oracle的raw device(裸设备) – 直接抛弃文件系统

MySQL的InnoDB: innodb_flush_method = O_DIRECT

二、数据库缓存

缓存策略:a、Query Cache;  b、Data Buffer

三、应用程序缓存

包括对象缓存、查询缓存、页面缓存

四、web服务器端缓存

基于代理服务器模式的Web服务器端缓存,如squid/nginx

Web服务器缓存技术被用来实现CDN(内容分发网络 content delivery network)

被国内主流门户网站大量采用

不需要编程,但仅限于新闻发布类网站,页面实时性要求不高

五、基于ajax的浏览器缓存

使用AJAX调用的时候,将数据库在浏览器端缓存

只要不离开当前页面,不刷新当前页面,就可以直接读取缓存数据

只适用于使用AJAX技术的页面