对redis的keys方法替换

最近公司需要做redis服务的迁移,一些旧项目用的还是以前的jedisAPI。发现有个项目用的keys方法模糊查询,而这在生产环境是绝对禁止的。keys命令的时间复杂度是O(N),可想而知,当面对大量数据时,每个查询会占用更长时间,无法释放链接,从而导致系统的异常。

redis官方的警告:

Warning: consider KEYS as a command that should only be used in production environments with extreme care. It may ruin performance when it is executed against large databases. This command is intended for debugging and special operations, such as changing your keyspace layout. Don’t use KEYS in your regular application code. If you’re looking for a way to find keys in a subset of your keyspace, consider using SCAN or sets.
https://redis.io/commands/keys

官方的建议是使用SCAN(粗浅的理解为keys的分页)或者集合

公司的cacheAPI并没有提供SCAN方法,可能同样是考虑到模糊查询带来的性能问题,那我只能另想办法了。

我当时想到两种办法:

  1. 将需要模糊查询的key分类存储在一个集合中1,量大时拆分成多个集合。缺点是会生成多个key的集合,占用内存。读写时还需要维护key的集合。
  2. 把数据按照key归类存储在集合中,每条数据需要多加一个属性记录其原本的key。缺点是变更了原本的数据模型,产生冗余数据,不过比起上一种不需要维护key的集合。

由于考虑到数据量并不多(可以确定),而且还要兼容旧数据,我用了第一种方法。第二种办法可用于数据量大或操作频繁的功能,冗余数据交给代码来处理。


  1. 最大容量是2的32次方减1,4294967295个元素 ↩

对redis的keys方法替换相关推荐

  1. redis怎么连接mysql数据库_Golang连接Redis数据库的方法

    Golang连接Redis数据库 golang连接数据库,这里博主推荐使用go-redis这个库,理由很简单(连接数据库的操作类似在数据库里面输入命令) go-redis的安装方式 go get -v ...

  2. redis mysql 原子计数器_使用redis的increment()方法实现计数器功能案例

    一直知道redis可以用来实现计数器功能,但是之前没有实际使用过,昨天碰到一个需求:用户扫码当天达到20次即提示:当日扫码次数达到上限! 当时就想到使用redis的递增方法increment()来实现 ...

  3. Redis的KEYS命令引起宕机事件

    摘要: 使用 Redis 的开发者必看,吸取教训啊! 原文:Redis 的 KEYS 命令引起 RDS 数据库雪崩,RDS 发生两次宕机,造成几百万的资金损失 作者:陈浩翔 Fundebug经授权转载 ...

  4. scala条件替换_scala - 有没有办法用scala中的高阶方法替换嵌套的For循环 - SO中文参考 - www.soinside.com...

    有没有办法用scala中的高阶方法替换嵌套的For循环 问题描述 投票:0回答:1 我有一个mutableList,并希望获取所有行的总和,并根据某些条件将其行替换为其他值.下面的代码对我来说工作正常 ...

  5. Spring-方法注入lookup、方法替换MethodReplacer接口

    问题 lookup方法注入 概述 实例 方法一 通过在配置文件中配置的方式实现 方法二 通过实现接口代码的方式实现 小结 方法替换MethodReplacer接口 概述 实例 小结 总结 问题 无状态 ...

  6. Redis Cluster搭建方法简介22211111

    Redis Cluster搭建方法简介 (2013-05-29 17:08:57) 转载▼ Redis Cluster即Redis的分布式版本,将是Redis继支持Lua脚本之后的又一重磅功能,官方声 ...

  7. Object.keys方法拿到对象的key值

    项目中的高级搜索选项用到了Object.keys方法, 那么它是用来干嘛的呢:删除某个子对象里的数据 var anObj = { aaa: 'kejin',bbb: 'shenxian',ccc: ' ...

  8. es6 遍历数组对象获取所有的id_ES6对象遍历Object.keys()方法

    [Object.keys()] ES5 引入了Object.keys()方法,返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名var obj = { foo ...

  9. k8s安装sqlite3_kubernetes环境部署单节点redis数据库的方法

    kubernetes部署redis数据库(单节点) redis简介 Redis 是我们常用的非关系型数据库,在项目开发.测试.部署到生成环境时,经常需要部署一套 Redis 来对数据进行缓存.这里介绍 ...

最新文章

  1. excel 解析 java_java解析Excel(xls、xlsx两种格式)
  2. 浅谈网络爬虫中广度优先算法和代码实现
  3. Django REST framework 1
  4. ffmpeg+nginx+video实现rtsp流转hls流,通过H5查看监控视频
  5. boost::regex模块部分正则表达式相关的测试程序
  6. [改善Java代码]不要覆写静态方法
  7. qt中使窗口的大小随窗口的内容大小进行调整
  8. 7-153 找鞍点 (20 分)
  9. Quartz-scheduler 定时器概述、核心 API 与 快速入门
  10. APP 测试用例(大部分 APP 通用)
  11. ibus 五笔输入法 极点五笔6.1词库hack
  12. 安装错误 Package requirements (json-c) were not met: No package ‘json-c‘ found
  13. 展望:2021年程序员业界趋势与生存指南
  14. ADP(自适应动态规划)-HDP
  15. windows10系统还原
  16. 华南理工大学“三七互娱杯”程序设计竞赛 A (dp)
  17. 杭州建筑工程师职称评审专业分类
  18. iPhone5C三大看点:性能不输iPhone5 或售3399元
  19. 淘宝直播技术干货:高清、低延时的实时视频直播技术解密
  20. PBX与IPPBX孰好

热门文章

  1. 爬虫百战(四)——爬取yy短视频
  2. Deer计划(2)cloudcompare解析--八叉树
  3. 小学计算机兴趣班培训总结,小学开展电脑制作活动工作总结
  4. IOS 实现以图查图 类似百度查图功能
  5. 什么是BGP线路?BGP线路机房好吗?
  6. NLP前提假设之在一个系统里面最为灵活的人,最能掌控大局的人
  7. 三:使用MATLAB对有理假分式进行分式展开,并求取留数,极点和直接项。
  8. SSH跨平台终端工具tabby推荐
  9. 企业级监控服务器构建
  10. harmonyos系统适配机型,华为鸿蒙os适配手机一览,HarmonyOS系统适配机型有哪些