KEYS, SCAN, FLUSHDB 方法在哪?

经常有人问这些问题:

好像并没有看到 Keys(...) 或者 Scan(...)方法?那我要怎么查询数据库里面存有哪些key?

或者

好像没有Flush(...)方法?那我要怎么清除数据库里面的所有key?

问题的关键就在这里:数据库。因为StackExchange.Redis旨在cluster等场景,知道哪些命令的目标是database(逻辑数据库可以分布在多个节点上)和哪些命令的目标是server是很重要的。下面的命令的目标全部指向一个单独server:

  • KEYS / SCAN
  • FLUSHDB / FLUSHALL
  • RANDOMKEY
  • CLIENT
  • CLUSTER
  • CONFIG / INFO / TIME
  • SLAVEOF
  • SAVE / BGSAVE / LASTSAVE
  • SCRIPT (not to be confused with EVAL / EVALSHA)
  • SHUTDOWN
  • SLOWLOG
  • PUBSUB (not to be confused with PUBLISH / SUBSCRIBE / etc)
  • some DEBUG operations

(我可能会漏掉不止一个。。。)他们当中大部分都可以很明显的看出来,除了前面三个:

  • KEYS / SCAN 只会列出当前server上的keys:而不是整个逻辑数据库
  • FLUSHDB / FLUSHALL 同样只会移除当前server上的所有的keys
  • RANDOMKEY 同样只会选出当前服务器上的一个key

事实上,StackExchange.Redis在 IDatabase API 实现RANDOMKEY的方式是随机选择一个目标服务器,对于其他的命令是不能这样做的。

那我要怎么使用这些命令呢?

很简单:从server上使用这些命令,而不是database。

// get the target server
var server = conn.GetServer(someServer); // show all keys in database 0 that include "foo" in their name
foreach(var key in server.Keys(pattern: "*foo*")) {
Console.WriteLine(key);
} // completely wipe ALL keys from database 0
server.FlushDatabase();

要注意不像IDatabase API(在调用 GetDatabase()就已经选好了target database),这些方法对database都有一个可选的参数,或者默认为0

Keys(...)方法需要特别注意的是:它的与众不同之处在于它没有对应的*Async方法。原因是在scene下,系统会判断出最适合采用的方法(KEYS vs SCAN,基于服务器版本),而且如果可以的话将会使用SCAN在内部处理分页的方式返回一个IEnumerable<RedisKey>-所以并不需要知道当前操作的实现细节。如果SCAN不可用,将会采用KEYS,这将会造成服务器阻塞,无论哪一种方式,SCAN and KEYS需要遍历整个key控件,所以在production server要避免使用这个方法-至少,在从服务器上使用。

那我就需要记住我连接是哪一台服务器?that sucks。。。

不,并不需要。你可以使用conn.GetEndPoints()列出节点(或者是所有已知的,或者在config当中指出来的-两者不一定是相同的),然后使用GetServer()迭代查处需要的server(例如:选择一个slave)

StackExchange.Redis 官方文档(四) KeysScan的更多相关文章

  1. StackExchange.Redis 官方文档

    原文:StackExchange.Redis 官方文档 时隔多年的翻译终于完成了第六个,也是很重要的的官方文档,是介绍有关链接管理,管道流水线和多路复用的 官方地址在这里:官方文档 下面做个汇总: S ...

  2. StackExchange.Redis 官方文档(六) PipelinesMultiplexers

    原文:StackExchange.Redis 官方文档(六) PipelinesMultiplexers 流水线和复用 糟糕的时间浪费.现代的计算机以惊人的速度产生大量的数据,而且高速网络通道(通常在 ...

  3. StackExchange.Redis 官方文档(五) Keys, Values and Channels

    原文:StackExchange.Redis 官方文档(五) Keys, Values and Channels Keys, Values and Channels 在使用redis的过程中,要注意到 ...

  4. StackExchange.Redis 官方文档(一) Basics

    基本使用方法: StackExchange.Redis的核心是 StackExchange.Redis 命名空间的 ConnectionMultiplexer 类;它隐藏了多服务器的实现细节.Conn ...

  5. StackExchange.Redis 官方文档(三) Events

    事件 ConnectionMultiplexer类型提供了很多可以用来了解表面状态下正在发生着什么的事件.这对日志是很有用的. ConfigurationChanged - ConnectionMul ...

  6. StackExchange.Redis 官方文档(二) Configuration

    配置 有多种方式可以配置redis,StackExchange.Redis提供了一个丰富的配置模型,在执行Connect (or ConnectAsync) 时被调用: var conn = Conn ...

  7. Redis官方文档》持久化

    原文链接 译者:Alexandar Mahone 这篇文章从技术层面描述了Redis持久化,建议所有读者阅读.如果希望更多了解Redis持久化和持久性保障,建议阅读Redis持久化揭秘. Redis ...

  8. Redis官方文档资源

    官方文档: 如果要深入研究时,官方提供的文档是最权威的. 英文: https://redis.io/documentation 中文: http://www.redis.cn/documentatio ...

  9. 《Redis官方文档》用Redis构建分布式锁

    用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简 ...

随机推荐

  1. Linux学习 -- 用户和用户组管理

    1 用户配置文件 1.1 用户信息文件 /etc/passwd 查看帮助 man 5 passwd -- account:password:UID:GID:GECOS:directory:shell ...

  2. ListView使用的时候遇到的一些问题

    昨天在做项目时,请求服务器的好友动态后,将好友动态和评论显示到界面上,用ListView显示,发现一进这个界面时,listView的适配器的getVIew()方法就会执行6次,后来发现原来是ListV ...

  3. Codeforces Round #349 (Div. 2) C. Reberland Linguistics (DP)

    C. Reberland Linguistics time limit per test 1 second memory limit per test 256 megabytes input stan ...

  4. JavaScript基础教程

    功能介绍: (1)数据验证 弹出提示的对话框,产生判断的效果. (2)气泡提示窗口 右下角等等一类的窗口 (3)产生新窗口 (4)无边框窗口背景变灰,也是可以节约系统资源的

  5. Ng-model undefined in the controller

    这个问题是我最近在项目中碰到的,暂时没找到原因,找到一个解决方法,还多请大神指教,在Stack Overflow找到解决方法: I am having some "problems" ...

  6. PPTP-VPN日志功能,记录用户登录时间,流量统计,IP地址等信息

    我们先看两个文件 /etc/ppp/ip-up /etc/ppp/ip-down 这两个文件为shell脚本,当PPTP用户连接或者断开时分别执行这两个文件,并且会带相应的参数 这些参数有 $PEER ...

  7. 一段代码详解JavaScript面向对象

    (function(){ //私有静态成员 var user = ""; //私有静态方法 function privateStaticMethod(){ } Box = func ...

  8. HQL中左连接,右连接,内连接

    左连接:left join 如A left join B 即取出A表的所有数据,由on条件关联的B表数据,有则显示,没有则为空: 右连接:right join 如 A right join B 即取出 ...

  9. ms08_067利用过程

    进入msf. show exploits. use exploit/windows/smb/ms08_067_netapi. show playloads. set PLAYLOAD windows/ ...

  10. SMB/CIFS协议解析

    1.SMB协议与CIFS协议的区别     139端口是一种TCP端口,该端口在通过网上邻居访问局域网中的共享文件或共享打印机时就能发挥作用.445端口也是一种TCP端口,该端口在 Windows 2 ...