当前位置:首页 > 实用技巧 >

服务器缓存出问题怎么办(缓存服务器连接异常怎么处理)

来源:原点资讯(www.yd166.com)时间:2023-07-31 14:36:38作者:YD166手机阅读>>

前言

使用缓存可以缓解大流量压力,显著提高程序的性能。我们在使用缓存系统时,尤其是大并发情况下,经常会遇到一些“疑难杂症”。本文总结了一些使用缓存时常见的问题及解决方案,以后在遇到这类问题时可以作为参考,在设计缓存系统的时候也应该考虑这些常见的情况。

为了表述方便,本文以数据库查询缓存为例,使用缓存可以减小对数据库的压力。

服务器缓存出问题怎么办,缓存服务器连接异常怎么处理(1)

缓存穿透

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

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

解决方案

以下几种解决方案:

  • 对请求参数做校验,比如用户鉴权校验,id做基础校验,id <= 0的直接拦截。
  • 如果查询到数据库没有值,也将对应的key存进缓存中,value为null。这样下次查询就直接从缓存返回了。但这里的key的缓存时间应该比较短,比如30s。防止后面在数据库插入了这条数据,而用户获取不到。
  • 使用布隆过滤器,判断一个key是否已经查过了,如果已经查过了,就不去数据库查询。

服务器缓存出问题怎么办,缓存服务器连接异常怎么处理(2)

缓存击穿

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

解决方案

缓存击穿的解决方案也有几种,可以配合使用:

  • 对于热点数据,慎重考虑过期时间,确保热点期间key不会过期,甚至有些可以设置永不过期。
  • 使用互斥锁(比如Java的多线程锁机制),第一个线程访问key的时候就锁住,等查询数据库返回后,把值插入到缓存后再释放锁,这样后面的请求就可以直接取缓存里面的数据了。
缓存雪崩

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

解决方案

针对上述两种情况,缓存雪崩有两种解决方案:

  • 对每个key的过期时间设置一个随机值,而不是所有key都相同。
  • 使用高可用的分布式缓存集群,确保缓存的高可用性,比如redis-cluster。

服务器缓存出问题怎么办,缓存服务器连接异常怎么处理(3)

双写不一致

在使用数据库缓存的时候,读和写的流程往往是这样的:

  • 读取的时候,先读取缓存,如果缓存中没有,就直接从数据库中读取,然后取出数据后放入缓存
  • 更新的时候,先删除缓存,再更新数据库

所谓双写不一致,就是在发生写操作(更新)的时候或写操作之后,可能会存在数据库里面的值和缓存中的值不同的情况。

为什么更新的时候要先删除缓存,再更新数据库?因为如果先更新数据库,然后在删除缓存的时候失败了,就会造成缓存里面的值和数据库的值不一致。

然而这样并不能完全避免双写不一致问题。假设在大并发情景下,一个线程先删除缓存,然后取更新数据库,这个时候另一个线程去取缓存,发现没有值,于是去读数据库,然后把数据库旧的值设置进缓存。等第一个线程更新完数据库后,数据库里面就是新的值,而缓存里面是旧的值,所以就存在了数据不一致的问题。

一个比较简单的解决办法是把过期时间设置得比较低,这样就只有在缓存没过期之前存在数据不一致问题,在一些业务场景下也还能接受。

另一种解决方案是使用队列辅助。先更新数据库,再删除缓存。如果删除失败,就放进队列。然后另一个任务从队列中取出消息,不断去重试删除相应的key。

还有一种解决方案是使用对一个数据使用一个队列,使读写操作串行化。比如对id为n的数据建立一个队列。对这条数据的写操作,删除缓存后,放进一个队列;然后另一个线程过来了,发现没有缓存,则把这个读操作也放进这个队列里面。

不过这样会增加程序的复杂性,串行化也会降低程序的吞吐量,可能得不偿失。一般主流的解决方案还是先删除缓存,再更新数据库。可以满足绝大部分需求。

最后

欢迎大家一起交流,喜欢文章记得关注点赞转发哟,感谢支持!

栏目热文

本地服务器受限怎么办(服务器无法正常使用该怎么办)

本地服务器受限怎么办(服务器无法正常使用该怎么办)

首先,打开网络共享中心。点击访问类型点击下面的属性找到了Internet协议版本4(TCP / IP)的选项点击进入选择...

2023-07-31 14:09:47查看全文 >>

无法访问本地服务器(怎样访问本地服务器)

无法访问本地服务器(怎样访问本地服务器)

工作和生活中,我们难免会遇到这样的问题:这种情况出现时,如何快速定位排查呢?一、了解什么是域名 VS IP1、什么是域名...

2023-07-31 14:15:35查看全文 >>

服务器缓存过多怎么处理

服务器缓存过多怎么处理

前两天我的服务器突然告警提示我的内存占用过高,使用率高达94.3%。当时我就有点纳闷了,服务器配置互联网服务器是4核8G...

2023-07-31 14:11:49查看全文 >>

服务器缓存清不掉(服务器清理内存缓存方法)

服务器缓存清不掉(服务器清理内存缓存方法)

DNS 缓存是一个临时数据库,用于存储有关以前的 DNS 查找的信息。换句话说,每当你访问网站时,你的操作系统和网络浏览...

2023-07-31 14:02:16查看全文 >>

缓存服务器连接异常怎么处理

缓存服务器连接异常怎么处理

使用计算机的时候,经常会遇到各种问题导致的无法上网、网速慢、连接异常等问题,多数情况,都是缓存导致的,通过刷新缓存,可以...

2023-07-31 14:43:30查看全文 >>

缓存服务器怎么设置(怎样搭建缓存服务器)

缓存服务器怎么设置(怎样搭建缓存服务器)

生产环境只有一个主服务器往往是不够的 一个域的从服务器通常是为了备份及负载均衡使用 所有这些域的信息都有域的主服务器控...

2023-07-31 14:05:58查看全文 >>

本地服务器异常该怎么办(服务器异常是什么情况)

本地服务器异常该怎么办(服务器异常是什么情况)

互联网时代,无论是个人还是企业,都在使用服务器。在使用服务器的过程中,可能大家都会遇到这样那样的问题,服务器虽然出现故障...

2023-07-31 14:01:33查看全文 >>

什么是缓存服务器错误(服务器缓存占用高是怎么回事)

什么是缓存服务器错误(服务器缓存占用高是怎么回事)

Bianews 6月12日消息,今日有媒体爆料称,比特儿数据显示错误,出现“钱包资金显示的钱少了很多”的情况,有人猜测比...

2023-07-31 14:06:44查看全文 >>

服务器缓存不足是什么原因(服务器内存占用过高怎么办)

服务器缓存不足是什么原因(服务器内存占用过高怎么办)

跑满是什么原因造成的呢?相信大家在使用服务器的时候会有出现内存使用率比较高的情况,那这边壹基比六六给大家说下到底有哪些原...

2023-07-31 14:48:54查看全文 >>

服务器增加内存服务无法启动(服务器配置正常无法启动)

服务器增加内存服务无法启动(服务器配置正常无法启动)

进入信息时代,各种行业对数据的安全和技术要求也越来越高,同时也遇到了各种各样的服务器故障问题,虽然能够接到服务器厂商的支...

2023-07-31 14:14:02查看全文 >>

文档排行