上一篇地址:持续总结中!2024年面试必问 20 道 Redis面试题(一)-CSDN博客
三、Redis支持哪些数据类型?
Redis是一个多才多艺的内存数据存储系统,它支持多种数据类型,使得它能够适应各种不同的用例场景。以下是Redis支持的主要数据类型及其特点:
-
字符串(Strings):
- 基本的数据存储单元,一个键对应一个值。
- 可以存储字符串、整数或浮点数。
- 字符串的最大容量为512MB。
-
列表(Lists):
- 一个列表可以存储多个字符串元素,元素是有序的。
- 支持在列表头部或尾部添加(push)或移除(pop)元素。
- 常用于实现消息队列或简单的堆栈/队列结构。
-
集合(Sets):
- 一个集合可以存储多个不重复的字符串元素,元素是无序的。
- 支持添加、删除和测试操作。
- 可以进行集合间的交集、并集和差集操作。
-
有序集合(Sorted Sets):
- 类似于集合,但每个元素都关联了一个分数(或权重)。
- 元素会根据分数进行排序。
- 支持范围查询和获取排名信息。
-
哈希(Hashes):
- 一个哈希可以存储多个键值对(field-value)。
- 类似于其他数据库中的字典或对象。
- 支持添加、删除单个字段以及整个哈希。
-
位图(Bitmaps):
- 可以将字符串数据视为位的集合,并对其进行操作。
- 常用于实现大型数据集的快速操作。
-
超日志(HyperLogLogs):
- 用于基数统计,可以估算一个集合中唯一元素的数量。
- 优点是内存使用非常高效。
-
地理空间(Geospatial):
- 可以存储地理位置信息。
- 支持根据经纬度添加、删除和查询位置信息。
- 支持计算两个位置之间的距离和范围查询。
-
发布/订阅(Pub/Sub):
- 一种消息通信模式,允许消息发布者将消息发送到一个频道,而订阅者可以订阅一个或多个频道来接收消息。
- 消息是实时传递的。
-
流(Streams):
- Redis 5.0版本引入的新数据类型,用于消息队列(消息的持久化存储)。
- 支持消息的追加、读取和消费。
- 可以设置消息的过期时间。
-
键空间通知(Key-space notifications):
- 允许客户端订阅键空间中的事件,如键的添加、删除或过期。
- 可以用于实现缓存失效通知等场景。
-
脚本(Scripts):
- 支持使用Lua脚本进行原子操作,可以编写复杂的逻辑。
-
虚拟内存(VM):
- 允许Redis将部分数据交换到磁盘,以减少内存使用。
Redis的这些数据类型为开发者提供了极大的灵活性,使得Redis可以用于缓存、消息队列、排行榜、实时分析、数据聚合等多种应用场景。
四、Redis有哪几种数据淘汰策略?
Redis提供了多种数据淘汰策略,用于决定当内存不足时哪些数据应该被移除。这些策略对于内存管理至关重要,尤其是在处理大量数据时。以下是Redis支持的数据淘汰策略:
-
noeviction:
- 不淘汰任何数据。当达到最大内存限制时,所有引起内存使用的写入操作都会被拒绝。
-
allkeys-lru(Least Recently Used):
- 从所有键中淘汰最近最少使用的数据。这是一种常见的缓存淘汰策略,适用于访问模式不均匀的情况。
-
volatile-lru:
- 仅从设置了过期时间的键中淘汰最近最少使用的数据。如果设置了过期时间的键不足以释放所需内存,该策略将退化为noeviction。
-
allkeys-lfu(Least Frequently Used):
- 从所有键中淘汰使用频率最低的数据。这种策略适用于需要保留最常访问数据的场景。
-
volatile-lfu:
- 仅从设置了过期时间的键中淘汰使用频率最低的数据。如果使用频率最低的键不足以释放所需内存,该策略将退化为noeviction。
-
allkeys-random:
- 从所有键中随机淘汰数据。这种策略适用于数据访问模式均匀,且对数据的随机性要求不高的场景。
-
volatile-random:
- 仅从设置了过期时间的键中随机淘汰数据。如果随机淘汰的键不足以释放所需内存,该策略将退化为noeviction。
-
volatile-ttl:
- 从设置了过期时间的键中淘汰即将过期的数据。这种策略适用于希望尽快释放即将过期数据的场景。
Redis的淘汰策略可以通过配置文件中的maxmemory-policy
选项设置,或者在运行时通过CONFIG SET
命令动态更改。选择合适的淘汰策略取决于应用的具体需求和数据访问模式。例如,如果数据的访问频率和模式大致相同,可能会选择allkeys-random
;如果希望保留最近被频繁访问的数据,则可能会选择allkeys-lru
。
值得注意的是,Redis的淘汰策略只适用于内存中的数据,不会影响到持久化到磁盘的数据。即使数据在内存中被淘汰,只要存在持久化文件,这些数据仍然可以在Redis重启后恢复。