当前位置: 首页 > article >正文

Redis基础知识

目录

一、为什么要用到Redis?

二、Redis 为什么运行比较快?

三、Redis的数据结构

四、Redis可以实现什么功能?

五、Redis 保证数据持久化方式

1、持久化方式主要有2种:RDB 和 AOF

2、RDB和AOF区别?

六、Redis 中的过期删除策略?

七、LRU和LFU有啥区别?

八、缓存

1、缓存雪崩

2、缓存穿透

3、缓存击穿

九、如何保证缓存和数据库数据的一致性


一、为什么要用到Redis?

Redis是非关系型数据库。
我们使用redis主要是为了解决两个问题,性能并发

性能:当我们浏览网页的时候肯定会涉及到查询数据的相关操作,这个时候我们将会访问数据库,但是问题来了,如果我们的某条sql执行起来非常的耗时并且这条sql又不会频繁的变动这个时候我们希望将这条数据放在内存中,这样我们再去拿这个数据要快很多,如此一来我们请求的响应时间也会快很多。

并发:在高并发的情况下,如果我们的多个请求直接访问数据库的话,数据库可能会因为访问量过大直接奔溃显示连接异常,这个时候就需要我们的Redis来作为中间件充当缓冲的作用了。

二、Redis 为什么运行比较快?

  • 数据存储在内存中:Redis 的数据存储在内存中,而内存的读写速度远远快于硬盘。这使得 Redis 能够实现非常快速的读写操作。
  • 单线程处理请求:Redis 是单线程的,因此可以避免线程切换和锁竞争等问题,提高了 CPU 的利用率和性能。
  • 高效的数据结构:Redis 提供了多种高效的数据结构,如哈希表、有序集合等,这些数据结构能够快速地进行插入、删除、查找和排序等操作。
  • 异步 I/O:Redis 使用异步 I/O 技术,可以在等待客户端输入或输出时继续处理其他请求,从而提高了系统的吞吐量。
  • 高效的持久化机制:Redis 提供了多种持久化机制,如 RDB、AOF 和混合持久化机制,这些机制运行都非常高效,可以在不影响性能的情况下保证数据的安全。

三、Redis的数据结构

Redis 常用的数据类型有 5 种:String 字符串类型List 列表类型Hash 哈希表类型Set 集合类型Sorted Set 有序集合类型

这 5 种常用类型的用途如下:

  1. String(字符串类型)常见使用场景是:存储 Session 信息、存储缓存信息(如详情页的缓存)、存储整数信息
  2. List(列表类型)常见使用场景是:实现简单的消息队列、存储某项列表数据;
  3. Hash(哈希表类型)常见使用场景是:存储 Session 信息、存储商品的购物车,购物车非常适合用哈希字典表示,使用人员唯一编号作为字典的 key,value 值可以存储商品的 id 和数量等信息、存储详情页信息;
  4. Set(集合类型)是一个无序并唯一的键值集合,它的常见使用场景是:关注功能,比如关注我的人和我关注的人,使用集合存储,可以保证人员不会重复;
  5. Sorted Set(有序集合类型)相比于 Set 集合类型多了一个排序属性 score(分值),它的常见使用场景是:可以用来存储排名信息、关注列表功能,这样就可以根据关注实现排序展示了。

四、Redis可以实现什么功能?

1、缓存:Redis 可以作为缓存系统,将热点数据存储在内存中,提高读写性能和响应速度,减少对后端数据存储的压力。

2、消息队列:Redis 的发布订阅功能和 List 数据结构可以实现消息队列的功能,实现异步处理任务、解耦系统组件之间的依赖关系等。

3、计数器和排行榜:Redis 的原子操作和 Sorted Set 数据结构可以实现计数器和排行榜的功能,支持快速地增加、减少和排序操作。

4、分布式锁:Redis 的 SETNX 命令可以实现分布式锁,避免多个客户端同时修改同一个数据,保证数据的一致性和正确性。

五、Redis 保证数据持久化方式

1、持久化方式主要有2种:RDBAOF

RDB:快照方式持久化,将某一个时刻的内存数据,以二进制的方式写入磁盘;

AOF:   文件追加持久化,记录所有非查询操作命令,并以文本的形式追加到文件中;

2、RDB和AOF区别?

(1)写入方式:RDB 是通过快照(snapshot)机制,将 Redis 中的数据集以二进制文件的方式写入硬盘;AOF 则是通过将 Redis 服务器执行的所有写命令(例如 set、del、incrby 等)记录在 AOF 文件中,写入方式是追加写入。

(2)数据恢复:当 Redis 重启时,可以根据 RDB 文件或 AOF 文件来恢复数据。恢复 RDB 文件比恢复 AOF 文件快,因为 RDB 文件包含了一个时间点上的快照,可以直接将整个数据集加载到内存中。而恢复 AOF 文件则需要逐条执行文件中记录的命令,需要更长的时间。

(3)数据完整性:RDB 文件保存的是 Redis 在某个时间点的数据快照,如果 Redis 在快照操作之后宕机,可能会丢失最后一次快照后的数据。而 AOF 文件记录了 Redis 所有的写命令,因此即使 Redis 宕机,也可以根据 AOF 文件恢复数据。

(4)文件大小:RDB 文件通常比 AOF 文件小,因为它只保存了一个时间点的数据快照,而 AOF 文件保存了所有的写命令,会比 RDB 文件大。

(5)优先级:AOF 文件比 RDB 更新频率高,优先使用 AOF 还原数据,AOF比 RDB 更安全也更大,如果两个都配了优先加载 AOF。

六、Redis 中的过期删除策略?

Redis 中有两种过期删除策略:

1、定期删除策略:Redis 会定期地(默认每秒钟检查 10 次)随机抽取一部分设置了过期时间的键,检查它们是否过期,如果过期则删除。该策略可以通过配置文件中的 hz 参数进行调整。

Redis 定期删除策略并不会遍历删除每个过期键,而是采用随机抽取的方式删除过期键,同时为了保证过期扫描不影响 Redis 主业务,Redis 的定期删除策略中还提供了最大执行时间,以保证 Redis 正常并高效的运行。

2、懒汉式删除策略:当访问一个键时,Redis 先检查该键是否过期,如果过期则删除。这意味着过期键可能会在访问时被删除,而不是在过期时立即删除。

七、LRU和LFU有啥区别?

LRU(最近最少使用)和   LFU(最不常使用)都是常见的缓存淘汰策略,它们在选择淘汰缓存中的键时有不同的侧重点。

1、LRU(最近最少使用)LRU 策略基于时间的概念,它认为最近被访问过的键是最有可能被再次访问的,因此在淘汰时会优先选择最久未被访问的键。

LRU 策略会维护一个访问顺序列表(双向链表+哈希表),每当一个键被访问时,它会被移动到列表的末尾,最近没有被访问的键会位于列表的前面。当需要淘汰键时,LRU 策略会选择列表前面的键进行淘汰。

2、LFU(最不常使用)LFU 策略基于访问频率的概念,它认为被访问次数最少的键是最不常用的,因此在淘汰时会优先选择访问次数最少的键。

LFU 策略会为每个键维护一个访问计数器,每当一个键被访问时,其计数器会增加。当需要淘汰键时,LFU 策略会选择访问计数最低的键进行淘汰。(哈希表)

主要区别:

1、LRU 是基于时间的策略,LFU 是基于访问频率的策略。

2、LRU 策略假设许久长期未使用的键是最不常用的,LFU 策略假设被访问次数最少的键是最不常用的。

3、LRU 维护一个访问顺序列表(双向链表+哈希表)来实现的,LFU 维护一个访问计数器(哈希表)来实现的。

4、LRU 只关注键的访问顺序,而 LFU 关注键的访问频率。

八、缓存

1、缓存雪崩

缓存雪崩:在缓存中大量的键同时过期或失效导致请求直接访问数据库或后端服务,给数据库或后端服务造成巨大压力,导致系统性能下降甚至崩溃的现象。

发生原因:

1、大量缓存键同时过期:当缓存键设置了相同的过期时间,或者由于某种原因导致大量的键同时失效,会导致缓存雪崩。

2、缓存服务器故障:当缓存服务器发生故障,无法提供服务时,请求将直接访问后端服务,导致压力集中在后端服务上。

解决方法:

1、设置随机过期时间:为缓存键设置随机的过期时间,避免大量键同时过期的情况发生,减少缓存雪崩的概率。

2、实现缓存预热:在系统启动或缓存失效前,提前加载热门数据到缓存中,避免在关键时刻大量请求直接访问后端服务。

3、使用分布式缓存:将缓存数据分布在多个缓存节点上,通过分散请求负载来减少单个缓存节点的压力,提高系统的可用性和抗压能力。

2、缓存穿透

缓存穿透是指大量的请求查询不存在于缓存和数据库中的数据,导致这些请求直接访问数据库,占用数据库资源,而缓存无法发挥作用的现象。

发生原因:

1、恶意请求(异常情况):攻击者发送大量恶意请求,故意查询不存在的数据,以触发缓存穿透。

2、高并发请求(正常业务):当有大量的并发请求同时查询不存在的数据时,可能会导致缓存无法命中,从而触发缓存穿透。

解决方法:

1、布隆过滤器:布隆过滤器是一种高效的数据结构,可以用于快速判断一个元素是否存在于集合中。在缓存层引入布隆过滤器,可以在查询请求到达时,首先通过布隆过滤器判断该请求对应的数据是否存在于缓存或数据库中,从而避免无效的查询操作。

2、缓存空值处理:对于查询数据库返回的空结果,也可以将空结果缓存起来,设置一个较短的过期时间,避免频繁查询数据库。这样在下次查询相同的数据时,可以直接从缓存中获取空结果,而不需要再次查询数据库。

3、缓存击穿

缓存击穿是指 某个热点数据过期或失效时,同时有大量的请求访问该数据,导致请求直接访问数据库或后端服务,给数据库或后端服务造成巨大压力,导致系统性能下降甚至崩溃的现象。

发生原因:

1、热点数据失效:当某个热点数据过期时,此时大量请求访问该数据,导致缓存失效,请求直接访问数据库。

2、并发访问热点数据:在高并发环境下,大量的请求同时访问同一个热点数据,导致该热点数据在缓存失效期间被并发地访问,触发缓存击穿。

解决方法:

1、设置热点数据永不过期或过期时间较长:对于一些热点数据,可以将其设置为永不过期,或者设置一个较长的过期时间,确保热点数据在缓存中可用,减少因为过期而触发的缓存击穿。

2、加互斥锁:在访问热点数据时,可以引入互斥锁,保证只有一个线程去访问后端服务或数据库,其他线程等待结果。当第一个线程获取到数据后,其他线程可以直接从缓存获取,避免多个线程同时访问后端服务,减轻压力。

九、如何保证缓存和数据库数据的一致性


1、缓存更新策略:当数据库中的数据发生变化时,需要及时更新缓存,可以采用主动更新和被动更新两种策略。主动更新是在数据库更新后,直接更新缓存中对应的数据;被动更新是在下一次查询缓存时,发现缓存已过期,重新从数据库中读取最新数据,并更新缓存。

2、双写一致性:双写一致性是指在更新数据库数据之前,先更新缓存数据,确保缓存和数据库中的数据保持一致。可以使用事务或者分布式锁来保证缓存和数据库的原子性操作。

3、延迟双删策略:在更新数据库数据前,先删除缓存中的数据,再进行数据库更新操作,这样可以保证在数据库更新期间,缓存中的数据已被删除,下一次查询时会从数据库中读取最新数据,并更新缓存。
 


 


http://www.kler.cn/news/155351.html

相关文章:

  • Excel 删除空白行
  • 「C++」位图和布隆过滤器
  • 计算机毕业设计 基于协同推荐的白酒销售管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 1.1卷积的作用
  • JVM执行引擎以及调优
  • mysql中除了InnoDB以外的其它存储引擎
  • 手写VUE后台管理系统6 - 支持TS声明文件.d.ts
  • 软著项目推荐 深度学习手势识别算法实现 - opencv python
  • git push 报错 error: src refspec master does not match any 解决
  • 视频文件+EasyDarwin做摄像机模拟器模拟RTSP流很方便,还能做成系统服务,方法与流程
  • 浅析HTML中的图片格式
  • 怎么运营网站不受漏洞攻击
  • 公共部门生成式人工智能的未来
  • flink安装与配置-脚本一键安装(超简单)
  • Servlet是什么
  • 配置 Mantis 在 Windows 上的步骤
  • sqli-labs靶场详解(less38-less45)
  • 如何使用PHPUnit编写一个PHP单元测试-简单的代码示例
  • 【LeetCode】每日一题 2023_12_3 可获得的最大点数(前缀和/滑动窗口/贪心)
  • 第十四章 算法和数据结构
  • 〖大前端 - 基础入门三大核心之JS篇㊺〗- 定时器和延时器
  • Qt面试题
  • 使用凌鲨进行内网穿透
  • WebUI自动化学习(Selenium+Python+Pytest框架)003
  • 循环神经网络RNN及其变体LSTM、GRU
  • QT 中 QTimer 类 备查
  • 计算机导论——第39章 文件和目录
  • SCAU:1065 数组中的指针
  • Hdoop学习笔记(HDP)-Part.17 安装Spark2
  • 数据领域建设的五大方向