缓存相关问题
对于缓存,我们主要关心两个:缓存的命中率,数据的一致性。由此又会有一些缓存引起的问题,缓存击穿、穿透、雪崩。对于这些问题也是我们在使用缓存时不得不考虑的 。这些问题的解决方案也有很多。这里简单列举几个:
(1)针对无效数据穿透,多级拦截:
无效数据,空数据,进行多种手段拦截,如布隆过滤器、业务参数有效性判断、缓存空值等等。多种手段拦截就是让流量最后无法穿透到最薄弱的底层服务。
(2)针对高并发热点key击穿,两阶段失效:
对于高并发的热点key,做逻辑和物理两阶段失效策略,逻辑失效前端响应仍然立即返回,仅异步排队去底层服务或DB获取数据并刷新缓存。
(3)缓存降级,限流排队,多级缓存:
缓存由于各种原因不可用,如果无任何措施,势必会出现雪崩的现象,为了尽可能保证业务服务可用或者部分可用,则必须对缓存允许降级,即便缓存中间件连接异常,宕机等,仍然可以去底层的服务和DB获取数据,常用手段一般是二级、甚至三级缓存,最后就是加锁排队访问底层服务。
(4)失效时间随机
往往热key都是在同一个时间点(短暂的时间段)创建的,如果固定有效时长,则失效将在同一个时间点,当失效发生时,雪崩的可能性很大。在业务要求的失效时间点上,加上随机时长(范围),可以分散热key失效时间点。
缓存击穿、穿透和雪崩是与缓存相关的常见问题。它们是在使用缓存时可能遇到的一些挑战和风险。下面是对这些问题的解释以及相应的实际例子:
1.缓存击穿: 缓存击穿指的是在缓存中不存在但是频繁被请求的数据,导致请求绕过缓存直接访问数据库或其他数据源,增加了后端负载。这通常发生在缓存中的数据过期或被删除时。
例子:假设一个电子商务网站的商品详情页被频繁访问,并且每次访问都会从数据库中获取商品信息。如果某个商品的缓存过期,而此时有大量用户请求该商品的详情页,这些请求将绕过缓存直接访问数据库,导致数据库负载过高。
1.缓存穿透: 缓存穿透指的是请求的数据在缓存和数据源中都不存在,这将导致每次请求都需要访问数据源,增加了后端负载。这通常是由于恶意或无效的请求导致的。
例子:假设一个新闻网站允许用户根据新闻ID获取新闻内容。如果有恶意用户通过构造不存在的新闻ID来频繁请求新闻内容,而这些请求都无法命中缓存或找到相应的数据,每次请求都需要访问数据库,造成了无谓的资源浪费。
1.缓存雪崩: 缓存雪崩指的是缓存中大量的数据同时过期或失效,导致大量请求直接访问数据源,造成后端系统的压力过大甚至崩溃。
例子:假设一个电商网站的商品列表页的缓存时间都设置为相同的时间,当缓存过期时,大量用户同时请求商品列表页,这些请求将直接访问数据库,导致数据库负载激增,甚至可能导致数据库崩溃。
为了解决这些问题,可以采取以下措施:
•对于缓存击穿,可以通过在缓存中设置短暂的过期时间或使用互斥锁的方式来避免。当某个数据过期时,只允许一个请求去重新加载数据到缓存中,其他请求等待。
•对于缓存穿透,可以在缓存中设置一个特殊的值,表示数据不存在,并将该值缓存一段时间。这样,当恶意请求到来时,可以直接从缓存中返回这个特殊值,而不需要访问数据源。
•对于缓存雪崩,可以采用多级缓存、缓存数据的不同过期时间或使用热点数据预加载等策略。这样可以减少缓存同时失效的概率,分散请求对后端系统的冲击。
需要根据具体情况和使用的缓存系统来选择合适的解决方案。
布隆过滤器(Bloom Filter)
是一种空间效率很高的概率型数据结构,用于判断一个元素是否属于一个集合。它通过使用多个哈希函数和位数组来判断元素是否存在,可以快速地进行查找和过滤。
以下是一个简单的布隆过滤器的示例代码:
python
CopyReplace
import mmh3from bitarray import bitarray
classBloomFilter:def__init__(self, size, hash_functions):self.size = sizeself.hash_functions = hash_functionsself.bit_array = bitarray(size)self.bit_array.setall(0)defadd(self, item):for fn in self.hash_functions:index = mmh3.hash(item, fn)% self.sizeself.bit_array[index]=1defcontains(self, item):for fn in self.hash_functions:index = mmh3.hash(item, fn)% self.sizeif self.bit_array[index]==0:returnFalsereturnTrue
# 创建一个布隆过滤器实例
size =10 # 位数组的大小
hash_functions =[1,2,3] # 哈希函数的数量
bloom_filter = BloomFilter(size, hash_functions)
# 添加元素到布隆过滤器
bloom_filter.add("apple")
bloom_filter.add("banana")
bloom_filter.add("orange")
# 检查元素是否存在于布隆过滤器print(bloom_filter.contains("apple")) # 输出: Trueprint(bloom_filter.contains("grape")) # 输出: False
在这个示例中,BloomFilter类表示布隆过滤器。在初始化过程中,我们指定了位数组的大小和哈希函数的数量。bitarray库用于创建位数组,并使用mmh3哈希函数库来生成哈希值。
add方法用于将元素添加到布隆过滤器中。它使用每个哈希函数对元素进行哈希,并将对应的位数组位置置为1。
contains方法用于检查元素是否存在于布隆过滤器中。它使用每个哈希函数对元素进行哈希,并检查对应的位数组位置是否为1。如果有任何一个位置为0,则说明元素不在布隆过滤器中。
在示例中,我们创建了一个布隆过滤器实例,添加了几个元素,并检查了其中的一些元素是否存在于布隆过滤器中。
需要注意的是,布隆过滤器存在一定的误判率(False Positive),即可能会判断某个元素存在于集合中,但实际上并不存在。因此,在使用布隆过滤器时,需要根据具体应用场景和数据量来选择合适的位数组大小和哈希函数数量,以控制误判率。
相关文章:
缓存相关问题
对于缓存,我们主要关心两个:缓存的命中率,数据的一致性。由此又会有一些缓存引起的问题,缓存击穿、穿透、雪崩。对于这些问题也是我们在使用缓存时不得不考虑的 。这些问题的解决方案也有很多。这里简单列举几个: &am…...
arrow(c++)改写empyrical系列1---用arrow读取基金净值数据并计算夏普率
用arrow c版本读取了csv中的基金净值数据,然后计算了夏普率,比较尴尬的是,arrow c版本计算耗费的时间却比python的empyrical版本耗费时间多。。。 arrow新手上路,第一次自己去实现功能,实现的大概率并不是最高效的方…...
Mathematica强制将函数的自变量由符号转为数值
问题 使用Mathematcia完成函数优化(FindMaximum)十分方便。但是如果优化的目标函数非常复杂,里面嵌套了若干NSolve函数,那么FindMaximum可能会计算非常长时间,甚至无法得到正确结果。 原因在于,Mathemtic…...
【wps】记录
1、ppt背景图片上的字体怎样消除? 打开PPT要删除文字的PPT后,依次点击视图→母版视图→幻灯片母版。 在幻灯片母版的左侧,选择版式页面,在母版的右侧选择要删除的文字,删除即可 点击“关闭母版视图”即可退出幻灯片…...
扩散模型学习
第一章 1.1 的原理 给定一批训练数据X,假设其服从某种复杂的真实 分布p(x),则给定的训练数据可视为从该分布中采样的观测样本x。 生成模型就是估计训练数据的真实分布,使得估计的分布q(x)和真实分布p(x)差距尽可能能的小。 使得所有训练…...
解决方法:从客户端(---<A href=“http://l...“)中检测到有潜在危险的 Request.Form 值。
从客户端(-----<A href"http://l...")中检测到有潜在危险的 Request.Form 值。 解决方法:应该是不同的.net Framework版本对代码的校验不同,造成在高版本操作系统(即高.net Framework版本校验)不兼容,可…...
Linux shell编程学习笔记14:编写和运行第一个shell脚本hello world!
* 20231020 写这篇博文断断续续花了好几天,为了说明不同shell在执行同一脚本文件时的差别,我分别在csdn提供线上Linux环境 (使用的shell是zsh)和自己的电脑上(使用的shell是bash)做测试。功夫不负有心人&am…...
隐式类型转换
什么是隐式类型转换,多参数的造函数隐式类型转换,和单参数的构造函数隐式类型转换有什么区别 C中有三种主要的隐式类型转换: 1:多参数的构造函数隐式类型转换 2:单参数的构造函数隐式类型转换 3:成员函数隐式类型转换。…...
单例模式:饿汉式、懒汉式
一、单例模式 定义:一个类中的对象只能有一个,它在内存中只会创建一次对象的设计模式。 用法:在程序中如果多次用到同一个类中的方法进行操作时,在使用时就会创建多个对象。为了防止频繁创建对象造成内存资源浪费,就可…...
“人间烟火”背后,长沙招商引资再出圈
连续多年,长沙荣膺全国最具幸福感城市。同时,长沙也被誉为“中部崛起的引擎城市”。长沙不仅有网红城市的人间烟火气,更以创新的精神,优质的营商环境,高效的政府服务,丰富的人才资源和深厚的产业基础&#…...
操作系统【OS】中断和异常
异常(内中断) 中断(外中断) 基本概念 由CPU执行指令内部产生的事件内中断都是不可屏蔽中断,一旦出现,就要立即处理。 由来自CPU外部的设备发出的中断请求(常用于输入输出)典型的由…...
[AutoSAR系列] 1.1 AutoSar 发展历史
AUTOSAR,全称为Automotive Open System Architecture,即汽车开放系统架构。 AutoSar 是一项开源的汽车软件标准,旨在提高汽车电子系统的互操作性和可重用性。AutoSar 成员通常是汽车制造商、电子元件制造商、软件供应商和工具供应商等公司,他们在共同开发和推进 AutoSar 标…...
【vscode编辑器插件】前端 php unity自用插件分享
文章目录 一篇一句前言前端vuegitphpunity后端其他待续完结 一篇一句 “思考是最困难的工作,这也许是为什么很少有人这样做。” - 亨利福特(Henry Ford) 前言 无论是什么语言,我都会选择使用vscode进行开发,我愿称v…...
【企业级SpringBoot单体项目模板 】—— 项目代码管理
😜作 者:是江迪呀✒️本文关键词:SpringBoot项目模版、企业级、模版、代码管理☀️每日 一言:生命力顽强的种子,从不对瘠土唱诅咒的歌。 文章目录 一、第一种:先创建仓库1.1 创建仓库1.2 clone…...
Python读取Excel文件中指定的列数并生成CSV文件
0x00 安装Pandas和OpenPyXL pip install pandaspip install openpyxl0x01 Encoding import os import pandas as pd import openpyxl from openpyxl import load_workbook import csvdef write_dict_to_csv(dict_data, fileName):df pd.DataFrame.from_dict(dict_data)# 将D…...
MySQl有哪些索引(种类)?索引特点?为什么要使用索引?
普通索引:仅加速查询唯一索引:加速查询 列值唯一(可以有null)主键索引:加速查询 列值唯一(不可以有null) 表中只有一个组合索引:多列值组成一个索引,专门用于组合搜索&…...
49数码论坛系统设计与实现
大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…...
蓝桥杯每日一题2023.10.19
题目描述 完全二叉树的权值 - 蓝桥云课 (lanqiao.cn) 题目分析 我们以每一个节点的坐标来将这一深度的权值之和相加从而算出权值和 要清楚每一个深度的其实节点和末尾节点,使用双指针将这个深度节点的权值和计算出来,记录所 需要的深度即可 #includ…...
NIO IN:技术蔚来的首次「大阅兵」
宝山,上海第一钢铁厂旧址。 上周,蔚来在这里点亮金色炉台,2500 立方米高炉,浓重的工业气质与古典凝重的光影交织,蔚来 NIO IN 用科技的进步呼应那个火红的年代。 这是蔚来第一次开科技发布会,为了全方位展…...
Android推送问题排查
针对MobPush智能推送服务在使用过程中可能出现的问题,本文为各位开发者们带来了针对MobPush安卓端推送问题的解决办法。 TCP在线推送排查 排查TCP在线收不到推送时,我们先通过客户端的RegistrationId接口获取设备的唯一标识 示例: MobPush…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
