`

缓存穿透(预设值防止多个进程读取数据库)、缓存并发、缓存失效(过期时间用随机数)学习

 
阅读更多
一、缓存穿透
我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了。

那这种问题有什么好办法解决呢?

要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
有一个比较巧妙的作法是,可以将这个不存在的key预先设定一个值。
比如,”key” , “&&”。
在返回这个&&值的时候,我们的应用就可以认为这是不存在的key,那我们的应用就可以决定是否继续等待继续访问,还是放弃掉这次操作。如果继续等待访问,过一个时间轮询点后,再次请求这个key,如果取到的值不再是&&,则可以认为这时候key有值了,从而避免了透传到数据库,从而把大量的类似请求挡在了缓存之中。

二、缓存并发
有时候如果网站并发访问高,一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况,如果并发确实很大,这也可能造成DB压力过大,还有缓存频繁更新的问题。

想法是对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询。

这种情况和刚才说的预先设定值问题有些类似,只不过利用锁的方式,会造成部分请求等待。

三、缓存失效
引起这个问题的主要原因还是高并发的时候,平时我们设定一个缓存的过期时间时,可能有一些会设置1分钟啊,5分钟这些,并发很高时可能会出在某一个时间同时生成了很多的缓存,并且过期时间都一样,这个时候就可能引发一当过期时间到后,这些缓存同时失效,请求全部转发到DB,DB可能会压力过重。

那如何解决这些问题呢?
其中的一个简单方案就时讲缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。


分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    在父进程中生成两个子进程,read,write,读写10个随机数

    在父进程中生成两个子进程,一个子进程运行程序read,另一个子进程...read程序的功能是创建一个管道,从管道读取10个数字并判断其是偶数还是奇数,write程序的功能是每隔1秒钟往管道写入一个随机数,共写入10个随机数

    随机数产生与读取

    在计算机科学和编程领域,随机数的生成与读取是一项基础但至关重要的任务。随机数在各种应用中都有广泛的应用,比如模拟仿真、加密算法、游戏开发、统计分析等。本话题将深入探讨如何在系统中自动生成随机数以及如何...

    加随机数引入脚本不让浏览器读取缓存

    在网页开发中,为了确保页面中的脚本文件总是从服务器获取最新版本,避免浏览器使用旧的缓存版本,开发者有时会采用在脚本引入路径后添加一个随机数的方法。这种方式可以有效地防止浏览器读取缓存,确保每次加载时...

    1_1. 产生100个随机数_求其最小值和最大值以及平均值_

    在这个主题中,我们将探讨如何在不同编程语言中生成100个随机数,并计算它们的最小值、最大值和平均值。 首先,让我们从Python开始,这是一种广泛使用的高级编程语言,非常适合这种数据处理任务。在Python中,我们...

    matlab函数文件,构造N个随机数的总和为某个值

    这里提到的`makeGDSum.m`和`makeGDSum2.m`都是这样的函数文件,分别用于生成N个随机数,使得这些随机数的总和等于给定的值。这两个函数在生成随机数时可能有不同的策略或附加条件。 `makeGDSum.m`函数的基本工作...

    java从数组获取多个随机数

    从数组获取多个随机数

    C#随机数生成并排序然后插入数据库

    你可以通过指定种子值(通常是当前时间)创建`Random`对象,然后调用`Next()`方法来获取一个指定范围内的随机整数。例如,以下代码将生成一个介于1到100之间的随机数: ```csharp Random random = new Random(); ...

    易语言写的取多个随机数与排序的示例程序

    例如,如果使用内置函数,你可以先创建一个包含多个随机数的数组,然后调用`数组排序()`函数对数组进行升序或降序排序。如果你想要实现自定义的排序算法,如冒泡排序,你需要逐个比较数组元素并交换它们的位置,直到...

    [Labview]产生 100 个随机数,求其最小值和平均值。

    [Labview]产生 100 个随机数,求其最小值和平均值。

    MFC进程产生20个线程产生随机数求平均值

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库在进程中创建20个线程,每个线程负责生成1到3个随机数并计算它们的平均值。MFC是Microsoft为Windows应用程序开发提供的一套C++类库,它封装了...

    [Labview]产生 100 个随机数,求其最小值和平均值。.zip

    本实验中,我们关注的是如何使用LabVIEW来产生100个随机数,并计算这些随机数的最小值和平均值。 1. **生成随机数**: - LabVIEW提供了“随机数发生器”函数库,用于生成不同类型的随机数,如均匀分布、正态分布等...

    易语言取十个随机数

    现在,我们要生成十个随机数,我们可以使用循环结构来实现。在易语言中,`重复` 语句是常用的循环结构之一。下面是一个生成十个1到100之间随机数的例子: ```易语言 .数组(10) // 初始化一个10个元素的数组 重复 ...

    Labview应用技术 n个随机数的最大最小值(FOR课堂实训)1.docx

    本实训项目旨在通过实现求取n个0到100范围内随机数的最大值和最小值,帮助学习者熟悉LabVIEW中的FOR循环结构及其在实际问题中的应用。 在LabVIEW中,FOR循环是一种控制结构,用于执行固定次数的循环。在本实训项目...

    操作系统作业(进程控制管理实现)

    随机方法指产生1-6的随机数,分别代表创建进程(c)、结束进程(e)、进程阻塞(b)、激活进程(w)、调度进程(p)、时间片到(t)等事件;键盘模拟方法指定义6种按键代表以上6种事件。 3、 根据四种事件处理就绪队列、阻塞...

    易语言取随机数的两种方法比较

    但需要注意的是,这个函数生成的随机数是伪随机数,即它们看起来是随机的,但实际上是根据一个初始值(称为种子)计算出来的。如果种子相同,生成的随机数序列也将相同,因此在需要更高质量随机数或不可预测性的场景...

    生成随机数--可输入最大值

    这个程序允许用户自定义生成随机数的最大值,也可以在代码内部预设一个特定的范围。下面我们将深入探讨如何使用C#生成随机数以及如何进行相关定制。 首先,C#中的`System.Random`类是我们生成随机数的主要工具。这...

    c#并发环境下生成随机数封装类

    用于在并发环境下生成随机数,系统默认的多线程情况生成的随机数是相同的

    以时间为种子生成随机数

    在计算机科学中,随机数是各种算法和模拟中不可或缺的一部分,它们被广泛应用于加密、游戏开发、统计模拟、机器学习等领域。"以时间为种子生成随机数"是一种常见的做法,确保每次程序运行时都能得到不同的随机序列,...

    kettle 生成随机数.ktr

    生成 100 个随机数,随机数取值于[0,100)之间, 计算小于等于 50 的随机数个数和 大于50 的随机数个 数。 并把这两个统计数字放在数据库表的一行的两列中, 即输出的结果有一行,一行包括两列,每列是一个统 计值...

Global site tag (gtag.js) - Google Analytics