面试笔记——Redis(使用场景、面临问题、缓存穿透)

Redis的使用场景

Redis(Remote Dictionary Server)是一个内存数据结构存储系统,它以快速、高效的特性闻名,并且它支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。它主要用于以下场景:

  • 缓存: Redis最常见的用途之一是作为缓存层,用来存储经常访问但计算成本较高的数据(如,数据库查询结果、API调用结果等)。将数据存储在Redis的内存中,可以加速对数据的访问,降低后端系统的负载,提升应用层的相应速度;
  • 分布式锁: Redis提供了分布式锁机制,可以用来解决分布式系统中的并发访问问题,开发者可以通过Redis的SETNX(SET if Not eXists)实现简单而高效的分布式锁。
  • ……

Redis中可能面临的问题

  • 作为缓存层可能面临的问题:穿透、击穿、雪崩、双写一致、持久化、数据过期、淘汰策略等;
  • 在分布式系统中可能面临的问题:setnx、redisson

缓存穿透问题

带有缓存层的数据查询过程:
在这里插入图片描述
缓存穿透: 通常,缓存系统在接收到一个查询请求时,会首先检查缓存中是否已经存在相应的数据。如果存在,则直接返回缓存中的数据;如果不存在,则去底层存储系统(如数据库)查询数据,并将查询结果存入缓存中,以供后续请求使用。然而,当恶意用户或者系统频繁地查询不存在的数据时,缓存系统无法命中缓存,而每次请求都会直接访问底层存储系统,从而绕过了缓存系统,这种情况就称为缓存穿透。

原因: 可能是由于恶意攻击、缓存配置不当或者业务逻辑漏洞等。

解决方法:

  • 空值缓存:在缓存中存储不存在的键对应的空值,即使查询不存在的数据也能命中缓存。这样可以减少对底层存储系统的频繁访问。
  • 布隆过滤器:使用布隆过滤器来过滤掉不存在的查询请求,从而避免将无效的查询请求发送到底层存储系统。
  • 缓存预热:在系统启动时或者定时任务中,预先加载热门数据到缓存中,以减少对底层存储系统的请求压力。
  • 限流和监控:对请求频率进行限流,以防止恶意请求造成的缓存穿透问题,并通过监控系统实时监测缓存命中率和底层存储系统的负载情况,及时发现并解决问题。

方案一——空值缓存:

  • 实现:缓存空数据,即查询返回的数据为空时,仍把这个空结果进行缓存
  • 优点:简单
  • 缺点:消耗内存(若查询的大量数据都为空,则缓存的压力会很大);可能会发生数据不一致问题(比如,最开始查询某个key对应的数据为空,但是后面在数据库中添加了该key所对应的数据,但缓存中的存储结果仍然为空,导致数据库和缓存中的数据不一致)

方案二——布隆过滤器:
带有布隆过滤器的请求过程通常涉及以下几个步骤:

  1. 发送查询请求:客户端向服务端发送一个查询请求,请求中包含待查询的元素。
  2. 布隆过滤器检查:服务端接收到查询请求后,首先将待查询的元素经过布隆过滤器中的哈希函数计算得到多个哈希值。然后,服务端对每一个哈希值进行比特位检查,判断对应的比特位是否为1。
  3. 判断结果:根据比特位检查的结果,服务端做出以下判断:
    • 如果对于任意一个哈希值,对应的比特位为0,则可以确定待查询的元素一定不存在于集合中,直接返回查询结果,元素不存在。
    • 如果对于所有哈希值,对应的比特位均为1,则说明待查询的元素可能存在于集合中,需要进一步查询底层存储系统(如数据库)来确认。
  4. 底层存储系统查询:如果布隆过滤器的检查结果显示元素可能存在于集合中,服务端将继续查询底层存储系统(如数据库)以确认元素是否真正存在。这一步骤可以视具体业务需求决定是否执行。
  5. 返回查询结果:服务端根据底层存储系统的查询结果,将最终的查询结果返回给客户端:
    • 如果底层存储系统中存在该元素,则返回查询结果,元素存在于集合中。
    • 如果底层存储系统中不存在该元素,则返回查询结果,元素不存在于集合中。
      在这里插入图片描述

ps1:缓存预热是指在系统启动或者正式使用之前,提前加载一些热门或者常用的数据到缓存中,以提高系统的性能和响应速度。预热过程可以直接从数据库读取数据,并将其缓存到缓存系统中来实现。在缓存预热的同时,预热布隆过滤器。这意味着在将数据加载到缓存中的同时,也对这些数据应用布隆过滤器的哈希函数,并将对应的比特位设置为1。因此,在正式使用之前,布隆过滤器已经包含了预先加载的数据集合,从而在后续的查询过程中,可以利用布隆过滤器先行判断一个元素是否可能存在于缓存中,以提高查询效率。
ps2:布隆过滤器通常用于静态数据集合或者不经常变化的数据集合,并且在实际应用中不会经常更新。因此,在使用布隆过滤器时,通常是在初始化时构建好布隆过滤器,然后对其进行查询操作,而不是对其进行频繁的更新操作。

方案二的优缺点:

  • 优点:内存占用较少,没有多余key;
  • 缺点:实现复杂,存在误判

布隆过滤器是一种空间效率高、时间效率快的数据结构,用于判断一个元素是否可能存在于一个集合中。它基于一系列哈希函数和一个比特数组(bitmap,位图)构建而成。
位图:相当于是一个以(bit)位为单位的数组,数组中每个单元只能存储二进制数0或1。

布隆过滤器的原理:

  • 数据结构:布隆过滤器通常由一个长度为m的比特数组和k个不同的哈希函数构成。比特数组中的每个比特位初始都设为0。
  • 添加元素:当向布隆过滤器中添加一个元素时,该元素经过k个哈希函数的计算得到k个哈希值,然后将比特数组中对应位置的比特位设为1。
  • 检查元素:当需要检查一个元素是否存在于布隆过滤器中时,同样将该元素经过k个哈希函数计算得到k个哈希值,然后检查这些哈希值对应的比特位是否都为1。若存在任何一个比特位为0,则可以确定该元素一定不在布隆过滤器中;若所有的比特位均为1,则该元素可能存在于布隆过滤器中,但并不一定存在(存在一定的误判率)。

布隆过滤器的特点:

  • 布隆过滤器不存储数据本身,只用于判断一个元素是否存在一个集合中。在实际应用中,布隆过滤器一旦完成初始化,通常是不会直接修改其中的数据集合的。
  • 哈希冲突:布隆过滤器使用多个哈希函数将元素映射到不同的比特位上。然而,由于哈希函数的输出范围有限,不同的元素可能会映射到同一个比特位上,导致哈希冲突。当某个元素的多个哈希值对应的比特位都已经被设置为1时,其他元素经过布隆过滤器查询时可能被错误地认为存在于数据集合中,即出现误判。
  • 比特位覆盖:布隆过滤器的比特数组是有限的,而待存储的元素数量是无限的。因此,布隆过滤器的比特数组大小通常是有限的,这意味着可能存在多个不同的元素映射到同一个比特位上。当一个元素被添加到布隆过滤器时,可能会覆盖掉其他元素已经占据的比特位,导致误判。

添加元素,如图:
在这里插入图片描述
发生检查错误的情况:
在这里插入图片描述
注意:在布隆过滤器中,误判是不可能避免的,一般可以通过增加布隆过滤器存储元素的个数来减少误判率。因此,在使用布隆过滤器时需要权衡误判率和内存消耗。一般,将误判率控制在5%是可以接受的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/466143.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虹科技术|PCAN系列网关内部存储空间解析:EEPROM与Flash的集成应用

导读:网关设备是确保数据流畅通信的关键。虹科PCAN系列网关凭借卓越性能和创新技术,为众多应用提供了高效稳定的解决方案。本文将深入探讨虹科PCAN系列网关内部存储空间,特别是EEPROM和SPI Flash的配置与利用,并解析如何通过C编程…

每日一题——LeetCode1694.重新格式化电话号码

方法一 模拟: 首先去除number里面的破折号和空格,取出纯数字组成的字符串str。 对于str每三个数分成一组,加一个破折号,当str的长度小于等于4时再分情况讨论,如果等于4就分为22形式,如果小于4&#xff0c…

flask之ssti [WesternCTF2018]shrine1

打开题目 整理一下,代码: import flask import osapp flask.Flask(__name__) app.config[FLAG] os.environ.pop(FLAG) app.route(/)def index():return open(__file__).read()app.route(/shrine/)def shrine(shrine):def safe_jinja(s):s s.replace((, ).replac…

基于springboot+vue的乡政府管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

奇数乘积(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 1;int j 3;//循环运算&#xff1b;while (j < 12){//运算&#xff1b;i i * j;//改变数值&#xff1b;j 2…

多线程服务器适用场合

前提 进程”指的是fork(2)系统调用的产物 线程”指的是pthread_create()的产物,因此是宝贵的那种原生线程。而且Pthreads是NPTL的,每个线程由clone(2)产生,对应一个内核的task_struct。 Pthreads是一组线程操作的标准&#xff0c;NPTL是 Native POSIX Thread Library 的缩写&…

成都规模最大的直播基地在哪里

天府锋巢直播产业基地&#xff0c;位于成都这座历史文化与现代气息交织的城市&#xff0c;不仅是成都规模最大的直播产业园&#xff0c;更是西南地区乃至全国范围内具有影响力的直播产业聚集地。在这里&#xff0c;直播产业与科技创新、文化创意、教育培训等多个领域深度融合&a…

工业AMR机器人如何实现规模化的柔性生产

在当下高度复杂的工业生产环境中&#xff0c;机器人如何实现规模化的柔性生产&#xff0c;已成为业界关注的焦点。特别是在追求高效率、高质量的生产过程中&#xff0c;团队协作的重要性愈发凸显。富唯智能一体化AMR控制系统&#xff0c;作为机器人的核心指挥部&#xff0c;犹如…

Android基础开发-读写短信

1、利用ContentObserver监听短信 内容观察器ContentObserver给目标内容注册一个观察器&#xff0c;目标内容的数据一旦发生改变&#xff0c;观察器规定好的动作马上触发&#xff0c;从而执行开发者预定义的代码。 参数原理&#xff1a; notifyForDescendents 通知子孙后代 …

C++ 万物起源:类与对象(一)

目录 一、C与C语言的区别 1.1类的引入 二、C类 2.1类的概念与定义 2.2类的访问限定符与封装 2.2.1C中struct和class的区别 2.3封装 2.4类的作用域与实例化 三、类对象模型 3.1类对象的存储模式 3.2结构体内存对齐规则 一、C与C语言的区别 C语言是面向过程的&#xf…

毕设学习进展周报

文章目录 3.11-3.18 3.11-3.18 1.阅读ACL文献并记录 2.查找相关资料学习在阿里云部署ChatGLM3-6B 参考&#xff1a;https://blog.csdn.net/H66778899/article/details/135630030 # 运行 streamlit run /mnt/workspace/ChatGLM3/conposite_demo/main.py可以得到&#xff1a;…

jscpd对项目进行查重(支持150+类语言)

jscpd jscpd 查重时能够跳过标记为忽略的块和新行以及空符号和注释&#xff08;不支持尖括号注释<!-- --&#xff01;>&#xff09;&#xff0c;重复率判定依据为一定长度标识符的MD5值是否相同。 安装 npm install -g jscpd配置参数(查看更多) OptionTypeDefaultDes…

Windows系统安装GeoServe结合内网穿透实现公网访问本地位置信息服务

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

抖音视频批量下载工具|无水印视频提取软件

抖音视频批量下载工具安装教程 一&#xff1a;双击安装包 二&#xff1a;进入安装主界面 然后点击接收Q:290615413 三&#xff1a;接受后进入安装模式 设置好安装路径 系统默认的是D盘然后点击解压 四&#xff1a;点击解压后安装等待安装 安装成功后桌面会有 抖音视频批量提取工…

Python进程与线程开发

目录 multiprocessing模块 线程的开发 threading模块 setDaemon 死锁 线程间的通信 multiprocessing模块 运行python的时候&#xff0c;我们都是在创建并运行一个进程&#xff0c;(linux中一个进程可以fork一个子进程&#xff0c;并让这个子进程exec另外一个程序)。在pyt…

算法设计与分析(贪心法)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Vulnhub - Symfonos

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog Symfonos 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/symfonos-1,322/ 0x01 信息收集 …

[保姆级教程]Windows安装MongoDB教程

文章目录 MongoDB安装包下载1.点击进入mongodb官网2.点击MongoDB Community Edition&#xff08;社区版&#xff09;&#xff0c;进入下图界面3.选择版本4.下载5.安装6.勾选同意协议&#xff0c;点击“Next"7.选择自定义安装8.点击“Next"9.修改到合适的地址10.点击i…

影响汇率的因素?fpmarkets澳福总结几个

汇率对于刚刚开始外汇交易的新手来说非常重要&#xff0c;这不是没有道理的&#xff0c;了解汇率如何变化以及怎么变化有助于在外汇交易中获得稳定的利润。那么影响汇率的因素有哪些&#xff1f;fpmarkets澳福总结几个。 任何国家货币的汇率都是由市场决定的。主要的市场因素是…

盲盒抽卡机小程序开发:开启惊喜之旅,探索无限可能

随着互联网的快速发展&#xff0c;消费者的购物体验也在不断升级。盲盒文化&#xff0c;以其独特的魅力和惊喜感&#xff0c;正逐渐成为年轻人追求潮流、享受乐趣的新选择。为了满足广大盲盒爱好者的需求&#xff0c;我们精心打造了这款盲盒抽卡机小程序&#xff0c;为用户带来…