栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

.NET Core 实现 Redis 批量查询指定格式的Key

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

.NET Core 实现 Redis 批量查询指定格式的Key

一. 问题场景

Redis 作为当前最流行的内存型 NoSQL 数据库,被许多公司所使用,作为分布式缓存。我们在实际使用中一般都会为 key 带上指定的前缀或者其他定义的格式。当由于我们程序出现bug,造成 redis 里面的存储的值,与我们预期的不一致时,我们可以通过查询指定格式的 key,来定位到我们具体的出现问题的key,从而方便我们解决问题。

二. 解决办法1.Keys 命令

Keys 命令用于查找所有符合给定模式 pattern 的 key 。要求 Redis 版本大于 1.0.0。keys在查询大数量key时,会长时间阻塞Redis,由于Redis是单线程的,这就是一个突出的问题,需要注意。

2.Scan 命令

Scan 命令相对于 Keys 命令来说,优点就是不会阻塞服务器。要求 Redis 版本大于 2.8。

三. 代码实现

这里采用的Redis驱动是 StackExchange.Redis。

在 StackExchange.Redis 里封装 Redis 命令时分为了两种,一种是针对于集群的命令,一种是针对于单个Redis服务器的命令,Keys 和 Scan 命令便是后者,我们在使用的时候必须在单独的服务器上执行。

Keys 和 Scan 命令都支持模糊查询,这里介绍三种匹配符:

  1. * 表示可以匹配多个任意字符

  2. ? 表示可以匹配单个任意字符

  3. [] 表示可以匹配指定范围内的字符

因为我们的key可能分布在集群内多个Redis服务器上,所以我们需要在每台服务器上都执行命令。我们可以通过 ConnectionMultiplexer.GetEndPoints() 方法来获取所有的终结点信息。

在 StackExchange.Redis 对于 keys 和 scan 命令统一封装为了 IServer.Keys()方法,它会自动根据Redis服务器版本来决定使用keys命令还是scan命令。

为了方便测试,我在 Redis 里面准备了四个以 test 为前缀的key,放在序号为1的db里面:

1.遍历所有前缀为 test 的key 代码如下:

static async Task Main(string[] args){    //创建连接
    var conn = await ConnectionMultiplexer.ConnectAsync("192.168.10.110");    //获取db
    var db = conn.GetDatabase(1);    //遍历集群内服务器
    foreach (var endPoint in conn.GetEndPoints())
    {        //获取指定服务器
        var server = conn.GetServer(endPoint);        //在指定服务器上使用 keys 或者 scan 命令来遍历key
        foreach (var key in server.Keys(1,"test.*"))
        {            //获取key对于的值
            var val = db.StringGet(key);
            Console.WriteLine($"key: {key}, value: {val}");
        }
    }
}

执行结果:

2.[]的用法

假设我要遍历 key为 test.1-test.3 的数据,可以这样写:

static async Task Main(string[] args){    //创建连接
    var conn = await ConnectionMultiplexer.ConnectAsync("192.168.10.110");    //获取db
    var db = conn.GetDatabase(1);    //遍历集群内服务器
    foreach (var endPoint in conn.GetEndPoints())
    {        //获取指定服务器
        var server = conn.GetServer(endPoint);        //在指定服务器上使用 keys 或者 scan 命令来遍历key
        foreach (var key in server.Keys(1,"test.[1-3]"))
        {            //获取key对于的值
            var val = db.StringGet(key);
            Console.WriteLine($"key: {key}, value: {val}");
        }
    }
}

执行结果:

假设我要遍历 key为 test.1和test.4 的数据,可以这样写:

static async Task Main(string[] args){    //创建连接
    var conn = await ConnectionMultiplexer.ConnectAsync("192.168.10.110");    //获取db
    var db = conn.GetDatabase(1);    //遍历集群内服务器
    foreach (var endPoint in conn.GetEndPoints())
    {        //获取指定服务器
        var server = conn.GetServer(endPoint);        //在指定服务器上使用 keys 或者 scan 命令来遍历key
        foreach (var key in server.Keys(1,"test.[1,4]"))
        {            //获取key对于的值
            var val = db.StringGet(key);
            Console.WriteLine($"key: {key}, value: {val}");
        }
    }
}

执行结果:

好了,关于 Redis 查询指定格式的 key 的方法就介绍到这里了。

四. 参考资料

Where are KEYS, SCAN, FLUSHDB etc? by StackExchange.Redis

原文出处:https://www.cnblogs.com/stulzq/p/9559786.html

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/231363.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号