在 Redis 中创建一个空的有序集

Create an empty sorted set in Redis

有没有一种简单的方法可以在 Redis 中创建一个空的有序集? The documentation 个州

If key does not exist, a new sorted set with the specified members as sole members is created, like if the sorted set was empty. If the key exists but does not hold a sorted set, an error is returned.

然而,它并没有说你可以创建一个空的有序集。以下不会创建空的排序集:

127.0.0.1:6379> zadd likes:0 1 one
(integer) 1
127.0.0.1:6379> exists likes:0
(integer) 1
127.0.0.1:6379> zcard likes:0
(integer) 1
127.0.0.1:6379> dbsize
(integer) 1
127.0.0.1:6379> zrem likes:0 one
(integer) 1
127.0.0.1:6379> exists likes:0
(integer) 0

用例是将数据从另一个数据库可靠地迁移到 Redis,即 Postgres:

  1. 创建post时,创建一个空的有序集likes:<postId>
  2. 创建赞后,如果exists likes:<postId,则执行zadd likes:<postId> <createdAt> <userId>。否则,查询 Postgres 的喜欢,并将它们存储在 likes:<postId>.

创建一个空的排序集启用断言,当第一个 like 对该 post 进行时,该断言会删除对 Postgres 的过多查询,但仍支持尚未迁移到的 posts Redis呢。此优化将使我们的数据库每天节省 100k+ 次读取。

如果键不存在,它表现为任何类型的空实例。在你的情况下,你可以避免调用 EXISTS likes:<postId> 并假设密钥在那里,因为结果行为是相同的:当你添加一个成员时,如果列表不存在,那么将创建该列表点.