针对多公司应用优化Redis密钥管理

问题描述 投票:0回答:1

我正在为我的应用程序设置 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);

我将不胜感激任何指导。

删除单个公司的钥匙,要删除的图案可以在钥匙中的任何位置

c# redis
1个回答
0
投票

首先:

SCAN
API 是在 SE.Redis 的
IServer
接口上实现的,参见 https://stackexchange.github.io/StackExchange.Redis/KeysScan

但是,不存在使用 Redis“字符串”键来执行此操作的有效方法;如果使用您建议的方法,您将必须遍历整个键空间。 如果您要搜索“左”子字符串,则使用 redis“哈希”类型的解决方案可能是合适的,但对于“键中的任何位置”:则不太合适。

如果您不使用“集群”,则可能有助于将每个客户端分区到单独的数据库中(请参阅 Redis 术语中的

SELECT

;这是 SE.Redis 中

GetDatabase()
的参数)。您仍然需要遍历密钥空间,但仅限于单个客户端 - 不是所有客户端。
    

© www.soinside.com 2019 - 2024. All rights reserved.