首页 > 自考资讯 > 高考百科

学 Redis,至少要看看这篇!7000 字小结

小条 2024-06-27

Redis概述

Redis是一个完全开源、免费、符合BSD协议的高性能键值数据库。

Redis等key-value缓存产品具有三个特点:

Redis 支持数据持久化,允许将内存中的数据保存到磁盘并重新加载以供重新启动时使用。 Redis不仅支持简单的key-value数据,还提供列表、集合、zset、哈希等数据结构的存储。 Redis支持数据备份,即主从模式的数据备份。

极高的性能——Redis读取速度为110,000次/秒,写入速度为81,000次/秒。丰富的数据类型- Redis 支持二进制情况下的字符串、列表、哈希、集合和有序集合数据类型操作。原子性——Redis 中的所有操作都是原子的。也就是说,操作要么成功,要么失败,或者根本不执行。各个操作都是原子的。多个操作还支持由MULTI 和EXEC 指令或原子性包装的事务。其他功能- Redis 还支持发布/订阅通知和密钥过期等功能。 Redis 数据类型

Redis 支持五种数据类型:字符串、散列、列表、集合和zset(排序集)。

细绳

字符串是Redis 中最基本的数据类型。键对应于值。

字符串是二进制安全的。这意味着Redis 字符串可以包含任意数据。例如,jpg 图像或序列化对象。

字符串是Redis中最基本的数据类型,字符串值最大可以存储512MB。

理解:字符串就像Java中的一张地图,一个键对应一个值。

0086794f5eb048bb8f578d932af62b9f~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720063758&x-signature=rALSdKBHjkMG7GGRfJaBcbmWbVw%3D

学习Redis这篇文章就够了

127.0.0.1:6379 hello worldOK127.0.0.1:6379 hello'world' 获取哈希

Redis 哈希是键值对的集合。

Redis 哈希是String 类型的键值映射表,特别适合存储对象。

理解:哈希可以被视为一组键和值。您也可以将其视为多个字符串的哈希。

与字符串的区别:字符串是键值对,而哈希是多个键值对。

ccbaec3073234a6a8a1addf317842761~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720063758&x-signature=AhldZm5ejSPIjgIeD1EPVNgyal8%3D

学习Redis这篇文章就够了

//哈希键可以被认为是键值对集合的名称。这里添加了三个键值对127.0.0.1:6379。 hset hash-key sub-key1 value1(integer) 1127.0.0.1:6379 hset hash-key sub-key2 value2(integer) 1127.0.0.1:6379 hset hash-key sub-key3 value3(integer) 1//获取此哈希的哈希密钥。所有键值对127.0.0.1:6379 hgetall hash-key1) ' sub-key1'2) 'value1'3) 'sub-key2'4) 'value2'5) 'sub-key3'6) 'value3' //删除此哈希中sub-key2 的hash -key 键值对为127.0.0.1:6379 hdel hash key subkey 2(integer) 1127.0.0.1:6379 hget hash key subkey 2(nil)127.0.0.1:6379 hget hash key subkey 1'value1 '127.0 .0.1:6379 哈希键1) 'sub-key1'2) 'value1'3) 'sub-key3'4) 'value3' 列表

Redis 列表是按插入顺序排序的简单字符串列表。您可以将元素添加到列表的左侧或右侧。

95f8756a2eee4ad495468a671fa5649c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720063758&x-signature=EB66jjpkvSTIMzswXiDrQAR5XEw%3D

学习Redis这篇文章就够了

127.0.0.1:6379 rpush 列表键v1(整数) 1127.0.0.1:6379 rpush 列表键v2(整数) 2127.0.0.1:6379 rpush 列表键v1(整数) 3127.0.0.1:6379 lrange 列表键0 - 11) v1'2) ' v2'3) ' V1'1270.0.0.1:6379 LINDEX 列表键1'V27.0.0.0.1:6379 列表(无)127.0.0.1:6379 列表键'V1'127.0.0.1336063737 9 LRANGE 列表-键-11 ) 'V2' 2 ) 'v1' 列出它事实证明这是一个简单字符串的集合。这与Java的列表没有太大区别。不同的是这里的列表存储的是字符串。列表中的元素是可迭代的。

Redis 中的集合是字符串类型的无序集合。集合是通过哈希表实现的,所以添加、删除、查找复杂度都是O(1)。

ef0a68a1a37944f19fc1f74528799c60~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720063758&x-signature=0d9tP%2FtGOvFCFJ2nYfQaVzUyFKA%3D

学习Redis这篇文章就够了

012 7.0.0.1:6379 成员k11) 'v3'2) 'v2' 3) 'v1'127.0.0.1:6379127.0.0.1:6379 sismember k1 k4(整数) 0127.0.0.1:6379 sismember v 1 (整数)1127.0.0.1:6379 srem k1 v2(整数) ) 1127. 0.0.1:6379 srem k1 v2(integer) 0127.0.0.1:6379 smembers k11 ) 'v3'2) 'v1' Redis 集与Java 集略有不同。 redis中的集合是一个key对应多个字符串类型的值,也是字符串类型的集合。但是,与Redis 中的列表不同,您无法迭代集合中的字符串集合元素,但可以迭代列表。

泽塞特

与集合一样,redis zset 是字符串类型元素的集合,集合内的元素不能重复。

不同之处在于zset 的每个元素都与一个双倍分数相关联。 Redis 使用分数对集合中的成员从小到大进行排序。

虽然zset的元素是唯一的,但分数是可重复的。

ef0a68a1a37944f19fc1f74528799c60~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720063758&x-signature=0d9tP%2FtGOvFCFJ2nYfQaVzUyFKA%3D

学习Redis这篇文章就够了

127.0.0.1:6379 zadd zset-key 728 member1(整数) 1127.0.0.1:6379 zadd zset-key 982 member0(整数) 1127.0.0.1:6379 zadd zset-key 982 member0(整数) .0.13336 0 6 379 zrange zset-key 0 -1 withscores1) ' member1 '2) '728'3) 'member0'4) '982'127.0.0.1:6379 zrangebyscore zset-key 0 800 withscores1) '728'127.0.0.1:6379 zrem zset-key member1(整数) 1127.0.0.13336 063 79 z 雷姆zset- key member1(integer) 0127.0.0.1:6379 zrange zset-key 0 -1 withscores1) 'member0'2) '982'zset 根据分数大小排序。

概括

类型介绍特征场景字符串(String)二进制安全可以包含任意数据,例如jpg图像或序列化对象。一个key最多可以存储521M。 hash 键值对的集合(编程语言中的映射)。该类型适合存储对象,并且只允许更改某些属性值,例如数据库中的更新。列表是一种双向链表,可以快速添加和删除。提供操作特定元素的API1、最新新闻排行等功能。 (时间轴时刻) 2. 消息队列不能重复添加或删除元素。 1)互友通过交、并、差等操作统计所有访问您网站的独立IP。对于某些阈值,可以推荐Zset(有序集)。当有序数据插入到集合中时,为Set中的元素添加权重参数分数将执行自然排名列表。柱子

基本命令

亲自检查一下

公开订阅

Redis一般不用于消息发布和订阅。

介绍

Redis 发布和订阅(pub/sub)是一种消息通信模型。发送者(pub) 发送消息,订阅者(sub) 接收消息。

Redis 客户端可以订阅任意数量的频道。

下图展示了频道channel1与订阅该频道的三个客户端—— client2、client5、client1之间的关系。

d52deb09be6f421bbf051f4f253f3241~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720063758&x-signature=SrTIvICcvapg2q99zlta7WzyKxI%3D 学习Redis这篇文章就够了

当通过PUBLISH命令向通道channel1发送新消息时,该消息将被发送到订阅该消息的三个客户端。

学习Redis这篇文章就够了

例子

以下示例显示了发布和订阅的工作原理。在此示例中,我们创建了一个名为redisChat: 的订阅频道。

127.0.0.1:6379 SUBsCRIBE redisChatReadingmessages.(按Ctrl-C退出)1) 'subscribe'2) 'redisChat' 然后先重新打开Redis客户端,然后在同一个频道redisChat上发布两条消息即可。订阅即可接收。信息。

127.0.0.1:6379 PUBLISH redisChat 'send message'(integer) 1127.0.0.1:6379 PUBLISH redisChat 'hello world'(integer) 1# 订阅者的客户端将看到1) 'message'2) 'redisChat'3) 'send message'1 ) 'message '2) 'redisChat'3) 'hello world' 发布订阅常用命令

亲自检查一下

办公室工作

Redis 事务可以一次执行多个命令。在命令执行过程中,服务器不会执行其他客户端的命令请求。

这种在事务中一次向服务器发送多个命令而不是一次发送一个命令的方法称为流水线,可以通过减少客户端和服务器之间的网络通信次数来提高性能。

在Redis 中实现事务的最简单方法是使用MULTI 和EXEC 命令来围绕事务操作。

在发送EXEC 命令之前,批处理操作会在缓存中排队。收到EXEC 命令后,事务开始执行。如果事务中的任何命令执行失败,则其余命令继续执行。换句话说,Redis事务不保证原子性。事务执行过程中,其他客户端发送的命令请求不会插入到事务执行命令序列中。一笔交易从发起到执行要经历三个阶段:

创业。命令他们加入队伍。执行交易。例子

这是一个交易示例:使用MULTI 启动事务并将多个命令排队到事务中。最后,EXEC命令触发事务并执行事务内的所有命令。

redis 127.0.0.1:6379 MULTIOKredis 127.0.0.1:6379 SET 书名'21 天掌握C++'QUEUEDredis 127.0.0.1:6379 GET 书名QUEUEDredis 127.0.0.1:6379 SADD 标签'C++ ‘编程’‘母带系列’QUEUEDredis 127.0.0.1:6379 SMEMBERS TagQUEUEDredis 127.0. 0.1:6379 EXEC1) OK2) '21 天掌握C++'3) (整数) 34) 1) '掌握系列' 2) 'C++' 3) '编程' 执行单个Redis 命令是原子的,但Redis 不是原子的。添加维护事务原子性的机制。这使得Redis 事务执行成为非原子的。

事务可以理解为打包好的批量执行脚本,但批量指令并不是原子操作。如果指令在中间失败,它不会回滚先前执行的指令或阻止后续指令执行。

这是官方网站上的描述。来自transaction: 的redis 文档的描述。请注意,即使命令失败,队列中的所有其他命令也会被处理。例如:

redis 127.0.0.1:7000 multiOKredis 127.0.0.1:7000 aaaQUEUEDredis 127.0.0.1:7000 设置b bbbQUEUEDredis 127.0.0.1:7000 设置c cccQUEUEDredis 127.0.0.1 6 07 000 exec1) OK2) OK3) OK 如果set b bbb 失败,set a 即使成功也会回滚。set c 仍将运行。

Redis事务命令

下表列出了与redis事务相关的命令。

序列号命令和说明1DISCARD 取消事务并放弃执行事务块内的所有命令。 2EXEC 执行事务块内的所有命令。 3MULTI 标记事务块的开始。 4UNWATCH 取消WATCH命令对所有按键的监控。 5WATCH key [key.] 如果在执行事务之前一个(或多个)键被其他命令修改,则会导致事务中止。

坚持

Redis是内存数据库,为了保证断电后数据不丢失,必须将内存中的数据保存到硬盘上。

RDB持久化

将特定时间点的所有数据保存到硬盘上。

您可以将快照复制到其他服务器,以创建具有相同数据的服务器副本。

如果您的系统出现故障,您将丢失自上次快照以来的数据。

如果数据量很大,保存快照会花费一些时间。

AOF持久化

将写入命令添加到AOF 文件(仅追加文件)的末尾。

要使用AOF 持久性,必须设置同步选项以确保写入磁盘文件的命令的时间同步。这是因为写入文件并不会立即将内容同步到磁盘,而是先将内容保存在缓冲区中,然后操作系统决定何时同步到磁盘。

选项同步频率始终在每个写入命令上同步eyerysec 每秒同步否让操作系统决定何时同步

everysec 选项更好,因为always 选项会显着降低服务器性能。这样可以保证系统崩溃时只有1秒左右的数据丢失,每秒Redis同步对服务器影响很小。 no 选项不会显着提高服务器性能,并且会增加系统崩溃时丢失的数据量。随着服务器写入请求数量的增加,AOF 文件变得越来越大。 Redis 提供了AOF 重写功能,允许您删除AOF 文件中多余的写入命令。

复制

使用smileof host port 命令使一台服务器成为另一台服务器的从属服务器。

一台从服务器只能有一台主服务器,不支持主服务器之间的复制。

连接过程

主服务器创建快照文件(RDB 文件),并将其发送到从服务器,使用缓冲区记录传输过程中执行的写入命令。发送快照文件后,服务器开始发送缓冲的写命令。从服务器丢弃所有旧数据,加载主服务器发送的快照文件,并开始接受来自主服务器的写入命令。主服务器每次执行写命令时,都会向从服务器发送相同的写命令。主从链

如果负载继续增加,主站将无法足够快地更新所有从站,并且从站重新连接和重新同步将使系统过载。要解决此问题,请创建一个中间层来卸载主服务器的复制工作。中间层服务器对于顶层服务器来说是从服务器,对于底层服务器来说是主服务器。

28c48fa1816e4bba810e7315ac7b9725~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720063758&x-signature=69pdAdNZTUD4%2F8tDJ3tseUAy5dg%3D b23f87c801344ee9929b6ccdabafacac~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720063758&x-signature=UByPhUI4v0gM0ypJ3mNne2ZscyI%3D

学习Redis这篇文章就够了

哨兵

Sentinel 监控集群中的服务器,当主服务器离线时,可以自动从从服务器中选择新的主服务器。

碎片化

分片是一种将数据分成多个部分的方法,这些部分可以存储在多台机器上。此方法允许您在解决特定问题时实现线性性能改进。

假设我们有四个Redis 实例R0、R1、R2、R3,其中有多个键代表用户user:1、user:2.有多种方法可以选择在哪个实例上存储给定的密钥。

最简单的是范围分片。例如,0 到1000 之间的用户ID 存储在实例R0 上,1001 到2000 之间的用户ID 存储在实例R1 上。然而,这需要维护映射范围表,维护成本很高。另一个是哈希分片。使用CRC32 哈希函数将密钥转换为数字,并以已知的存储实例数为模进行计算。根据分片的位置不同,可以分为三种分片方式:

客户端分片:客户端使用一致性哈希等算法来决定分发到哪些节点。代理分片:您将客户端请求发送到代理,代理将其转发到正确的节点。服务器分片:Redis集群。

版权声明:本文转载于网络,版权归作者所有。如有侵权,请联系本站编辑删除。

猜你喜欢