我们目前正在使用 shell 中的这个命令来清除我们的 Redis DB:
redis-cli -h zapi.data.com flushdb
但是,现在我被告知必须删除除“zrtt_industry”之外的所有键。我如何才能创建一个正则表达式,删除除与我的模式匹配的键之外的所有键,该模式是“zrtt_industry”。
非常感谢!
我们目前正在使用 shell 中的这个命令来清除我们的 Redis DB:
redis-cli -h zapi.data.com flushdb
但是,现在我被告知必须删除除“zrtt_industry”之外的所有键。我如何才能创建一个正则表达式,删除除与我的模式匹配的键之外的所有键,该模式是“zrtt_industry”。
非常感谢!
在我们的 Spring Boot 应用中,我们希望使用 Redis 发布订阅功能将消息发布到正常情况下大约有 500 个监听者的频道。但在某些罕见的时间/日子里,监听者的数量可能会多达 10,000。
该系统特点如下:
我对以下问题有以下疑问:
KEYS 命令返回一些结果:
> keys Types/*/*BackgroundJob.json
1) "Types/Xyz.Data/Xyz.Data.BackgroundJobEngine.BackgroundJob.json"
2) "Types/Xyz.Web.SystemAdmin/Xyz.Web.SystemAdmin.Models.Encryption.EncryptionMethodByBackgroundJob.json"
3) "Types/BackgroundJobs/SharpTop.Engine.BackgroundJobs.AutofillBackgroundJob.json"
4) "Types/Quartz.Server/BJE.UDT.BackgroundJob.json"
5) "Types/DFControllersTest.Compensation/DFControllersTest.Compensation.SubmitCompensationPublishBackgroundJob.json"
6) "Types/SpecFlowTest.Architecture.Base/SpecFlowTest.Architecture.Base.Model.IntStudioConfigBackgroundJob.json"
7) "Types/SpecFlowTest.Benefits.UI/SpecFlowTest.Benefits.UI.Base.Services.BackgroundJobsService+BackgroundJob.json"
8) "Types/Xyz.WFM.ExpressionService.Client/Xyz.WFM.ExpressionService.Client.BackgroundJob.ExpressionManagerBackgroundJob.json"
9) "Types/DFControllersTest.Compensation/DFControllersTest.Compensation.SubmitGenerateBudgetWorksheetBackgroundJob.json"
10) "Types/DFControllersTest.Compensation/DFControllersTest.Compensation.SubmitCompensationUnPublishBackgroundJob.json"
11) "Types/IntegrationStudio/IntegrationStudio.DAL.Entities.IntStudioConfigBackgroundJob.json"
12) "Types/IntegrationStudio/IntegrationStudio.DAL.Entities.BackgroundJob.json"
但使用相同模式的 SCAN 没有返回任何内容:
> scan 0 match Types/*/*BackgroundJob.json
1) "1966080"
2) (empty list or set)
我尝试跟踪返回的游标值几次迭代,但如果不编写脚本来检查它,它似乎只会得到无休止的一系列空结果。
到底是怎么回事?
我最终决定对其进行编码:
private async IAsyncEnumerable<string> QueryRedisAsync(string pattern, [EnumeratorCancellation] CancellationToken ct = default)
{
var db = connection.GetDatabase();
var cursor = "0";
int count = 0;
do
{
++count;
ct.ThrowIfCancellationRequested();
var tmp = await db.ExecuteAsync("SCAN", cursor, "MATCH", pattern, "COUNT", "1000");
var scanResult = (RedisResult[])tmp;
cursor = scanResult[0].ToString();
var keys = (RedisKey[])scanResult[1];
foreach (var key in keys)
{
yield return key.ToString();
}
}
while (cursor != "0");
Console.WriteLine(count);
}
代码执行了 1058 (!) 次迭代,其中在某次迭代中恰好发现了一个匹配项,即:
因此,我SCAN
为了“友好”起见,就这么做,但这导致了 1058 次服务器往返。
我做错什么了吗?
我不认为这是redis scan returns empty results but nonzero cursor的重复。为了获得少量结果而对服务器进行 1K+ 次往返似乎不合理。
Redis是一个单线程数据库(用于主要操作)。当操作在服务器端一一处理时,创建多个连接(连接池)有什么好处呢?我们可以简单地创建一个连接并在所有线程之间共享它。
我想以原子方式设置列表的所有值SET
,就像常规命令一样。
我需要它,因为该列表是数据库查询的缓存表示。我想通过使用“分页”模式访问缓存LRANGE
。
我想过使用RPUSH,但如果发生竞争条件,我的缓存将包含多组相继的重复结果,我不喜欢这样。
与已知列表长度的LTRIMRPUSH
结合使用在大多数情况下应该有效,但在数据源返回不同结果集并且我们在 上存在竞争条件的情况下,它可能会失败。当然,这种情况发生的可能性要小得多,但仍然存在。LTRIM
以索引作为权重的方法SORTED SET
也面临着类似的问题。
使用 redis 的事务似乎有点大材小用:就我而言,它们会停止所有其他传入命令,直到事务结束 - 并且缓存的结果集可能是一大块。
然而,DEL
到目前为止,RPUSH
交易似乎是唯一的选择。是不是真的?
是否可以在redis中存储相同(相等)的键数据?我有 2 个不同的数据具有相同(相等)的键,我可以将其存储在 Redis 中吗?