diff --git a/notes/Redis.md b/notes/Redis.md index 510e4776..84396d00 100644 --- a/notes/Redis.md +++ b/notes/Redis.md @@ -51,7 +51,7 @@ Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。 -键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 +键的类型只能为字符串,值支持五种基本数据类型:字符串、列表、集合、散列表、有序集合,此外还有位图、HyperLogLog、地理空间、流(Stream)等类型。 Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能。 @@ -365,7 +365,7 @@ List 是一个双向链表,可以通过 lpush 和 rpop 写入和读取消息 在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。 -可以使用 Redis 自带的 SETNX 命令实现分布式锁,除此之外,还可以使用官方提供的 RedLock 分布式锁实现。 +可以使用 SET 命令的 NX 和 PX 选项实现单实例的分布式锁,除此之外,还可以使用官方提出的 RedLock 算法在多个独立实例上实现分布式锁,详见 [分布式](分布式.md)。 ### 其它 @@ -393,7 +393,7 @@ Redis Cluster 实现了分布式的支持。 ### 内存管理机制 -- 在 Redis 中,并不是所有数据都一直存储在内存中,可以将一些很久没用的 value 交换到磁盘,而 Memcached 的数据则会一直在内存中。 +- Redis 和 Memcached 的数据都一直存储在内存中。Redis 曾经支持把很久没用的 value 交换到磁盘(虚拟内存),但是该特性已经在 2.6 版本移除。 - Memcached 将内存分割成特定长度的块来存储数据,以完全解决内存碎片的问题。但是这种方式会使得内存的利用率不高,例如块的大小为 128 bytes,只存储 100 bytes 的数据,那么剩下的 28 bytes 就浪费掉了。 @@ -401,13 +401,13 @@ Redis Cluster 实现了分布式的支持。 Redis 可以为每个键设置过期时间。过期的键不会在过期的瞬间被删除,而是通过两种策略清除:惰性删除,在访问键时检查它是否过期,过期就删除;定期删除,后台定时随机抽取一部分设置了过期时间的键进行检查,删除其中已经过期的键。 -对于散列表这种容器,只能为整个键设置过期时间(整个散列表),而不能为键里面的单个元素设置过期时间。 +对于散列表这种容器,Redis 7.4 之前只能为整个键设置过期时间,7.4 开始可以使用 HEXPIRE 等命令为单个字段设置过期时间。 ## 七、数据淘汰策略 可以设置内存最大使用量,当内存使用量超出时,会施行数据淘汰策略。 -Redis 具体有 6 种淘汰策略: +Redis 4.0 之后具体有 8 种淘汰策略: | 策略 | 描述 | | :--: | :--: | @@ -416,6 +416,8 @@ Redis 具体有 6 种淘汰策略: |volatile-random | 从已设置过期时间的数据集中任意选择数据淘汰 | | allkeys-lru | 从所有数据集中挑选最近最少使用的数据淘汰 | | allkeys-random | 从所有数据集中任意选择数据进行淘汰 | +| volatile-lfu | 从已设置过期时间的数据集中挑选最不经常使用的数据淘汰 | +| allkeys-lfu | 从所有数据集中挑选最不经常使用的数据淘汰 | | noeviction | 禁止驱逐数据 | 作为内存数据库,出于对性能和内存消耗的考虑,Redis 的淘汰算法实际实现上并非针对所有 key,而是抽样一小部分并且从中选出被淘汰的 key。 @@ -460,7 +462,7 @@ Redis 是内存型数据库,为了保证数据在断电后不会丢失,需 一个事务包含了多个命令,服务器在执行事务期间,不会改去执行其它客户端的命令请求。 -事务中的多个命令被一次性发送给服务器,而不是一条一条发送,这种方式被称为流水线,它可以减少客户端与服务器之间的网络通信次数从而提升性能。 +事务中的命令会先被服务器放入队列,EXEC 时依次执行。流水线(Pipelining)是另一个概念,指客户端不等待响应就连续发送多条命令,从而减少网络往返次数,事务通常和流水线一起使用。 Redis 最简单的事务实现方式是使用 MULTI 和 EXEC 命令将事务操作包围起来。 @@ -531,7 +533,7 @@ def main(): ## 十一、复制 -通过使用 slaveof host port 命令来让一个服务器成为另一个服务器的从服务器。 +通过使用 REPLICAOF host port 命令来让一个服务器成为另一个服务器的从服务器(5.0 之前为 SLAVEOF,现已弃用)。 一个从服务器只能有一个主服务器,并且不支持主主复制。