查询不存在的数据库值,例如负ID,这会导致所有请求击中DB
捕获渗透是指查询根本不存在的数据。缓存层和存储层均未击中。通常可以通过容忍度来考虑它。如果无法从存储层找到数据,则未写入缓存层。
缓存渗透将导致不存在的数据到达存储层每次查询,失去缓存保护的后端存储的含义。有两个基本原因是缓存渗透的基本原因:
缓存渗透问题解决方案:缓存短对象,开花过滤器
对于恶意攻击,请求由服务器大量数据引起的大量数据。您还可以使用Bloom过滤器首先进行过滤。发送后端。Bloom滤波器说存在某个值时,可能不存在此值;当它不存在时,它一定不存在。
Bloom滤波器是一个大数组和几个不同的无偏哈希功能。所谓的非偏见是能够更均匀地计数元素的哈希值。
当键添加到Bloom滤波器中时,使用多个哈希功能来计算键的整数索引值,并计算数组长度的位置以获得位置。每个哈希函数将被视为不同的位置。添加操作已在数组的位置为1的位置完成。
当询问钥匙询问键是否存在时,与添加相同的情况将计算哈希的位置,以查看数组中的位置是否为1,只要一个位是0,则表示它意味着它意味着它意味着该位置Bloom过滤器中的钥匙不存在。如果是全部1,这并不表示必须存在此键,但是这些位很可能是由其他键引起的。如果这个数字相对稀疏,则这种概率将非常高。如果此位阵列拥挤,则可能会降低概率。
此方法适用于数据命中率低,相对固定数据和较低的真实时间(通常大数据集)的应用程序方案。代码维护更为复杂,但是缓存空间很小。
您可以使用Redisson实现Bloom过滤器来引入依赖性:
示例伪代码:
使用Bloom过滤器将所有数据提前放入BLOOM过滤器中,并在添加数据时将其放入Bloom过滤器中。
注意:如果要删除以重新启动数据,则Bloom过滤器无法删除数据。
所有关键故障,这会导致数据库的即时压力增加
由于同一时间的大量电感可能会导致大量请求同时穿透数据库的吞咽,因此可能导致数据库的即时压力太大甚至挂断。在这种情况下,我们最好在缓存中缓存时增加此批次数据的缓存。到期时间在一个时间段内设置为不同的时间。
示例伪代码:
缓存不可用,导致所有请求到存储层
缓冲区防线意味着在缓存层无法支撑或下降之后,流量将就像跑步野牛并撞到后存储层。
由于缓存层带有大量请求,因此存储层有效地受到保护,但是如果缓存层由于某些原因无法提供服务(例如超大并发性,请缓存层不能支持它,或者因为高速缓存设计不好,它类似于大量请求。导致缓存急剧支持的并发减少),因此将大量请求击中存储层。存储层的调用将涌现,从而导致存储层。
防止和解决雪崩问题可以从以下三个方面开始。
使用“缓存+到期时间”开发人员的策略可以加速数据读取和写作,并确保定期更新数据。该模型基本上可以满足大多数需求。但是,如果同时存在两个问题,则可能对应用造成致命伤害:
在缓存故障的那一刻,有大量的线程可以重建缓存,导致背部负载增加,甚至可能导致应用程序崩溃。
为了解决这个问题,最主要的是避免同时重建缓存的大量线程。我们可以使用相互锁来解决。此方法仅允许一个线程重建缓存。其他线程正在等待重建缓存的线程执行,并且可以从缓存获得数据。
示例伪代码:
在大型并发下,操作数据库和缓存将存在数据不一致问题
1.双重写作不一致之处
2.阅读和写作不一致
1.定时活动更新(例如产品列表):对于具有较小概率的数据(例如订单数据,用户数据等),此问题几乎无需考虑此问题。每次都会触发阅读的内容。
2.即使高度并发,也会增加缓存到期时间。如果企业可以忍受短期缓存数据(例如产品名称,产品分类菜单等),则缓存和到期时间仍然可以解决大多数企业对缓存的要求。
3.如果无法容忍缓存数据,则可以通过添加分布式读取和写作锁定以确保并发阅读,写作或写作来对其进行排列。阅读时,它等效于没有锁。
4.您还可以使用Ali的开源管来通过监视数据库中的Binlog日志来修改缓存,但引入了新的中间部件以增加系统的复杂性。
以上是我们针对阅读越来越少的情况,添加缓存以提高性能。如果更多阅读和更多阅读的情况无法忍受不一致的缓存数据,则无需添加缓存,并且可以直接操作数据库。当然,如果数据库无法抵抗压力,您也可以使用缓存。随着数据的主要存储读取和写入,并将数据同步到数据库异步。该数据库仅用作数据备份。
在缓存中放置的数据应该是实际时间和一致要求的数据。系统!
集合上方的各种问题和完成计划,我通常为多层缓存设计绘制流程图。欢迎讨论。
总的来说,实际上,为了强大的一致性,系统的高性能是平衡,因为所有系统都不是完美的,我们需要将项目的当前状况结合起来以折叠。