面试笔记——Redis(使用场景、面临问题、缓存穿透)
Redis的使用场景
Redis(Remote Dictionary Server)是一个内存数据结构存储系统,它以快速、高效的特性闻名,并且它支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。它主要用于以下场景:
- 缓存: Redis最常见的用途之一是作为缓存层,用来存储经常访问但计算成本较高的数据(如,数据库查询结果、API调用结果等)。将数据存储在Redis的内存中,可以加速对数据的访问,降低后端系统的负载,提升应用层的相应速度;
- 分布式锁: Redis提供了分布式锁机制,可以用来解决分布式系统中的并发访问问题,开发者可以通过Redis的SETNX(SET if Not eXists)实现简单而高效的分布式锁。
- ……
Redis中可能面临的问题
- 作为缓存层可能面临的问题:穿透、击穿、雪崩、双写一致、持久化、数据过期、淘汰策略等;
- 在分布式系统中可能面临的问题:setnx、redisson
缓存穿透问题
带有缓存层的数据查询过程:
缓存穿透: 通常,缓存系统在接收到一个查询请求时,会首先检查缓存中是否已经存在相应的数据。如果存在,则直接返回缓存中的数据;如果不存在,则去底层存储系统(如数据库)查询数据,并将查询结果存入缓存中,以供后续请求使用。然而,当恶意用户或者系统频繁地查询不存在的数据时,缓存系统无法命中缓存,而每次请求都会直接访问底层存储系统,从而绕过了缓存系统,这种情况就称为缓存穿透。
原因: 可能是由于恶意攻击、缓存配置不当或者业务逻辑漏洞等。
解决方法:
- 空值缓存:在缓存中存储不存在的键对应的空值,即使查询不存在的数据也能命中缓存。这样可以减少对底层存储系统的频繁访问。
- 布隆过滤器:使用布隆过滤器来过滤掉不存在的查询请求,从而避免将无效的查询请求发送到底层存储系统。
- 缓存预热:在系统启动时或者定时任务中,预先加载热门数据到缓存中,以减少对底层存储系统的请求压力。
- 限流和监控:对请求频率进行限流,以防止恶意请求造成的缓存穿透问题,并通过监控系统实时监测缓存命中率和底层存储系统的负载情况,及时发现并解决问题。
方案一——空值缓存:
- 实现:缓存空数据,即查询返回的数据为空时,仍把这个空结果进行缓存
- 优点:简单
- 缺点:消耗内存(若查询的大量数据都为空,则缓存的压力会很大);可能会发生数据不一致问题(比如,最开始查询某个key对应的数据为空,但是后面在数据库中添加了该key所对应的数据,但缓存中的存储结果仍然为空,导致数据库和缓存中的数据不一致)
方案二——布隆过滤器:
带有布隆过滤器的请求过程通常涉及以下几个步骤:
- 发送查询请求:客户端向服务端发送一个查询请求,请求中包含待查询的元素。
- 布隆过滤器检查:服务端接收到查询请求后,首先将待查询的元素经过布隆过滤器中的哈希函数计算得到多个哈希值。然后,服务端对每一个哈希值进行比特位检查,判断对应的比特位是否为1。
- 判断结果:根据比特位检查的结果,服务端做出以下判断:
- 如果对于任意一个哈希值,对应的比特位为0,则可以确定待查询的元素一定不存在于集合中,直接返回查询结果,元素不存在。
- 如果对于所有哈希值,对应的比特位均为1,则说明待查询的元素可能存在于集合中,需要进一步查询底层存储系统(如数据库)来确认。
- 底层存储系统查询:如果布隆过滤器的检查结果显示元素可能存在于集合中,服务端将继续查询底层存储系统(如数据库)以确认元素是否真正存在。这一步骤可以视具体业务需求决定是否执行。
- 返回查询结果:服务端根据底层存储系统的查询结果,将最终的查询结果返回给客户端:
- 如果底层存储系统中存在该元素,则返回查询结果,元素存在于集合中。
- 如果底层存储系统中不存在该元素,则返回查询结果,元素不存在于集合中。
ps1:缓存预热是指在系统启动或者正式使用之前,提前加载一些热门或者常用的数据到缓存中,以提高系统的性能和响应速度。预热过程可以直接从数据库读取数据,并将其缓存到缓存系统中来实现。在缓存预热的同时,预热布隆过滤器。这意味着在将数据加载到缓存中的同时,也对这些数据应用布隆过滤器的哈希函数,并将对应的比特位设置为1。因此,在正式使用之前,布隆过滤器已经包含了预先加载的数据集合,从而在后续的查询过程中,可以利用布隆过滤器先行判断一个元素是否可能存在于缓存中,以提高查询效率。
ps2:布隆过滤器通常用于静态数据集合或者不经常变化的数据集合,并且在实际应用中不会经常更新。因此,在使用布隆过滤器时,通常是在初始化时构建好布隆过滤器,然后对其进行查询操作,而不是对其进行频繁的更新操作。
方案二的优缺点:
- 优点:内存占用较少,没有多余key;
- 缺点:实现复杂,存在误判
布隆过滤器是一种空间效率高、时间效率快的数据结构,用于判断一个元素是否可能存在于一个集合中。它基于一系列哈希函数和一个比特数组(bitmap,位图)构建而成。
位图:相当于是一个以(bit)位为单位的数组,数组中每个单元只能存储二进制数0或1。
布隆过滤器的原理:
- 数据结构:布隆过滤器通常由一个长度为m的比特数组和k个不同的哈希函数构成。比特数组中的每个比特位初始都设为0。
- 添加元素:当向布隆过滤器中添加一个元素时,该元素经过k个哈希函数的计算得到k个哈希值,然后将比特数组中对应位置的比特位设为1。
- 检查元素:当需要检查一个元素是否存在于布隆过滤器中时,同样将该元素经过k个哈希函数计算得到k个哈希值,然后检查这些哈希值对应的比特位是否都为1。若存在任何一个比特位为0,则可以确定该元素一定不在布隆过滤器中;若所有的比特位均为1,则该元素可能存在于布隆过滤器中,但并不一定存在(存在一定的误判率)。
布隆过滤器的特点:
- 布隆过滤器不存储数据本身,只用于判断一个元素是否存在一个集合中。在实际应用中,布隆过滤器一旦完成初始化,通常是不会直接修改其中的数据集合的。
- 哈希冲突:布隆过滤器使用多个哈希函数将元素映射到不同的比特位上。然而,由于哈希函数的输出范围有限,不同的元素可能会映射到同一个比特位上,导致哈希冲突。当某个元素的多个哈希值对应的比特位都已经被设置为1时,其他元素经过布隆过滤器查询时可能被错误地认为存在于数据集合中,即出现误判。
- 比特位覆盖:布隆过滤器的比特数组是有限的,而待存储的元素数量是无限的。因此,布隆过滤器的比特数组大小通常是有限的,这意味着可能存在多个不同的元素映射到同一个比特位上。当一个元素被添加到布隆过滤器时,可能会覆盖掉其他元素已经占据的比特位,导致误判。
添加元素,如图:
发生检查错误的情况:
注意:在布隆过滤器中,误判是不可能避免的,一般可以通过增加布隆过滤器存储元素的个数来减少误判率。因此,在使用布隆过滤器时需要权衡误判率和内存消耗。一般,将误判率控制在5%是可以接受的。
相关文章:
面试笔记——Redis(使用场景、面临问题、缓存穿透)
Redis的使用场景 Redis(Remote Dictionary Server)是一个内存数据结构存储系统,它以快速、高效的特性闻名,并且它支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。它主要用于以下场景: 缓…...
电机学(笔记一)
磁极对数p: 直流电机的磁极对数是指电机定子的磁极对数,也等于电机电刷的对数。它与电机的转速和扭矩有直接关系。一般来说,极对数越多,电机转速越低,扭矩越大,适用于低速、高扭矩的场合;相反&…...
数值分析复习:Newton插值
文章目录 牛顿(Newton)插值引入背景插值条件基函数插值多项式差商差商的基本性质差商估计差商的Leibniz公式 余项估计 本篇文章适合个人复习翻阅,不建议新手入门使用 牛顿(Newton)插值 引入背景 Lagrange插值每引入一…...
金融知识分享系列之:出场信号RSI指标
金融知识分享系列之:出场信号RSI指标 一、出场信号RSI指标二、RSI指标原理三、 指标用法四、RSI指标总结 一、出场信号RSI指标 名称:相对强弱指标参数:(默认14)组成:RSI线以及30轴、50轴、70轴构成 0-30是极弱:0-30的…...
基于Spring Boot的宿舍管理系统
摘 要 随着信息时代的来临,过去的传统管理方式缺点逐渐暴露,对过去的传统管理方式的缺点进行分析,采取计算机方式构建宿舍管理系统。本文通过课题背景、课题目的及意义相关技术,提出了一种楼宇信息、宿舍信息、宿舍安排、缺勤信息…...
全量知识系统“全基因序列”程序构想及SmartChat的回复
感觉上,全量知识系统的程序起点基本确定。下一步就是程序了。程序的整个设计过程都准备同时使用两个AI工具。以下是和“百度AI”同步进行的Q&A。 Q1. 基本假设:“全基因序列”中“基因”的本质是联结collection。 做法是: 对给出的一个…...
315晚会曝光主板机产业链,如何应对工作室技术更迭
近日,央视315晚会开播,曝光了一批最新案例,聚焦消防、食品、金融、数据等多个领域。其中 “网络黑灰产”硬件设备「手机主板机」及其产业链暴露在大众视野。 手机主板机实物丨图源:央视财经 据报道,主板机的构造是将数…...
Copilot with GPT-4与文心一言4.0:AI技术的未来
Copilot with GPT-4的深度分析 Copilot with GPT-4是基于OpenAI的GPT-4模型,它是一个多功能的AI助手,能够在多种语言中进行交流和创作。GPT-4模型的强大之处在于其庞大的数据训练基础,这使得它在理解语境、生成文本以及执行复杂任务方面表现…...
注册-前端部分
前提:后端jar环境、Vue3环境、Redis环境 搭建页面(html标签、css样式) → 绑定数据与事件(表单校验) → 调用后台接口(接口文档、src/api/xx.js封装、页面函数中调用) Login.vue文件ÿ…...
SpringBoot ApplicationListener实现发布订阅模式
文章目录 前言一、Spring对JDK的扩展二、快速实现发布订阅模式 前言 发布订阅模式(Publish-Subscribe Pattern)通常又称观察者模式,它被广泛应用于事件驱动架构中。即一个事件的发布,该行为会通过同步或者异步的方式告知给订阅该事件的订阅者。JDK中提供…...
嵌入式学习40-数据结构
数据结构 1.定义 一组用来保存一种或者多种特定关系的 数据的集合(组织和存储数据) 程序的设计: …...
k8s集群部署elk
一、前言 本次部署elk所有的服务都部署在k8s集群中,服务包含filebeat、logstash、elasticsearch、kibana,其中elasticsearch使用集群的方式部署,所有服务都是用7.17.10版本 二、部署 部署elasticsearch集群 部署elasticsearch集群需要先优化…...
【Python】清理conda缓存的常用命令
最近发现磁盘空间不足,很大一部分都被anaconda占据了,下面是一些清除conda缓存的命令 清理所有环境的Anaconda包缓存 删除所有未使用的包以及缓存的索引和临时文件 conda clean --all清理某一特定环境的Anaconda包缓存 conda clean --all -n 环境名清…...
代码随想录算法训练营第46天 | 完全背包,139.单词拆分
动态规划章节理论基础: https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 完全背包理论基础: https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9…...
rust - 将windows剪贴板的截图保存为png
本文提供了将windows系统的截图另存为png格式图片的方法。 添加依赖 cargo add clipboard-win cargo add image cargo add windows配置修改windows依赖特性 [dependencies] image "0.25.0"[target.cfg(windows).dependencies] windows "0.51.1" clipb…...
pyflink1.18.0 报错 TypeError: cannot pickle ‘_thread.lock‘ object
完整报错 Traceback (most recent call last):File "/Users//1.py", line 851, in <module>ds1 = my_datastream.key_by(lambda x: x[0]).process(MyProcessFunction()) # 返回元组即: f0 f1 f2 三列File "/Users/thomas990p/bigdataSoft/minicondaarm/…...
算法学习系列(四十一):Flood Fill算法
目录 引言一、池塘计数二、城堡问题三、山峰和山谷 引言 关于这个 F l o o d F i l l Flood\ Fill Flood Fill 算法,其实我觉得就是一个 B F S BFS BFS 算法,模板其实都是非常相似的,只不过有些变形而已,然后又叫这个名字。关于…...
Re62:读论文 GPT-2 Language Models are Unsupervised Multitask Learners
诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名:Language Models are Unsupervised Multitask Learners 论文下载地址:https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learner…...
stm32-编码器测速
一、编码器简介 编码电机 旋转编码器 A,B相分别接通道一和二的引脚,VCC,GND接单片机VCC,GND 二、正交编码器工作原理 以前的代码是通过触发外部中断,然后在中断函数里手动进行计次。使用编码器接口的好处就是节约软件资源。对于频…...
全国各省市县统计年鉴/中国环境统计年鉴/中国工业企业数据库/中国专利数据库/污染排放数据库
统计年鉴是指以统计图表和分析说明为主,通过高度密集的统计数据来全面、系统、连续地记录年度经济、社会等各方面发展情况的大型工具书来获取统计数据资料。 统计年鉴是进行各项经济、社会研究的必要前提。而借助于统计年鉴,则是研究者常用的途径。目前国…...
【LAMMPS学习】二、LAMMPS安装(2)MacOS和Win安装
2. LAMMPS安装 您可以将LAMMPS下载为可执行文件或源代码。 在下载LAMMPS源代码时,还必须构建LAMMPS。但是对于在构建中包含或排除哪些特性,您有更大的灵活性。当您下载并安装预编译的LAMMPS可执行文件时,您只能安装可用的LAMMPS版本以及这些…...
如何解决网络中IP地址发生冲突故障?
0、前言 本专栏为个人备考软考嵌入式系统设计师的复习笔记,未经本人许可,请勿转载,如发现本笔记内容的错误还望各位不吝赐教(笔记内容可能有误怕产生错误引导)。 1、个人IP地址冲突解决方案 首先winR,调出…...
机器学习常用框架
机器学习是人工智能的一个重要分支,它通过让计算机系统利用数据自我学习来改进任务执行的能力。在机器学习领域,有许多成熟的框架被广泛使用,这些框架提供了构建和训练机器学习模型的工具。以下是一些常用的机器学习框架: Tensor…...
计算机网络——物理层(信道复用技术)
计算机网络——物理层(信道复用技术) 信道复用技术频分多址与时分多址 频分复用 FDM (Frequency Division Multiplexing)时分复用 TDM (Time Division Multiplexing)统计时分复用 STDM (Statistic TDM)波分复用码分复用 我们今天接着来看信道复用技术&am…...
【Qt问题】使用QSlider创建滑块小部件无法显示
问题描述: 使用QSlider创建滑块小部件用于音量按钮的时候,无法显示,很奇怪,怎么都不显示 一直是这个效果,运行都没问题,但是就是不出现。 一直解决不了,最后我在无意中,在主程序中…...
Linux--Shell脚本安装 httpd 和 修改IP
shell脚本 关闭防火墙、安装httpd、启动httpd [rootnode11 ~]# mkdir shell[rootnode11 ~]# vim abc.sh #!/bin/bash#安装httpd服务#1、挂载 准备yum源 mount /dev/sr0 /mnt &> /dev/nulldf$(df -h | grep /dev/sr0 | awk {print $6})if [ "$df" "/mn…...
mysql 常见问题
1、count(*) 、 count(1) 和 count(字段)区别 在MySQL中,COUNT(*)、COUNT(1) 和 COUNT(字段) 是用于统计行数的函数,它们的主要区别在于: COUNT(*):会统计符合条件的所有行的数量,不管这些行中…...
考研机试题
目录 头文件与STL动态规划最大数组子串和最长公共子序列最长连续公共子串最长递增子序列最大上升子序列和0-1背包多重背包多重背包问题 I整数拆分最小邮票最大子矩阵 数学问题朴素法筛素数线性筛素数快速幂 石子合并锯木棍并查集Dijkstra单源最短路Python进制转换(整数无限大)全…...
Java基础知识总结(6)
String类中常用的类方法: 方法名称描述format(String format, Object... args)使用指定的格式字符串和参数返回一个格式化字符串。 format - 格式字符串 args - 格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数…...
JAVA基础—关于Java的反射机制
1. Java的反射机制是什么? 反射(reflection) 当我们谈及反射,可以将其比作正在照镜子的行为。就像你可以在禁止中看到自己的反射一样,程序在运行时可以检查自身的机构和行为。这意味这程序可以动态地了解自己地组成部分,比如类、…...
怎么搭建手机网站m/国内最好的危机公关公司
简介 MySQL 是一个出色的综合性数据库,但是,对于需要进行大量搜索的应用程序,考虑采用具体的搜索实用工具可能会更好一些。本文章将 Sphinx(一个著名的全文本搜索包)视为 MySQL 的替代品,用它来进行搜索&am…...
哪个网站名片做的号/百度搜索风云榜游戏
根据 Mysql 里的字段 自动生成 类文件:但需要导入:require_once ./db/ez_sql_core.php;require_once ./db/ez_sql_mysql.php;上图 :核心代码:$meta mysql_fetch_field($rel);if($meta){if($meta->primary_key1){$this->primary_key $…...
北京网站建设知名公司/赣州seo推广
系统:Ubuntu 10.04 LTS Ubuntu 10.04 LTS下用apt-get install mysql-server-5.1 安装出来的是mysql版本是5.1.41-3ubuntu12.10 (Ubuntu),版本太低我们需要的mysql event只有在mysql 5.5才支持,因此我们需要安装mysql5.5.14(mysql官方的最新稳…...
wordpress 不能更换主题/企业网站设计欣赏
本文为瑞典查尔姆斯理工大学(作者:Erik Henriksson)的硕士论文,共76页。 本文研究了利用汽车雷达传感器对动态目标进行扩展跟踪。跟踪是基于一个360度环境感知系统的数据,该系统由四个视场重叠的雷达传感器组成。本文…...
东莞网站设计制作教程/google服务框架
JAVA项目实现授权部署 (一)请注意:这个只是个比较low的实现,如果那种考虑用户懂代码,又拿到源码的,别看这个了还是。对我们来说,拿到源码,没有什么破不了的,只不过是时间问题,对不&a…...
网站如何上传数据库/网络销售的工作内容
简介:Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的&…...