redis 的 KEYS 命令不能乱用啊... - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fundebug
V2EX    Redis

redis 的 KEYS 命令不能乱用啊...

  •  
  •   fundebug 2018-09-21 16:41:52 +08:00 15952 次点击
    这是一个创建于 2579 天前的主题,其中的信息可能已经有所发展或是发生改变。
    41 条回复    2018-09-22 13:04:22 +08:00
    aspromiss
        1
    aspromiss  
       2018-09-21 16:55:02 +08:00
    上周刚用过一次 keys 键前缀* 查询,惨痛教训
    thechosenone
        2
    thechosenone  
       2018-09-21 16:59:42 +08:00
    长知识
    echoZero
        3
    echoZero  
       2018-09-21 17:04:43 +08:00
    我们之前一个同事 keys 一把 然后线上 redis 直接来了一波 Redis 超时
    linxl
        4
    linxl  
       2018-09-21 17:13:19 +08:00
    keys 不能用, 那应该用什么?
    mht
        5
    mht  
       2018-09-21 17:14:07 +08:00
    @linxl 刚刚看完这个文章 说是换 scan
    wps353
        6
    wps353  
       2018-09-21 17:14:08 +08:00
    缓存雪崩
    jiantalk
        7
    jiantalk  
       2018-09-21 17:15:57 +08:00
    Redis 是单线程要阻塞,我司的同学比较喜欢用这个,还好我们量不算大
    mrgeneral
        8
    mrgeneral  
       2018-09-21 17:16:15 +08:00
    正常啊 这个线上和容易超时,因为 redis 是单进程的。

    封装一个 scan 命令就好了,正常命令行下的 scan 命令不太好用,得多次迭代才能找到 key
    linxl
        9
    linxl  
       2018-09-21 17:16:23 +08:00
    @mht 哈,看到了
    sampeng
        10
    sampeng  
       2018-09-21 17:18:47 +08:00
    keys 是肯定不能用的。。scan 才行。。。封装即可。。。。
    misaka19000
        11
    misaka19000  
       2018-09-21 17:21:35 +08:00
    我们有同事用 medis 连到生产的库,这玩意一连上去就会自动执行 keys *来获取所有的 key,然后生产环境的 Redis 就主备切换了,还是挺危险的
    CMGS
        12
    CMGS  
       2018-09-21 17:22:07 +08:00
    keys 是全局锁……用 scan 可破
    ghl
        13
    ghl  
       2018-09-21 17:30:21 +08:00
    @misaka19000 #11 medis 用的是 scan 吧,刚本地 monitor 确认了下确实没用 keys
    misaka19000
        14
    misaka19000  
       2018-09-21 17:32:09 +08:00
    @ghl #13 是的 刚刚问了下他用的不是 medis,是另外一个工具
    Ryoma
        15
    Ryoma  
       2018-09-21 17:36:09 +08:00
    直接把 keys 禁用就好了
    aa6563679
        16
    aa6563679  
       2018-09-21 17:41:54 +08:00 via iPhone
    一直在用 keys....不过我这数据都存 hash 了 key 并不多
    orangeade
        17
    orangeade  
       2018-09-21 17:46:32 +08:00
    遇到过这个事故
    Rosanta
        18
    Rosanta  
       2018-09-21 17:49:41 +08:00
    这命令直接禁用就行了,或者 rename 走
    yaodong0126
        19
    yaodong0126  
       2018-09-21 17:50:06 +08:00
    这个命令,我在自己封的 client 中,直接屏蔽掉了...
    derrickT
        20
    derrickT  
       2018-09-21 17:51:13 +08:00
    keys 是遍历所有的 key,key 多的时候当然会非常慢
    tachikomachann
        21
    tachikomachann  
       2018-09-21 17:52:26 +08:00 via Android
    我们线上一直是禁用这个的
    Linxing
        22
    Linxing  
       2018-09-21 18:12:27 +08:00
    所以 Keys 设计出来的意义是??
    yueyoum
        23
    yueyoum  
       2018-09-21 18:29:50 +08:00   1
    所以现在工程师这么好做吗?

    这是大概 4,5 年前 学习 redis 的时候, 准备用在产品中的 基础啊
    dengtongcai
        24
    dengtongcai  
       2018-09-21 18:31:20 +08:00 via Android
    会阻塞的!
    pricelessLucky
        25
    pricelessLucky  
       2018-09-21 18:56:23 +08:00
    长知识了
    kslr
        26
    kslr  
       2018-09-21 20:09:32 +08:00
    这一定是没看文档
    xuanbg
        27
    xuanbg  
       2018-09-21 20:47:54 +08:00
    key 的数量只有千把个是没问题的,数量上万了就很危险了。hash 也一样,存对象似乎很方便,但如果一次要操作多个属性,还是序列化后存 string 更好。redis 虽然速度快,但读写次数多了也就不快了。连续读写 rides 十几次,可能还没读写一次 mysql 数据库快。
    moonsn
        28
    moonsn  
       2018-09-21 21:10:09 +08:00 via iPhone
    学到了,下周回去改代码
    fundebug
        29
    fundebug  
    OP
       2018-09-21 22:03:09 +08:00
    @moonsn1994 应该今天晚上改
    unixbeta
        30
    unixbeta  
       2018-09-21 22:49:20 +08:00 via iPhone
    擦,现在这个时代还有技术跟不上业务的,真是可耻。
    fanyingmao
        31
    fanyingmao  
       2018-09-21 23:19:10 +08:00 via Android
    @xuanbg 用 string 的话感觉只读写少量属性,却操作了全部的数据,redis 读写数据量和次数哪个对性能消耗更大?要有数据量和次数消耗的比值才好权衡。
    hcymk2
        32
    hcymk2  
       2018-09-21 23:57:09 +08:00
    yuatom
        33
    yuatom  
       2018-09-21 23:59:21 +08:00 via iPhone
    生产环境不能用 keys,算是规范了吧。
    Immortal
        34
    Immortal  
       2018-09-22 00:00:23 +08:00
    一直以为这个是常识
    和数据库 like 类似
    sampeng
        35
    sampeng  
       2018-09-22 00:40:27 +08:00 via iPhone
    @fanyingmao 记住 redis 是线程动物,所有性能和问题都是出于忘记这个事实。

    读大数据量必然引起其他客户端操作延迟增大(大的 string),操作大的内部对象必然引起其他客户端操作延迟,甚至有严重的瓶颈(把大的 hash/list 全取出来)
    sampeng
        36
    sampeng  
       2018-09-22 00:42:42 +08:00 via iPhone
    @fanyingmao 数据量单机不做特别操作,云主机有自己的限制,不是无上限。500 左右?具体得问云主机。自建的就看交换机能力了,千兆上下浮动。这个跑满,全部都得跪
    kingcc
        37
    kingcc  
       2018-09-22 00:52:02 +08:00
    文章末尾的开发建议总结的非常好,点赞
    cpdyj0
        38
    cpdyj0  
       2018-09-22 08:48:16 +08:00 via Android
    没实际用过 Redis,学生党,但最早接触到这玩意儿的时候就知道不能用 KEYS * 啊…… CPU 会被打满啊
    karllynn
        39
    karllynn  
       2018-09-22 10:59:04 +08:00
    用 scan 就行啊。。redis 应该提供配置直接禁用某些命令,哈
    xuanbg
        40
    xuanbg  
       2018-09-22 12:46:05 +08:00
    @fanyingmao 有可能一次读取或更新超过 5 个属性的话,果断 string。hash 我一般都是用来存配置,就是为了减少 key 数量,另外,客户端连上去,也更容易管理。
    lrh3321
        41
    lrh3321  
       2018-09-22 13:04:22 +08:00 via Android
    涨知识了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     966 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 22:33 PVG 06:33 LAX 15:33 JFK 18:33
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86