Redis 将每个键与一种数据类型关联。对类型错误的键执行命令会失败, 因此键命名和值的归属关系应明确表达数据模型。
Redis 在服务器线程上以原子方式执行每条命令。因此,INCR、HSET、
SADD 和 ZADD 等单条命令可安全地用于单键状态变更;但如果多步骤的
读取—修改—写入序列必须作为一个整体执行,则需要使用 MULTI/EXEC、
WATCH 或 Lua。
键的生命周期 #
DEL 会同步回收值,在处理大型聚合数据时可能造成阻塞。UNLINK 会
解除键的关联,并让 Redis 异步回收内存。使用 EXPIRE、PEXPIRE、
TTL 和 PTTL 设置及检查过期时间;对于没有过期时间的键,TTL
返回 -1,对于不存在的键则返回 -2。
不要对生产规模的键空间使用 KEYS *,因为它会在一条命令中扫描整个
键空间。应改用 SCAN 进行迭代:
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 上阅读或评论(发表评论需要登录)