当前位置: 首页 > news >正文

Redis原理:keys命令

语法:

keys pattern

返回所有符合pattern的key

支持 glob-style patterns:

  • h?llo matches hello, hallo and hxllo
  • h*llo matches hllo and heeeello
  • h[ae]llo matches hello and hallo, but not hillo
  • h[^e]llo matches hallo, hbllo, ... but not hello
  • h[a-b]llo matches hallo and hbllo

源码分析

void keysCommand(client *c)
{
    dictIterator *di;
    dictEntry *de;
    // 获取当前的匹配模式
    sds pattern = c->argv[1]->ptr;
    int plen = sdslen(pattern), allkeys;
    unsigned long numkeys = 0;
    void *replylen = addReplyDeferredLen(c);
    // 获取数据字典的迭代器
    di = dictGetSafeIterator(c->db->dict);
    // 判断是否获取全部
    allkeys = (pattern[0] == '*' && plen == 1);
    // 遍历迭代器
    while ((de = dictNext(di)) != NULL)
    {
        // 获取当前遍历的key
        sds key = dictGetKey(de);
        robj *keyobj;
        // 如果是获取全部key 或是 当前的key符合匹配模式
        if (allkeys || stringmatchlen(pattern, plen, key, sdslen(key), 0))
        {
            // 当前当前的key转换成robj对象
            keyobj = createStringObject(key, sdslen(key));
            // 如果key没有过期,则加入响应缓存
            if (!keyIsExpired(c->db, keyobj))
            {
                addReplyBulk(c, keyobj);
                numkeys++;
            }
            decrRefCount(keyobj);
        }
    }
    // 遍历结束,释放对象
    dictReleaseIterator(di);
    setDeferredArrayLen(c, replylen, numkeys);
}

上面的源码中可以看到:

  1. keys 需要遍历全部key
  2. 遍历的所有的key都要和pattern 进行比较

所以在生产环境中,要很谨慎使用keys 命令,避免遍历过多的key而阻塞。

http://www.dtcms.com/a/118170.html

相关文章:

  • 微信小程序开发前端培训课程
  • 006 ElementUI
  • Redis7——进阶篇(八)
  • Unity Internal-ScreenSpaceShadows 分析
  • Spring Boot中使用RedisTemplate操作Redis的几种数据类型详解
  • 【C++ SIMD】第4篇:条件分支与掩码操作(Windows/VS2022版)——以AVX为例
  • 利用 Java 爬虫获取淘宝商品 SKU 详细信息
  • PyTorch使用(5)-张量索引操作
  • uniapp小程序生成海报/图片并保存分享
  • 集合学习内容总结
  • Chrome 135 版本新特性
  • YUESAI应急4G网络广播成功应用于绍兴市钱塘江观潮预警提示项目
  • 【9】搭建k8s集群系列(二进制部署)之安装work-node节点组件(kube-proxy)和网络组件calico
  • QT ARM开发板调试
  • 《从零搭建Vue3项目实战》(AI辅助搭建Vue3+ElemntPlus后台管理项目)零基础入门系列第二篇:项目创建和初始化
  • Linux时间函数3-strftime时间格式转换、asctime时间固定格式、asctime_r线程安全、strftime/asctime/ctime区别
  • 组合与括号生成(回溯)
  • 开源模型应用落地-Qwen2.5-Omni-7B模型-Gradio-部署 “光速” 指南(二)
  • 2012年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析
  • React-04React组件状态(state),构造器初始化state以及数据读取,添加点击事件并更改state状态值
  • 深度学习篇---Prophet时间序列预测工具
  • 使用stm32cubeide stm32f407 lan8720a freertos lwip 实现udp client网络数据转串口数据过程详解
  • Scala相关知识学习总结5
  • 简述Unity对多线程的支持限制和注意事项
  • 【橘子大模型】使用streamlit来构建自己的聊天机器人(下)
  • echarts生成3D立体地图react组件
  • T-SQL语言的压力测试
  • Redis 面经
  • 基础算法篇(4)(蓝桥杯常考点)—数据结构(进阶)
  • (三)深入了解AVFoundation-播放:AVPlayer 进阶 播放状态 进度监听全解析