V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iblessyou
V2EX  ›  Redis

老哥们, redis 存 6030 条进去 4520,会有哪些可能

  •  
  •   iblessyou · 2020-07-31 18:26:14 +08:00 · 7284 次点击
    这是一个创建于 1575 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1.本地 windows 起了个 相同的代码,相同数据,就能全存进去,部署的服务器上 就怎么都对不上数。 2.此 redis 还有其他项目在用,但代码层面,可以排除影响。 3.每次都是 4520 4.配置里没设最大值限制 5.以前没出现过类似情况,这套代码部署过好多个服务器 6.KEY 绝对没有重复,这个反复验证过了 7.没看到哪报错了 …… w(゚Д゚)w~~~~~ w(゚Д゚)w~~~ w(゚Д゚)w

    34 条回复    2020-08-05 12:41:12 +08:00
    tomczhen
        1
    tomczhen  
       2020-07-31 18:29:52 +08:00 via Android   ❤️ 1
    最近有疫情,又有水患,水电戾气太重,火电受病毒影响,最好换成核电,这样 CPU 的电子更纯净,自然电到 bug 消。
    (狗头保命
    skiworld
        2
    skiworld  
       2020-07-31 18:32:04 +08:00
    太阳黑子活动也会造成主板 CPU 功能异常
    msg7086
        3
    msg7086  
       2020-07-31 18:32:50 +08:00
    插完取一下数看看对不对呗。
    Umenezumi
        4
    Umenezumi  
       2020-07-31 18:49:32 +08:00
    每次插入的时候取一下试试呗
    Cielsky
        5
    Cielsky  
       2020-07-31 18:50:38 +08:00 via Android
    @tomczhen 建国后不许成精
    rimutuyuan
        6
    rimutuyuan  
       2020-07-31 18:52:55 +08:00
    一般这时候都是人出问题了

    看看你取的 key 是不是就 4520 条
    Leigg
        7
    Leigg  
       2020-07-31 19:07:10 +08:00 via Android
    抽插的时候注意观察
    Vegetable
        8
    Vegetable  
       2020-07-31 19:07:58 +08:00
    @Leigg 拷走
    damean
        9
    damean  
       2020-07-31 19:12:59 +08:00
    每存一条,打印一条日志记录下,看是从哪一条开始出问题了
    Foxkeh
        10
    Foxkeh  
       2020-07-31 19:32:29 +08:00
    1.确定这 6030 条 KEY 真的没重复
    2.确定你真的插入了 6030 条
    3.每次都是 4520 是不是最终出来的结果都是同样的 4520 条?
    -如果是,插入后检查,那些条目的 K,V 有什么特征,比如长度,类型, 排查覆盖记录的嫌疑
    -如果不是,KEY 数量,内存或硬盘占用是不是到了预设上限?
    lshero
        11
    lshero  
       2020-07-31 19:34:31 +08:00
    Redis 压力不大的话 运维没有禁用的话 monitor 命令用起来
    Jooooooooo
        12
    Jooooooooo  
       2020-07-31 19:40:04 +08:00
    信息太少了

    不过我会这么排查

    存 6031 条最后能拿到多少条?

    存 10 条呢?

    存 100 条呢?

    到底啥时候会开始丢数据

    丢的内容有啥规律吗?
    iblessyou
        13
    iblessyou  
    OP
       2020-07-31 20:04:13 +08:00
    @Jooooooooo 新部署了个 redis 都还是那样。。。
    下周用你这方法试下, 代码里少取点存着试试 ,
    那边正式环境 换一次代码不容易,所以一直尽量没用代码改动来测。数据就更不敢乱动了


    @rimutuyuan
    @Foxkeh
    1,非常确定 key 无重复
    2,插入的确是 6030 (不管是从代码的日志),还是我本地用相同的代码和数据测试
    3,很可能不是同样的
    4,内存方面,redis 没设上限,硬盘应该不至于,还运行其他的呢,不至于差这几条数据。
    当然其他还有那的设置,我就不知道了,来就是让大家看看,会有什么可能
    iblessyou
        14
    iblessyou  
    OP
       2020-07-31 20:05:05 +08:00
    @lshero 好像没装 redis-cli 用不了?
    iblessyou
        15
    iblessyou  
    OP
       2020-07-31 20:06:06 +08:00
    @Umenezumi 这办法不错 接下来试试
    lshero
        16
    lshero  
       2020-07-31 20:19:02 +08:00
    @iblessyou 可以用 TELNET
    EminemW
        17
    EminemW  
       2020-07-31 20:40:13 +08:00
    默认内存超过 50 会清 diao
    ETiV
        18
    ETiV  
       2020-07-31 20:43:36 +08:00 via iPhone
    二分查找…
    wakzz
        19
    wakzz  
       2020-07-31 22:57:46 +08:00
    aof 日志,先分析一波,看看存的 6030 条都在里面,是否有其他请求删除了部分数据。
    wuwukai007
        20
    wuwukai007  
       2020-07-31 23:05:25 +08:00 via Android
    根据我多年的经验,找自己原因,千万别怀疑编译器
    Repository
        21
    Repository  
       2020-07-31 23:40:05 +08:00 via Android
    哈哈哈,想起我大学老师的一句话,代码运行结果不对先思考自己的问题,肯定不是编译器错了
    moonsn
        22
    moonsn  
       2020-07-31 23:42:47 +08:00 via Android
    分析一下没插进去的数据的特性?
    cz5424
        23
    cz5424  
       2020-08-01 09:29:30 +08:00 via iPhone
    给 redis 大佬们发邮件,说你们程序有问题(手动狗头
    useben
        24
    useben  
       2020-08-01 16:11:58 +08:00
    可能有什么定时任务在搞鬼?
    jifengg
        25
    jifengg  
       2020-08-03 11:32:26 +08:00
    刚想说有没有可能是 redis 回收机制给回收了,但是你说每次都是 4520,那就不是了。先找找软件之外的原因吧。
    iblessyou
        26
    iblessyou  
    OP
       2020-08-03 14:48:37 +08:00
    @msg7086
    @Umenezumi
    刚又试了,每次插的时候取一下,都能取出来,但执行完后 总数就是不对 w(゚Д゚)w
    iblessyou
        27
    iblessyou  
    OP
       2020-08-03 14:49:40 +08:00
    @Repository 我没怀疑编译器,现在就是在找到底是哪的问题
    Umenezumi
        28
    Umenezumi  
       2020-08-03 14:51:26 +08:00
    @iblessyou 每插一次取两次即可。一次取本次插入的结果,一次取总条数。这样看更直观
    IMCA1024
        29
    IMCA1024  
       2020-08-03 15:55:30 +08:00
    系统抖动
    iblessyou
        30
    iblessyou  
    OP
       2020-08-03 15:59:15 +08:00
    @rimutuyuan
    @damean
    @Foxkeh
    @Jooooooooo
    @lshero
    @Repository
    @useben
    @jifengg

    排查出来了……
    尝试了存一条取一条,看日志是每个都可以取到的
    然后查询的表刚好是个视图,就加了 limit 控制视图的数据量。
    然后诡异的事情发生了……

    表数据 100 条时,存入了 100 条
    表数据 500 条时,存入了 500 条
    表数据 1000 条时,存入了 768 条
    表数据 600 条时,存入了 600 条
    表数据 800 条时,存入了 800 条
    表数据 1000 条时,存入了 1000 条
    ……

    之后会反复出现类似问题,两次查询插入数量不一样,但是不管一样不一样后,哪怕清了 redis,再执行都会和之前是一样的数量。

    猜猜最后是怎么找出的……













    是这句查询 SQL 的坑
    int rows =500;
    ....
    String sql = "select * from Table t limit " + rows + " offset " + (i - 1) * rows;
    ....
    这里他用了分页查询,每次查 1000 条把数据保存完了再查 500,
    但是因为没使用排序,多次查询时,可能会每次的顺序不一样,导致上 500 条和下 500 查询出的可能会出现重复
    加了个排序解决了
    iblessyou
        31
    iblessyou  
    OP
       2020-08-03 16:01:42 +08:00
    @Umenezumi 看楼上 解决了
    这个错误有点低级,自己写的时候,一般都会习惯性加上排序,看别人代码反而反应不过来
    吸取教训了
    Jooooooooo
        32
    Jooooooooo  
       2020-08-03 16:17:56 +08:00
    @iblessyou hhhh

    果然诡异问题最后都是傻子原因, 我自己也经历过好多次
    msg7086
        33
    msg7086  
       2020-08-03 18:14:51 +08:00
    @iblessyou 分页不加排序可还行。
    而且插数据的话应该用流式取数据而不是分页吧,要不然每次取下一页的时候还要重查……
    jifengg
        34
    jifengg  
       2020-08-05 12:41:12 +08:00
    果然还是被忽略的地方出了问题啊。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   944 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:35 · PVG 06:35 · LAX 14:35 · JFK 17:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.