Redis 数据类型与命令

最后更新: 2024-01-02 17:43:06 +0800 +0800
原文以英文撰写。您正在阅读AI翻译版本。

Redis 将每个键与一种数据类型关联。对类型错误的键执行命令会失败, 因此键命名和值的归属关系应明确表达数据模型。

Redis 在服务器线程上以原子方式执行每条命令。因此,INCR、HSET、 SADD 和 ZADD 等单条命令可安全地用于单键状态变更;但如果多步骤的 读取—修改—写入序列必须作为一个整体执行,则需要使用 MULTI/EXEC、 WATCH 或 Lua。

键的生命周期 #

DEL 会同步回收值,在处理大型聚合数据时可能造成阻塞。UNLINK 会 解除键的关联,并让 Redis 异步回收内存。使用 EXPIRE、PEXPIRE、 TTL 和 PTTL 设置及检查过期时间;对于没有过期时间的键,TTL 返回 -1,对于不存在的键则返回 -2。

不要对生产规模的键空间使用 KEYS *,因为它会在一条命令中扫描整个 键空间。应改用 SCAN 进行迭代:

redis
SCAN 0 MATCH user:* COUNT 1000

持续迭代,直到返回的游标为 0。扫描可能返回重复项,也可能遗漏迭代期间 创建或删除的键;需要唯一结果的调用方必须自行去重。

核心类型 #

  • 字符串支持 GET、SET、原子操作 INCRBY 和二进制安全的值。
  • 列表是有序、可从左右两端索引的集合,用于队列和工作流。 LPUSH 和 RPUSH 分别向头部或尾部添加元素;LPOP 和 RPOP 在空列表上返回 nil,并在最后一个元素消失时删除该键。 BLPOP 和 BRPOP 会阻塞,直到列出的某个键变为非空。 LRANGE 的两端均为闭区间,并接受从尾部开始计算的负索引; 不受限的范围可能返回很大的载荷。RPOPLPUSH 和 BRPOPLPUSH 以原子方式将一个尾部元素移动到另一个列表。
  • 集合包含唯一成员,并通过哈希表测试成员资格。使用 SADD、SREM、SCARD、SISMEMBER、SMEMBERS、SPOP 和 SRANDMEMBER。SINTER、SUNION 和 SDIFF 等集合运算命令 读取输入但不修改输入;相应的 *STORE 变体会以原子方式替换目标集合。
  • 有序集合将每个唯一成员与一个浮点分值关联。ZADD 以原子方式 添加或更新成员,因此重复成员会替换先前的分值,而不会创建重复项。 使用 ZRANGE、ZREVRANGE、ZRANK、ZREVRANK 和按分值范围 查询的命令进行有序查找,并使用 ZREM 或 ZREMRANGEBYRANK/ZREMRANGEBYSCORE 删除元素。
  • 哈希将字段/值对归组到一个键下。HSET 以原子方式创建或更新字段; HGET、HMGET、HDEL、HINCRBY 和 HGETALL 操作的是具名字段, 而非嵌套对象。HGETALL 的结果可能很大,因此只需要少数字段时应优先 进行定向读取。
  • 流在有序 ID 下追加字段/值条目。XADD 写入条目,XRANGE 读取 ID 范围,XREAD 等待游标之后的条目。消费者组使用 XREADGROUP 分发条目;消费者必须使用 XACK 确认已完成的工作,并明确回收被遗弃的 待处理条目。流是持久化数据结构,而非临时的发布/订阅投递机制。

HGETALL、SMEMBERS 和不受限的 LRANGE 会返回所有元素,并可能 产生很大的响应。在请求路径中,应使用基于游标的哈希/集合扫描或有界范围。

MULTI 将命令加入队列,EXEC 在不被其他客户端插入命令的情况下执行 这些命令,但 Redis 事务不提供 SQL 风格的回滚。同一 EXEC 中某条 已排队命令发生运行时错误,不会撤销其他成功执行的命令。WATCH 提供 乐观冲突检测。Lua 脚本和 Redis Functions 相对于其他命令以原子方式 执行,因此必须限制其执行规模,因为长时间执行会阻塞服务器进程。

概率计数 #

HyperLogLog 值使用 PFADD 接收观测项,并使用 PFCOUNT 估算基数。 Redis 文档给出的标准误差低于 1%,稠密表示最多占用 12 KiB,即以精确性 和成员枚举能力换取有界内存。PFMERGE 合并兼容的观测结果。需要精确 成员列表时使用集合;只有近似计数满足产品约定时才使用 HyperLogLog。

参考资料 #

评论

在 GitHub 上阅读或评论(发表评论需要登录)