面试笔记——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%是可以接受的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java新手练习-类的继承调用(接口,抽象类,构造函数)和枚举定义方法

1.继承 父类可以调用子类实例对象,(对于调用抽象类必须使用继承) 模版 //抽象定义一个父类抽象类 abstract class FatherAbstract{void showFatherAbstract(String color, String name, int age, double serail_abstract){System.out.println("color " color &…

Java基础-lambda表达式

lambda表达式 前言前置知识λ小故事函数式编程起源: λ演算法 概念Lambda && 匿名类无参类型的简写带参函数的简写 简写的依据自定义函数接口lambda && 匿名类JVM层面区别匿名内部类实现Lambda表达式实现推论,this引用的意义 lambda && 集合Collection…

代码随想录阅读笔记-字符串【右旋字符串】

题目 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。 例如,对于输入字符串 "a…

【STL源码剖析】【2、空间配置器——allocator】

文章目录 1、什么是空间配置器?1.1设计一个简单的空间配置器,JJ::allocator 2、具备次配置力( sub-allocation)的 SGI 空间配置器2.1 什么是次配置力2.2 SGI标准的空间配置器,std::allocator2.2 SGI特殊的空间配置器,std::alloc2.…

录视频的软件推荐,助力视频内容创作

随着网络技术的发展和在线教育的兴起,录制视频教程的需求日益增加。无论是制作教学课程、分享办公技巧,还是录制游戏过程,一款好用的录屏软件都至关重要。本文将深入介绍三款录视频的软件,帮助读者了解它们的特点和操作步骤&#…

OSPF外部路由及外部路由引入过程

OSPF自治域(同运行了OSPF协议的设备);O_ASE——代表OSPF的外部路由(优先级150);1类LSA除了描述本身的直连状态、还描述本身的设备角色。 ASBR——自治系统边界路由器;同种路由协议也可做路由引…

谁能成为OpenAI的现实竞争对手吗?

文 | BFT机器人 前言: 自从与ChatGPT一起出现以来,OpenAI一直主导着人工智能市场,但它仍处于早期阶段。人工智能的历史可以追溯到几十年之前。但2022年11月ChatGPT的发布使生成式人工智能 (GenAI) 成为人们关注的焦点。从那时起,…

从SQL质量管理体系来看SQL审核(2) - SQL质量标准

从SQL质量管理体系来看SQL审核系列将通过多篇文章从SQL质量管理体系的角度来讨论如何设计一个优秀SQL审核引擎。 本系列的第一篇博文介绍了SQL质量管理体系的四个主要组成部分,SQL质量标准确立目标,SQL开发规范指导编码实践,SQL审核工具监督…

Java基础知识总结(6)

String类中常用的类方法: 方法名称描述format(String format, Object... args)使用指定的格式字符串和参数返回一个格式化字符串。 format - 格式字符串 args - 格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数…

汽车研发项目管理数字化平台之阀门管理

阀门管理,在汽车研发流程中占据着举足轻重的地位,是确保项目精细化、系统化的关键所在。这一机制的核心在于通过设立“阀门”来控制和管理研发流程中的关键节点,从而确保项目在质量、进度和资源等方面均符合预期目标。在汽车行业高度竞争和持…

学习网络编程No.14【数据链路层ARP理解】

引言: 北京时间:2024/3/14/9:20,简单聊一聊我的日常。昨天晚上十点左右更新完新的一篇文章,回到宿舍简简单单花了个两首歌的时间洗了个澡,然后为了保持形象吹了个头发,哈哈哈!当然对比以前的我…

Uniapp + SpringBoot 开发微信H5项目 微信公众号授权登录 JAVA后台(一、配置使用微信公众平台测试公众号)

申请测试号进行调试开发,测试号拥有大部分服务号有的接口权限。 一、接口配置信息填写校验 这里需要填写一个URL和一个Token验证字符串 我这里是用了natapp内网穿透 将本地的后台8080端口服务映射到了 http://x7zws8.natappfree.cc https://natapp.cn/在natapp官网…

Linux(Ubuntu)下安装paddleocr详细教程

PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力开发者训练出更好的模型,并应用落地。 1、 Ubuntu安装教程: 首先安装paddlepaddle:pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple 一般此项不会报错…

虚拟交换机简单认识

目录 一、概述 二、工作原理 三、常见的虚拟交换机实现 四、虚拟交换机的工作方式 五、应用场景 六、虚拟交换机作为SDN网络的数据平面 6.1 软件实现的数据平面 6.2 虚拟交换机作为数据平面 6.3 硬件与软件数据平面的结合 6.4 总结 一、概述 虚拟交换机(V…

Redis的安装和部署教程(Windows环境)

一、安装Redis服务 1、下载Redis压缩包 以下这个是我网盘里面的(这个是v8.0版本的,支持导入.rdb数据文件) 链接:百度网盘 请输入提取码 提取码:x0f1 --来自百度网盘超级会员V5的分享 2、解压到文件夹 将下载的压缩…

【书生·浦语大模型实战营】学习笔记2

Lagent:智能体框架,实现将一个大语言模型转化为多种类型的智能体,更好地发挥InternLM的性能 浦语灵笔:视觉语言大模型 InternLM-Chat-7B智能对话Demo 环境准备 使用复制的internlm-demo环境 # 执行该脚本文件来安装项目实验环境…

Apple加速AI大跃进:最新发布的MM1 模型论文

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

四川宏博蓬达法律咨询有限公司:专业引领,法律护航

在这个法治社会中,法律服务已成为企业和个人不可或缺的重要支持。四川宏博蓬达法律咨询有限公司凭借其专业的服务态度和丰富的法律知识,在法律服务领域独树一帜,赢得了社会各界的广泛认可。 一、公司背景实力雄厚 四川宏博蓬达法律咨询有限公…

电脑怎么快速重装系统win7

电脑重装系统是解决软件问题、提升系统性能的常用手段。随着技术发展,一键重装系统成为了许多用户的首选方法,因为它简化了繁琐的操作步骤,节省了大量时间。尤其是对于非技术人员来说,一键重装提供了一种快速高效且不易出错的系统安装方式。如果你需要快速重装win7,那么可…