Redis学习二--常见问题及处理

news2024/11/16 4:19:02

基本概念

Redis基本概念数据结构

机制

持久化机制:

RDB(内存快照):某一时刻的内存快照以二进制的方式写入磁盘,可以手动触发和自动触发。

优点:生成文件小,恢复速度快,适用于灾难恢复。

缺点:redis发生意外停机时,服务器会丢失还未保存到快照中的数据。

RDB详解

AOF(增量日志):将redis执行的每一条命令追加到一个文件的末尾,redis重启时,会重新执行这些命令来恢复数据。

优点:不容易丢失数据,更为安全

缺点:文件体积大,恢复速度慢

混合持久化(RDB+AOF):redis会优先加载AOF文件恢复数据,因为AOF更为安全

内存淘汰策略

noeviction(不淘汰策略):当内存不足以容纳新写入数据时,Redis 将新写入的命令返回错误。这个策略确保数据的完整性,但会导致写入操作失败。
volatile-lru(最近最少使用):从设置了过期时间的键中选择最少使用的键进行删除。该策略优先删除最久未被访问的键,保留最常用的键。
volatile-ttl(根据过期时间优先):从设置了过期时间的键中选择剩余时间最短的键进行删除。该策略优先删除剩余时间较短的键,以尽量保留剩余时间更长的键。
volatile-random(随机删除):从设置了过期时间的键中随机选择一个键进行删除。
allkeys-lru(全局最近最少使用):从所有键中选择最少使用的键进行删除。无论键是否设置了过期时间,都将参与淘汰。
allkeys-random(全局随机删除):从所有键中随机选择一个键进行删除。

redis的哨兵机制

redis的哨兵,集群详解

应用

使用场景                

1.app首页流量高峰

2.不需要持久化存储的操作(验证码,点赞数)

3.分布式锁

4.分布式缓存

问题

如何解决Hash冲突

Hash冲突:用哈希表存储数据时,两个或多个不同的键被哈希函数映射到一个位置。

redis通过链式哈希解决冲突,也就是同一个桶里面的元素使用链表保存。

但是当链表过长就会导致查找性能变差可能。所以redis为了追求块,使用了两个全局哈希表。用于rehash操作,增加现有的哈希桶数量,减少哈希冲突。

如何处理过期的数据(过期策略)

惰性删除:客户端尝试访问某个键时,redis检查是否过期,如果过期就会删掉。

优点:节省CPU资源,只有访问时才会判断是否过期

缺点:key过期了却没有删掉,占用内存

定期删除:每隔一段时间就会通过循环遍历去随机抽查一部分设置过期时间的key,过期了就删掉。

优点:调整定时扫描的时间间隔和每次扫描的限定耗时,保证CPU和内存资源的利用最大化。

如何保证数据库和redis的一致性

双删策略:

  • 第一次删除:在更新数据库之前,先删除Redis缓存中的数据。这样,即使在更新数据库的过程中,如果有请求查询该数据,也会从数据库中读取最新数据,而不是从缓存中读取过期的旧数据。

  • 第二次删除:在更新数据库之后,再次删除Redis缓存中的数据。这样可以处理在第一次删除和更新数据库之间,有其他请求将旧数据重新写入缓存的情况。这次删除确保了即使这种情况发生,缓存中的数据也会被最新的数据库数据替换。

需要注意的是,双删策略可能会在某些情况下导致数据不一致的问题,比如在分布式系统中,如果第二次删除操作失败,可能会导致缓存中的数据和数据库中的数据不一致。因此,实际应用中可能需要结合其他一致性保证机制,如使用事务、延迟删除策略、订阅数据库变更事件等,来确保数据的一致性。

如何解决热key问题

热Key问题:某些特定的缓存key受到高频访问,导致对这些热门数据的读取/写入操作集中在少数几个缓存节点上,使得这些节点的负载过高,而其他节点负载较轻甚至空闲。这会造成系统性能不均衡,可能导致部分请求响应变慢或服务不可用。

解决:

1. 缓存预热:在系统启动或业务低峰期,通过批量加载或预先访问热门数据,将这些热门数据提前加载到缓存中。这样可以避免大量请求同时涌入导致的热点问题,提高系统的稳定性和性能。
2. 动态散列:将缓存节点组织成一个哈希环,根据缓存键的哈希值将数据分散存储在多个节点上。通过增加缓存节点的数量,让请求更均匀地分布在各个节点上,减轻热 Key 对单个节点的压力。当节点数量发生变化时,可以通过一致性哈希算法进行平滑迁移,避免数据大规模迁移带来的负载过高。
3. 数据分片:将数据按特定规则(如数据范围、业务维度等)分成多个片段,分别存储在不同的缓存节点上。这样可以使热 Key 所在的数据尽量均匀地分布在多个节点上,减轻单个节点的压力。

缓存击穿

指当一个缓存键(key)对应的数据在缓存中不存在,同时又有大量并发请求访问该缓存键时,这些请求会直接绕过缓存,查询数据库或其他存储系统,导致数据库压力增大。缓存击穿通常在缓存过期后发生。

缓存穿透

指当一个查询请求访问一个不存在于缓存中且也不存在于数据库中的数据时,这个请求会无效地继续访问数据库,而不会被缓存。如果黑客故意发送大量非法请求,则缓存层无法起到过滤作用,可能导致数据库负载过大。

缓存雪崩

指当缓存集中在某个时间点失效或由于某个原因发生故障,导致大量的请求直接打到后端数据库,造成数据库瞬时压力过大,甚至引起数据库崩溃。在缓存雪崩期间,系统性能急剧下降,无法正常提供服务。

解决

1. 对热点数据采用永不过期策略,避免缓存击穿。
2. 在缓存层进行空值缓存,即将查询结果为空的数据也缓存一段时间,避免缓存穿透。
3. 设置合理的缓存过期时间,并使用分布式缓存的多节点部署,避免缓存雪崩。
4. 引入限流、熔断等机制,控制并发访问量,保护后端系统。
5. 对重要数据做冷备份,确保即使缓存失效或故障,仍能从其他系统中恢复数据。

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

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

相关文章

03-SparkSQL入门

0 Shark Spark 的一个组件,用于大规模数据分析的 SQL 查询引擎。Shark 提供了一种基于 SQL 的交互式查询方式,可以让用户轻松地对大规模数据集进行查询和分析。Shark 基于 Hive 项目,使用 Hive 的元数据存储和查询语法,并基于Hiv…

MySQL5.6.11安装步骤(Windows7 64位)

MySQL5.6.11安装步骤(Windows7 64位) 1. 下载MySQL Community Server 5.6.21,注意选择系统类型(32位/64位) 2. 解压MySQL压缩包 将以下载的MySQL压缩包解压到自定义目录下。 3. 添加环境变量 变量名:MYS…

【项目设计】基于MVC的负载均衡式的在线OJ

项目代码(可直接下载运行) 一、项目的相关背景 学习编程的小伙伴,大家对力扣、牛客或其他在线编程的网站一定都不陌生,这些编程网站除了提供了在线编程,还有其他的一些功能。我们这个项目只是做出能够在线编程的功能。…

“低代码+平台”:驱动企业数字化转型与创新的新引擎

“低代码平台”作为一种新兴的软件开发范式,正逐渐成为企业快速响应市场变化、优化业务流程、提升数字化水平的重要手段。它的价值在于,将传统软件开发的复杂性大大降低,赋予了非技术人员或轻量级开发者快速构建应用的能力,并能灵…

可视化驯龙高手:Portainer——轻松驾驭Docker的图形化管理利器

在Docker容器技术的海洋中,Portainer如同一艘满载智能导航系统的旗舰,为我们提供了直观且易用的图形化管理界面,让繁杂的容器管理和运维工作变得轻松愉悦。本文将带你了解Portainer的基本功能,掌握其安装方法,并体验其…

摘录笔记——2024年3月22日

目录 一、背景 1.1 新人的选择困局 1.2 高人才密度环境下普通员工的成长效率困局 1.3 业务发展和个人成长的二元对立困局 1.4 中年打工人低费效比引发的职场生涯终结困局 二、人的本质 2.1 人的本质的定义 2.2 由“人的本质”引出的几个关键过程 2.2.1 认知指引实践&a…

【前端寻宝之路】学习和总结HTML表格的实现和合并

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-IWDj0gWiFt6IMq3x {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

啥是反射???

在Java编程中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,并且可以动态地创建和操作对象。 一、反射的基本概念 反射是Java语言的一个特性,它允许程序在运行时对…

QML ShapePath绘制虚线

一.qml PathLine介绍 在 QML(Qt Modeling Language)中,PathLine 是 Path 元素的一个子类型,用于创建两点之间的直线段。Path 类型用于描述一个二维路径,可以用来绘制形状、曲线和直线。PathLine 是所有路径曲线中最简单…

从0写一个问卷调查APP的第13天-1

1.今日任务 我也只是一个大学生,有什么思路不对的地方给我指出来哟! 分析:上次我们实现了任务调查的插入。但是我们插入的问卷调查只有它的标题,也就是这个问卷调查是什么我们告诉数据库了,但是现在我们还没有给它添加任何问题&…

域控操作十三:域用户登陆前显示标题以及文本

域控用户在登录前会先显示这个,才能输入密码登录

【数字图像处理matlab系列】使用数组索引进行简单的图像裁剪、二次取样操作

【数字图像处理matlab系列】使用数组索引进行简单的图像裁剪、二次取样操作 【先赞后看养成习惯】求点赞+关注+收藏! pout.tif是一张matlab自带的图片,图像尺寸是291*240,使用imread读取该图像>> a = imread(pout.tif); >> imshow(a);对图像a进行上下翻转操作,…

深入理解 Docker 镜像

1. Docker 镜像的底层原理 1.1 分层的镜像 以我们的pull 命令为例,在下载的过程中我们可以看到docker的镜像好像是一层一层的在下载。 1.2 UnionFS(联合文件系统) 联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次…

vector类详解及重要函数实现

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 今日主菜:vector类 主厨:邪王真眼 所属专栏:c专栏 主厨的主页:Chef‘s blog 坚持下去,成功不是目的&a…

C#学习笔记1:C#基本文件结构与语法

现在开始我的C#学习之路吧,这也许不适合0编程基础的人看,因为我会C语言了,笔记做的可能有思维上的跳跃,如果0基础可能会觉得有些地方转折得莫名奇妙,但我的学习笔记实操还是比较多的,基本都是真实运行程序结…

QTabWidget的tabbar不同方向显示 文字方向设置 图标跟随变化 实现方式 qt控件绘制原理

先来看结果图:(参考博客:QTabWidget中tab页文本水平或垂直设置_pyqt tab_widget.settabposition(qtabwidget.west) 字体-CSDN博客) 从图中可知,"普通"是qt自己的样式,但是很明显,在垂…

Ubuntu18.04桌面版设置静态IP地址

引用: Ubuntu配置静态IP_ubuntu配置静态ip地址-CSDN博客 正文 默认Unbuntu 18.04 Desktop桌面版使用 netplan 管理网卡网络地址。使用Unbuntu 18.04 桌面版配置,可以通过桌面上的设置图标配置网卡的静态IP地址。 点击桌面右上角下拉框,点击“设置”按…

蓝桥杯(2):python基础算法【上】

时间复杂度、枚举、模拟、递归、进制转换、前缀和、差分、离散化 1 时间复杂度 重要是看循环,一共运行了几次 1.1 简单代码看循环 #时间复杂度1 n int(input()) for i in range(1,n1):for j in range(0,i):pass ###时间复杂度:123....nn(1n)/2 所以…

面试题 之 react

1.说说对react的理解 1️⃣是什么 React是用于构建用户界面的 JavaScript 库,遵循组件设计模式、声明式编程范式和函数式编程概念,更高效使用虚拟 DOM 来有效地操作 DOM ,遵循从高阶组件到低阶组件的单向数据流。 react 类组件使用一个名为 render() 的方…

JAVA实战开源项目:大病保险管理系统(Vue+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统配置维护2.2 系统参保管理2.3 大病保险管理2.4 大病登记管理2.5 保险审核管理 三、系统详细设计3.1 系统整体配置功能设计3.2 大病人员模块设计3.3 大病保险模块设计3.4 大病登记模块设计3.5 保险审核模块设计 四、…