我正在为我的应用程序设置 Redis,它将为数百家公司提供服务。我正在考虑这样的关键结构:
companyname1:xxx:yyy:zzz
companyname1:yyy
companyname1:qqq:zz:xxx:ppp
companyname1:tttt:zz:qqq
companyName1:iiii:rrrr
companyName1:ppp:ddd:xxx
[... thousands more]
每家公司都会遵循类似的模式。我需要能够删除任何位置包含“xxx”的所有键,但仅限于 companyname1。
如何组织,让Redis不必搜索整个数据库?有没有办法对每个公司的密钥进行分组,然后仅在该特定组上进行操作?
我最初做了这样的事情,但我不知道它是否有工作的权利,最重要的是,它是否有效率。我正在使用 StackExchange。
var keysToDelete = new List<RedisKey>();
var cursor = 0L;
var pageSize = 100;
// pattern = "companyName1::xxx:";
do
{
var redisResult = await _database.ExecuteAsync("SCAN", cursor.ToString(), "MATCH", pattern, "COUNT", pageSize).ConfigureAwait(false);
var result = (RedisResult[])redisResult;
cursor = Convert.ToInt64((string)result[0]);
keysToDelete.AddRange((RedisKey[])result[1]);
}
while (cursor != 0);
我将不胜感激任何指导。
删除单个公司的钥匙,要删除的图案可以在钥匙中的任何位置
首先:
SCAN
API 是在 SE.Redis 的 IServer
接口上实现的,参见 https://stackexchange.github.io/StackExchange.Redis/KeysScan。
但是,不存在使用 Redis“字符串”键来执行此操作的有效方法;如果使用您建议的方法,您将必须遍历整个键空间。 如果您要搜索“左”子字符串,则使用 redis“哈希”类型的解决方案可能是合适的,但对于“键中的任何位置”:则不太合适。
如果您不使用“集群”,则可能有助于将每个客户端分区到单独的数据库中(请参阅 Redis 术语中的
SELECT
;这是 SE.Redis 中
GetDatabase()
的参数)。您仍然需要遍历密钥空间,但仅限于单个客户端 - 不是所有客户端。