Redis内幕揭秘:探索Redis基础知识及应用场景,挖掘出高效的缓存技术

news2024/10/6 10:36:30

Redis 是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。以下是 Redis 的发展史:

  • 2009 年:Salvatore Sanfilippo 开始编写 Redis。
  • 2010 年:Redis 发布了 1.0 版本。这个版本包含了许多常用的数据结构,例如字符串、哈希表、列表、集合和有序集合。
  • 2012 年:Redis 发布了 2.6 版本,引入了持久化机制和 Lua 脚本支持。
  • 2014 年:Redis 发布了 3.0 版本,添加了 Cluster 功能,允许将多个 Redis 实例组成分布式集群。
  • 2015 年:Redis 发布了 3.2 版本,引入了模块化扩展功能,允许开发者编写自定义的 Redis 模块。
  • 2018 年:Redis 发布了 5.0 版本,引入了 Streams 数据类型和更好的集群管理工具。
  • 2021 年:Redis 发布了 6.2 版本,添加了 RedisRaft 模块,使得 Redis 可以支持强一致性分布式系统。

随着时间的推移,Redis 已经成为了一个非常流行的开源项目,并被广泛应用于互联网和企业级应用程序中。

1、Redis基础

1.1、数据类型

1)String(字符串):最基本的数据结构,可以存储任何类型的字符串、数字或二进制数据。

2)Hash(哈希表):类似于关联数组或字典,可以存储多个字段和对应的值,常用于存储对象属性或配置信息。

3)List(列表):一个有序的字符串列表,支持在列表两端进行插入和删除操作,还提供了多种操作,如查找、裁剪、排序等。

4)Set(集合):一个无序的字符串集合,支持添加、删除、查找和求交、并、差等操作,还提供了多种操作,如求随机元素、判断元素是否存在等。

5)ZSet(有序集合):和 Set 类型相似,但是每个元素都有一个分数(score),根据分数进行排序,可以支持按照分数范围进行查找、插入和删除操作。

1.2、持久化机制

Redis 的持久化机制有两种:RDB(Redis Database)和AOF(Append Only File)。

1)RDB 持久化:将 Redis 内存中的数据以快照的形式保存到硬盘中,即生成一个 RDB 文件。可以手动或自动设置定时保存 RDB 文件。当 Redis 重启时,会从 RDB 文件中读取数据并恢复数据库状态。RDB 持久化适用于大规模的数据集和较长时间的备份。

2)AOF 持久化:将 Redis 执行的写命令追加到 AOF 文件中,记录了 Redis 修改数据的所有操作。由于 AOF 文件是一个完整的 Redo 日志,因此当 Redis 重启时可以通过重新执行 AOF 文件中的所有写命令来还原数据。AOF 持久化适用于需要高耐久性的场景,比如金融、电商等行业。

在使用 Redis 的持久化机制时,还需要注意以下几点:

  • 如果同时开启了 RDB 和 AOF,Redis 支持首先使用 AOF 进行数据恢复,然后再使用 RDB 文件进行备份。
  • RDB 文件和 AOF 文件都可能比内存中的数据要旧,因此如果数据非常关键,最好同时开启 RDB 和 AOF,保证不丢失数据。
  • 定期保存 RDB 文件和 AOF 文件的频率应该根据实际需求进行调整,以平衡数据备份和性能损耗之间的关系。
  • Redis 还提供了 BGSAVE 和 BGREWRITEAOF 命令来异步执行 RDB 和 AOF 持久化操作,避免阻塞 Redis 主线程。

当然生产上大多数是这两种机制同时使用,以保证数据的安全性和可靠性。

1.3、部署方式

1)Sentinel 实例进行监控和故障转移,实现 Redis 的自动故障恢复和主备切换。

2)Redis Cluster:Redis Cluster 是 Redis 官方提供的分布式集群方案,支持数据分片和节点扩展,可以在不丢失数据的前提下动态增加或减少节点数量,提高了集群的可扩展性和容错性。

3)Codis:Codis 是一个开源的 Redis 数据库中间件,基于 Redis 的主从复制和分片机制,提供了多种功能,如数据分片、节点管理、读写分离、高可用性等,并且可以与 ZooKeeper 等 Apache 开源软件进行整合。

4)Twemproxy:Twemproxy(也称为 Nutcracker)是一个类似于代理服务器的 Redis 中间件,支持多个 Redis 实例的负载均衡和故障转移,可以提高 Redis 集群的性能和可靠性。

2、Redis应用场景

2.1、缓存

Redis 最常见的应用场景就是作为缓存来提高读写性能。由于 Redis 基于内存读写,响应速度非常快,因此可以用来缓存热点数据,如网站首页、商品信息等。通过使用 TTL(time to live)机制来设置缓存过期时间,可以避免缓存数据过期而导致的问题。

2.2、分布式锁

Redis 可以用作分布式锁,通过设置一个唯一的键值对来控制访问某个资源的并发数。当一个客户端需要访问该资源时,先去获取分布式锁,执行完后再释放锁,以保证同时只有一个客户端在访问该资源。这种方式可以有效避免因为并发访问而导致的数据冲突和竞争问题。

Redis实现分布式锁的技术方案有很多,其中比较常用的包括:

1)基于SETNX命令+Lua脚本:使用SETNX命令创建一个键值对,如果该键不存在,表示加锁成功;否则表示加锁失败。释放锁时,使用DEL命令删除该键。配合Lua脚本可以让加锁和释放锁过程封装成原子性操作,避免出现误删等问题。

2)Redisson:是一个Java实现的Redis客户端,提供了完整的分布式锁解决方案,支持多种锁模式(例如可重入锁、公平锁等),并提供了超时自动释放锁、异步执行等功能。

3)Spring Boot + LockRegistry(推荐):LockRegistry是Spring Boot提供的接口,可以轻松地将分布式锁嵌入到应用程序中。LockRegistry接口可以与不同的分布式锁提供者(如Redis)集成,并提供了简单易用的API,使开发人员无需关注底层实现细节。

需要注意的是,在选择分布式锁方案时,需要根据实际情况进行考虑。不同的方案具有不同的特点和适用场景,需要根据业务需求和系统负载情况进行选择和优化。同时,分布式锁的实现过程需要特别注意死锁和误删等问题,必要时可以借助第三方库进行实现。

2.3、实时排行榜

Redis 可以用来实现实时排行榜,通过将用户行为数据记录下来,如点赞数、评论数等,然后通过 ZSET(有序集合)数据类型来实现实时排名和排序。这种方式可以很好地满足诸如游戏排名、电商销量排行等实时统计的需求。

2.4、计数器/自增ID

Redis 还可以用作计数器,通过使用 INCR 命令来实现。当需要对某个计数器进行增加操作时,只需要执行一次 INCR 命令即可。由于 Redis 的原子性操作,可以保证在高并发场景下的数据一致性。

2.5、消息队列

Redis 也可以用作消息队列,在分布式系统中起到重要的作用。生产者将消息存入队列中,消费者从队列中取出消息进行处理。通过使用 Redis 的 PUB/SUB(发布/订阅)功能或者 Stream来实现消息的发布和订阅,保证了消息传递的可靠性和高效性。

2.6、地理位置应用

Redis 还具有地理位置服务的特性,可以记录每个用户的位置信息,并将其保存在 Redis 中。然后通过 GeoHash 和 Geospatial 数据类型来实现位置信息的查找和计算,以实现类似于附近的人、打车等服务。

3、Redis进阶

3.1、数据类型

除了常见的 String、Hash、List、Set、ZSet 等数据类型,Redis 还支持以上提到的其他数据类型,如 Bitmaps、HyperLogLog、Geo 和 Streams 等。

1)JSON

虽然Redis在自身的核心中并不原生支持JSON数据类型,但是通过Redis模块系统,可以使用第三方扩展模块来支持JSON数据类型。Redis 4.0及以上版本引入了Modules(模块)系统,允许开发者编写自己的扩展模块来扩展Redis的功能。目前有一些第三方模块已经实现了对JSON数据类型的支持,例如RedisJSON和ReJSON等。

2)发布订阅/Redis Streams:

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。Redis中的订阅发布模式, 当没有订阅者时, 消息会被直接丢弃(Redis不会持久化保存消息)。

Redis Stream 是 Redis 5.0 版本新增加的数据结构。Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。

3)Geo

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。

3.2、Redis管道技术

Redis管道技术是一种优化Redis客户端与服务器之间交互的方式,它可以将多个命令打包在一起发送到Redis服务器,从而减少了网络传输和客户端/服务器之间的通信次数,提高了Redis的性能。具体来说,Redis管道技术的工作流程如下:

1)客户端向Redis服务器发送多个命令。

2)Redis服务器将这些命令缓存到队列中,并等待客户端的响应。

3)客户端接收到服务器响应后,再一次性地发送所有命令的响应结果。

4)Redis服务器处理这些响应结果,并将它们返回给客户端。

通过使用Redis管道技术,可以显著降低Redis客户端与服务器之间的延迟,并提高数据读写效率。此外,Redis管道技术还具有批量操作、事务处理等功能,可以简化编程和管理复杂性。

需要注意的是,虽然Redis管道技术可以提高Redis的性能,但也会增加系统复杂性和内存负担。因此,在实际使用中,需要根据业务需求和系统负载情况进行合理调整和配置。

4、相关问题

1)Redis为什么那么快?

(1)内存存储:Redis将数据存储在内存中,使得读写速度非常快。同时,Redis也提供持久化机制,可以将内存数据异步地写入磁盘中,保证数据的安全性和可靠性。

(2)非阻塞I/O多路复用机制:Redis使用非阻塞I/O模型,避免了线程上下文切换和系统调用带来的开销,从而大幅提高了并发吞吐量。

(3)单线程架构:Redis采用单线程架构,避免了多线程间的同步和锁竞争等问题,简化了代码实现和维护。

(4)数据结构优化:Redis内置了多种数据结构(如哈希表、有序集合等),并对其进行了优化,使得操作复杂度低,并能在很短的时间内完成大量的数据处理。

(5)预分配内存:Redis在初始化时会预先分配一定量的内存空间,避免了频繁的内存分配和释放过程,提高了性能。

2)Redis为什么使用单线程?

Redis官方的回复:

“Redis的性能瓶颈通常不在CPU上,而是其他因素(如磁盘I/O和网络请求等)限制了系统的性能。”

3)Redis支持多线程吗?

Redis采用单线程模型,不支持多线程操作。这是因为Redis是一个基于内存的数据存储系统,大部分操作都需要访问内存,而内存访问通常是CPU密集型任务,多线程情况下会存在线程之间的上下文切换和锁竞争等问题,反而会降低效率。

虽然Redis 6.0+ 引入多线程IO,但只是用来处理网络数据的读写、协议的解析及日志操作等,而执行命令依旧是单线程,所以不需要去考虑set/get、事务、lua等的并发问题。

4)Redis有哪些数据结构?

Redis支持字符串、哈希表、列表、集合和有序集合等五种数据结构。

5)Redis的持久化机制有哪些?它们之间有什么区别?

Redis支持RDB(快照)和AOF(追加式文件)两种持久化机制。RDB会定期将内存数据快照写入磁盘文件,而AOF则将所有操作命令追加到一个日志文件中。相比而言,AOF更为可靠,但同时也需要更多的磁盘空间和IO资源。

6)Redis如何实现分布式锁?

Redis可以通过SETNX命令创建一个键值对作为锁,并使用Lua脚本实现原子性的加锁和释放锁操作。此外,还可以使用第三方库如Redisson提供的分布式锁解决方案。

7)Redis支持哪些类型的命令?

Redis支持基本的读写命令,如GET/SET/HGETALL等,以及一些高级命令,如事务、发布订阅等。

8)Redis的线程模型是什么?

Redis采用单线程架构,但通过使用事件驱动和非阻塞I/O技术,可以处理大量并发请求。

9)Redis如何保证数据的一致性?

Redis采用原子性操作和持久化机制来保证数据的一致性。例如,可以使用Redis事务(MULTI/EXEC)、管道技术、Lua脚本等方式实现原子性操作;通过开启持久化功能,可以将内存数据写入磁盘文件并在服务器重启后恢复数据。

10)Redis如何处理大量的并发请求?

Redis采用非阻塞I/O多路复用和事件驱动模型,可以高效地处理大量并发请求,并提供了线程池和缓冲区等机制来进一步优化性能。

11)Redis有哪些常见的应用场景?

Redis常见的应用场景包括缓存、计数器、消息队列、分布式锁等。

12)Redis的集群模式有哪些?

Redis支持主从复制、Sentinel哨兵模式和Cluster集群模式三种集群模式。其中,主从复制和Sentinel模式适用于较小的系统或需要高可用的场景,而Cluster模式则适用于更大规模的系统。

13)Redis如何实现发布订阅功能?

Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。

=================================

如果文章对你有帮助,请不要忘记加个关注、点个赞!!!

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

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

相关文章

在陌生人社交场景 挖呀挖呀挖……

在陌生人社交场景 挖呀挖呀挖, 找可靠的大品牌(网易),享最优惠的价~ 😄 对于“深挖”娱乐社交领域需求的开发者来说,陌生人社交是毋庸置疑最受青睐的场景。尤其是对渴望交流、敢于表达自我的年轻人来说&…

10-HTML-表单标签

标签描述<form>定义供用户输入的 HTML 表单。<input>定义输入控件。<textarea>定义多行的文本输入控件。<button>定义按钮。<select>定义选择列表&#xff08;下拉列表&#xff09;。<optgroup>定义选择列表中相关选项的组合。<option&…

【Rust日报】2023-05-10 llm - 使用Rust在CPU上运行大模型

llm - 使用Rust在CPU上运行大模型 这是一套工具。目前支持这些模型&#xff1a; GPT-2GPT-JLLaMA: LLaMA, Alpaca, Vicuna, Koala, GPT4All v1, GPT4-X, WizardGPT-NeoX: GPT-NeoX, StableLM, Dolly v2 (partial, not the same tensor names?)BLOOM: BLOOMZ https://github.co…

多优先级(笔记)

目录 支持多优先级的方法通用方法优化方法1、修改任务控制块2、修改xTaskCerateStactic()修改 prvInitialiseNewTask() 函数prvAddTaskToReadyList()初始化任务列表prvAddTaskToReadyList()vTaskStartScheduler()vTaskDelay()vTaskSwitchContext()xTaskIncrementTick() 实验实验…

如何成就一个伟大的公司?

任何事物都不及“伟大”那样简单&#xff0c;事实上&#xff0c;能够“简单”便是伟大。最优秀的模式&#xff0c;往往是最简单的东西。 那么&#xff0c;如今作为一名创业者&#xff0c;要如何才能更好的发展自己的公司&#xff0c;把带领的团队打造成为一个伟大的公司呢&…

MySQL基础(二十八)索引优化与查询优化

都有哪些维度可以进行数据库调优?简言之: 索引失效、没有充分利用到索引——索引建立关联查询太多JOIN (设计缺陷或不得已的需求)——SQL优化服务器调优及各个参数设置(缓冲、线程数等)———调整my.cnf。数据过多――分库分表 关于数据库调优的知识点非常分散。不同的DBMS&…

基于Vue3 + ts + echarts(版本5.X)实现中国地图下钻、地图打点、地图热力图功能

写在前面&#xff1a; 实现效果图 1.比较重要的部分用红字标出 2.安装echats: npm install echarts --save 3.由于echarts5版本的已经没有自带地图数据了&#xff0c;所以地图数据需要到专门的GEO数据网站中下载。这里提供一个阿里的下载地址&#xff1a;DataV.GeoAtl…

云原生环境下的安全实践:保护应用程序和数据的关键策略

文章目录 云原生环境下的安全实践&#xff1a;保护应用程序和数据的关键策略一.安全措施和实践1. 身份和访问管理&#xff1a;2. 容器安全&#xff1a;3. 网络安全&#xff1a;4. 日志和监控&#xff1a;5. 持续集成和持续交付&#xff08;CI/CD&#xff09;安全&#xff1a;6.…

【学习笔记-myabtis】使用mybtis对接pgsql的postgis插件,获取地理字段Geometry信息

使用mybtis对接pgsql的postgis插件&#xff0c;获取地理字段geometry信息 参考资料&#xff1a; Mybatis 自定义TypeHandler - 邓维-java - 博客园 1、如何使用typehandler ​ 相信大家用Mybatis这个框架至少一年以上了吧&#xff0c;有没有思考过这样一个问题&#xff1a;数据…

xxl-job 是什么?

xxl-job 是什么&#xff1f; XXL-JOB 是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 设计思想 是将调度行为抽象形成 调度中心 平台&#xff0c;平台本身不承担业务逻辑&#xff0c;而是负责发起 调度请求 后&#xff0c;由 执…

右下角任务栏出现广告持续闪烁解决方法

&#x1f466;&#x1f466;一个帅气的boy&#xff0c;你可以叫我Love And Program &#x1f5b1; ⌨个人主页&#xff1a;Love And Program的个人主页 &#x1f496;&#x1f496;如果对你有帮助的话希望三连&#x1f4a8;&#x1f4a8;支持一下博主 右下角任务栏出现广告持…

【K8S】【Jenkins】【CI/CD】【一】交付CI/CD工具至k8s 【待写】

1 安装Harbor镜像仓库&#xff08;之前已部署 &#xff0c;略&#xff09; 可参考之前的《Kubernetes业务迁移.pdf》 网站-账号密码 http://gitlab.oldxu.net:30080/users/sign_in &#xff08; root/ admin12345 &#xff09; http://sonar.oldxu.net:30080/ …

Type-C显示器是什么,Type-C显示器的5大优势

在显示器领域内&#xff0c;USB Type-C接口还处于发展阶段&#xff0c;目前已经在新推出的一些高端显示器和旗舰显示器中有配置。USB Type-C接口的出现&#xff0c;将会形成以显示器为核心的桌面解决方案&#xff0c;用户可以把任何笔记本、手机、平板等等的画面转移到一台大屏…

使用sklearn,报错Library not loaded: @rpath/libgfortran.3.dylib

因为需要使用sklearn&#xff0c;去做一些数据分析&#xff0c;所以使用conda命令进行安装 conda install scikit-learn 在安装完成之后&#xff0c;导入&#xff0c;并使用拟合优度R2函数评估&#xff0c;发生如下报错&#xff1b; import sklearn as sk r2 sk.metrics.r2_sc…

怎么安全快速地创建Windows7文件差异备份任务?

​什么是差异备份&#xff1f; 差异备份是什么呢&#xff1f;简单来说&#xff0c;差异备份就是一种数据备份类型&#xff0c;它会帮助我们备份自上次完整备份以来已更改的全部文件。 举个例子&#xff0c;假如我们在星期一进行了一次完整备份&#xff0c;那么星…

有数·智享未来 | 新华三重磅发布绿洲平台3.0

5月10日&#xff0c;紫光股份旗下新华三集团以“有数智享未来”为主题&#xff0c;成功举办绿洲平台3.0新品发布会。全新一代绿洲平台实现内核进阶&#xff0c;以五大技术能力升级、五大行业方案沉淀、六类服务能力保障&#xff0c;三位一体构筑更领先的用数底座、更落地的用数…

ASEMI代理LT8471IFE#PBF原装ADI车规级LT8471IFE#PBF

编辑&#xff1a;ll ASEMI代理LT8471IFE#PBF原装ADI车规级LT8471IFE#PBF 型号&#xff1a;LT8471IFE#PBF 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;TSSOP-20 批号&#xff1a;2023 引脚数量&#xff1a;20 工作温度&#xff1a;-40C~125C 安装类型&#xff1a;表面…

Protobuf:一种轻量级、高效的数据交换格式,附Java与Python数据交换示例

目录 下载安装Protobuf定义数据格式Java代码序列化Python反序列化 Protobuf&#xff08;Protocol Buffers&#xff09;是由 Google 开发的一种轻量级、高效的数据交换格式 官方文档&#xff1a;https://protobuf.dev/overview/GitHub&#xff1a;https://github.com/protocolb…

佩戴舒适的蓝牙耳机有哪些?蓝牙耳机佩戴舒适度排名

随着技术的成熟&#xff0c;真无线耳机这个市场竞争也越来越激烈&#xff0c;伴随着TWS真无线耳机快速发展&#xff0c;许多耳机品牌凭借着优质的产品抓住了时代机遇&#xff0c;各家无论是手机厂商还是耳机品牌争相布局真无线耳机市场&#xff0c; 下面笔者整理了几款佩戴舒适…

Towards Open World Object Detection(OWOD)代码复现

参考上一篇博客detectron2-入门安装,然后进行以下操作&#xff1a; 1、首先在OWOD文件目录运行以下代码&#xff0c;完成内部构建 python -m pip install -e ./ 2、数据集准备 首先下载数据集Annotations和JPEGImages:下载链接&#xff0c;需要翻墙&#xff0c;下载方法可以…