本文档全面概述了 Redis,一个流行的内存数据结构存储,可用作数据库、缓存、消息代理和流引擎。我们将探讨 Redis 的数据结构、持久化机制、缓存策略和常见用法。有关 MySQL 等其他数据库技术的信息,请参阅 MySQL。
Redis(Remote Dictionary Server)是一个开源的内存数据结构存储,可用作数据库、缓存、消息代理和流引擎。与传统数据库不同,Redis 将数据存储在内存中,提供极快的读写操作。
Redis 用 C 语言编写,没有外部依赖,最适合在 Linux 系统上运行。它支持各种数据结构和功能,使其适用于广泛的用例。
来源:docs/database/redis/redis-questions-01.md:19-27
Redis 通过多项优化实现了卓越的性能
来源:docs/database/redis/redis-questions-01.md:35-46
Redis 相较于其他数据存储解决方案具有优势
来源:docs/database/redis/redis-questions-01.md:61-74
Redis 支持多种数据结构,使其适用于不同的用例。理解这些结构是有效使用 Redis 的关键。
Redis 提供五种基本数据类型
字符串是 Redis 最简单的数据类型——二进制安全的序列,可以存储文本、整数、浮点数或二进制数据(如图像)。
实现:Redis 使用 Simple Dynamic String (SDS) 实现字符串,它支持
常用命令:
SET key valueGET keyMSET key1 value1 key2 value2...INCR key用例:
来源:docs/database/redis/redis-data-structures-01.md:15-132
列表是字符串值的链表,允许在列表的两端进行操作。
实现:最初实现为链表,现在使用 QuickList(链表和压缩列表的组合)以提高内存效率。
常用命令:
LPUSH/RPUSH key value [value ...]LPOP/RPOP keyLRANGE key start stop用例:
来源:docs/database/redis/redis-data-structures-01.md:135-201
哈希表将字段-值对映射起来,非常适合表示对象。
常用命令:
HSET key field valueHGET key fieldHMSET key field1 value1 field2 value2...HGETALL key用例:
来源:docs/database/redis/redis-data-structures-01.md:203-262
集合是无序的、不重复的字符串集合。
常用命令:
SADD key member [member ...]SMEMBERS keySINTER key1 key2SCARD key用例:
来源:docs/database/redis/redis-data-structures-01.md:264-329
有序集合将每个成员与一个分数关联起来,允许有序操作。
实现:内部使用跳表和哈希表,提供 O(log N) 的操作。
常用命令:
ZADD key score memberZRANGE key start stopZREVRANK key member用例:
来源:docs/database/redis/redis-data-structures-01.md:331-397
除了基本数据类型,Redis 还为特定用例提供了专门的结构
位图不是独立的数据类型,而是字符串上的位操作,其中每个位可以表示状态信息。
常用命令:
SETBIT key offset valueGETBIT key offsetBITCOUNT key [start end]用例:
来源:docs/database/redis/redis-data-structures-02.md:17-66
HyperLogLog 提供概率性基数估算,内存使用量极少(只需 12KB 即可计算数百万项,标准误差为 0.81%)。
常用命令:
PFADD key element [element ...]PFCOUNT key [key ...]用例:
来源:docs/database/redis/redis-data-structures-02.md:69-111
地理空间索引允许存储和查询基于位置的数据。
常用命令:
GEOADD key longitude latitude memberGEODIST key member1 member2 [unit]GEORADIUS key longitude latitude radius unit用例:
来源:docs/database/redis/redis-data-structures-02.md:113-169
Redis 提供不同的持久化选项以确保数据持久性
RDB 在指定的时间间隔创建数据集的快照。
主要特点:
配置:
save <seconds> <changes> - 当更改超过阈值时触发快照stop-writes-on-bgsave-error - 快照失败时停止接受写入rdbcompression - 启用/禁用 RDB 文件的压缩来源:docs/database/redis/redis-questions-02.md:159-171
AOF 将每个写入操作记录到文件中,该文件可以重放以重建数据集。
主要特点:
同步策略:
appendfsync always - 每次命令后同步(最持久,最慢)appendfsync everysec - 每秒同步一次(平衡性好)appendfsync no - 由操作系统决定何时同步(最快,持久性最差)来源:docs/database/redis/redis-questions-02.md:159-176
Redis 4.0 引入了一种混合方法,结合了 RDB 和 AOF。
主要特点:
来源:docs/database/redis/redis-questions-02.md:159-171
Redis 经常被用作缓存层。理解有效的缓存策略至关重要。
应用程序首先检查缓存。如果缓存未命中,则从数据库加载数据并将其存储在缓存中。
实现:
优点:
缺点:
来源:docs/database/redis/redis-questions-01.md:127-131
Redis 提供了多种驱逐策略来处理内存限制
noeviction:达到内存限制时返回错误(默认)allkeys-lru:首先驱逐最近最少使用(LRU)的键allkeys-random:驱逐随机键volatile-lru:首先驱逐设置了过期时间的最近最少使用(LRU)的键volatile-random:驱逐设置了过期时间的随机键volatile-ttl:首先驱逐剩余生存时间(TTL)最短的键allkeys-lfu:驱逐最少使用(LFU)的键(Redis 4.0+)volatile-lfu:驱逐设置了过期时间的、最少使用(LFU)的键(Redis 4.0+)驱逐策略通过 maxmemory-policy 配置参数设置。
来源:docs/database/redis/redis-questions-01.md:803-832
问题:对不存在数据的请求绕过缓存和数据库,导致数据库负载增加。
解决方案:
来源:docs/database/redis/redis-questions-02.md:605-667
问题:热点数据过期,导致数据库请求激增。
解决方案:
来源:docs/database/redis/redis-questions-02.md:670-691
问题:大量缓存条目同时过期,导致数据库过载。
解决方案:
来源:docs/database/redis/redis-questions-02.md:693-732
使用批量操作可显著降低网络开销
MGET、MSET、HMGET 等。来源:docs/database/redis/redis-questions-02.md:196-256
大键可能导致性能问题
redis-cli --bigkeys 或 MEMORY USAGE 命令UNLINK 代替 DEL 进行异步删除来源:docs/database/redis/redis-questions-02.md:281-386
热点键(频繁访问的键)可能成为瓶颈
redis-cli --hotkeys 或监控工具来源:docs/database/redis/redis-questions-02.md:388-493
Redis 的用途远不止简单的缓存
Redis 可用作消息队列或发布/订阅系统
LPUSH/RPOP 实现简单的队列来源:docs/database/redis/redis-questions-01.md:166-262
Redis 可用于实现分布式锁,以协调跨服务的访问
SETNX 进行基本实现来源:docs/database/redis/redis-questions-01.md:162-165
Redis 可有效地实现速率限制
来源:docs/database/redis/redis-questions-01.md:155-156
Redis 通过模块提供搜索功能
来源:docs/database/redis/redis-questions-01.md:264-286
Redis 已从单线程模型演变为混合线程模型
UNLINK 和 FLUSHALL ASYNC 等操作尽管有这些变化,Redis 仍在主线程中顺序处理命令,避免了复杂的锁机制。
来源:docs/database/redis/redis-questions-01.md:553-636
Redis 实现了复杂的内存管理技术
来源:docs/database/redis/redis-questions-01.md:671-858
Redis Sentinel 通过以下方式提供高可用性:
来源:docs/database/redis/redis-questions-02.md:753-756
Redis Cluster 支持水平扩展和分片
来源:docs/database/redis/redis-questions-02.md:764-772
Redis 是一款多功能的内存数据结构存储,在缓存方面表现出色,但通过其丰富的数据结构和功能提供了更多用途。了解其内部机制、数据结构和常见用法模式,可以使开发人员能够有效地利用 Redis 来实现各种超越简单键值存储的应用。
刷新此 Wiki
最后索引时间2025年4月17日(ff77b0)