redis查询时假死

问题描述

在redis中数据量较少的时候,如果需要根据key模糊查询value值,我们一般都是直接在redis中:keys userToken* 查询,但是当数据量非常大时,就会出现redis假死现象

原因分析

keys算法是遍历算法,复杂度为O(n),而由于redis是单线程程序,顺序执行程序,只有执行完当前命令,其他命令才可以执行。当达到百万级数据的时候,就会长时间等待,导致假死现象

解决思路

使用scan命令,命令格式如下:

scan cursor [MATCH partten] [COUNT count]

eg: scan 0 match userToken* count 10

命令解释: scan 游标 MATCH <返回和给定模式相匹配的元素> count 每次迭代所返回的元素数量
scan 是增量循环,虽然复杂度也是O(n),但每次只返回一小部分数据,所以不会导致redis假死。

注意: 返回的数据可能会有重复,所以需要客户端手动去重

举例:

redis > scan 0 match user_token* count 5 
 1) "6"
 2) 1) "user_token:1000"
 2) "user_token:1001"
 3) "user_token:1010"
 4) "user_token:2300"
 5) "user_token:1389"
redis > scan 6 match user_token* count 5 
 1) "10"
 2) 1) "user_token:3100"
 2) "user_token:1201"
 3) "user_token:1410"
 4) "user_token:5300"
 5) "user_token:3389"

学习参考文章:https://www.javazhiyin.com/62992.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值