缓存相关问题
对于缓存,我们主要关心两个:缓存的命中率,数据的一致性。由此又会有一些缓存引起的问题,缓存击穿、穿透、雪崩。对于这些问题也是我们在使用缓存时不得不考虑的 。这些问题的解决方案也有很多。这里简单列举几个:
(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…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
