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

用 redis 进行重复值校验,有啥好的数据结构

  •  
  •   leebs · 2022-03-08 10:33:57 +08:00 · 3797 次点击
    这是一个创建于 983 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对提交的数据校验是否重复,db 在不加索引的情况下,大数据量查询很慢。

    将数据都缓存到 redis 中,如果直接用 set 、hash 这种结构,基于 member/field 校验重复值,需要缓存原数据,浪费空间,而且 redis key 、set member 有上限。

    有没有其他的,类似布隆过滤器这种基于 hash 运算,节省空间的方法。(布隆不支持删除,不考虑)

    bitmap 需要做数据-offset 映射,而且 bitmap 没有压缩,如果 offset 映射出来是 2^32-1 ,直接就干满 512MB 了。

    15 条回复    2022-03-09 11:23:22 +08:00
    MoYi123
        1
    MoYi123  
       2022-03-08 10:38:39 +08:00
    roaringbitmap
    leebs
        2
    leebs  
    OP
       2022-03-08 10:51:12 +08:00
    @MoYi123 字符串转换成数字有什么好的编码方案嘛。
    edward1987
        3
    edward1987  
       2022-03-08 11:01:28 +08:00
    原数据是字符串的话,有长度和编码吗? 如果都不固定,那就只能存原数据了吧。hash 会有碰撞的可能,不满足你的业务需求
    blu10ph
        4
    blu10ph  
       2022-03-08 11:14:22 +08:00
    HyperLog
    Maboroshii
        5
    Maboroshii  
       2022-03-08 11:16:46 +08:00 via Android
    md5 哈希,存数据库加索引
    corningsun
        6
    corningsun  
       2022-03-08 11:36:59 +08:00
    @Maboroshii

    +1 ,数据库单独建表,摘要字段设置唯一索引,直接插入,报错就说明有值了,删除也快。
    labulaka521
        7
    labulaka521  
       2022-03-08 11:59:14 +08:00
    为什么不加个哈希索引呢?前几天看个帖子百亿数据百毫秒查出
    leebs
        8
    leebs  
    OP
       2022-03-08 13:39:58 +08:00
    @labulaka521 mongodb 文档型结构,字段名不是固定的。
    ffxrqyzby
        9
    ffxrqyzby  
       2022-03-08 13:45:29 +08:00
    https://github.com/aviggiano/redis-roaring
    redis 可以用这个, 亲测压缩效果不错
    另外看你们业务场景, 大数据离线可以用一些好用的 olad, 基本天生支持 HLL, bitmap, 毫秒级去重
    ffxrqyzby
        10
    ffxrqyzby  
       2022-03-08 13:45:53 +08:00
    olad -> olap
    MoYi123
        11
    MoYi123  
       2022-03-08 14:15:51 +08:00
    @leebs 看你能接受 bitmap 才提得, 根据鸽笼原则, string 转 int 肯定是没有准确的方案的.
    lbp0200
        12
    lbp0200  
       2022-03-08 14:51:34 +08:00
    复合主键
    HBASE
    tendis
    swcat
        13
    swcat  
       2022-03-09 08:55:16 +08:00
    我是这样做的, (crc32 + hash 取 n 个字符) + 字符串全校验
    leebs
        14
    leebs  
    OP
       2022-03-09 09:11:07 +08:00
    @swcat 数据存在哪边呢
    swcat
        15
    swcat  
       2022-03-09 11:23:22 +08:00
    @leebs 存 mysql 可以啊, 存 redis 也可以啊, 存文件都行啊, crc32 + hash 只是初步过滤 key 存在不存在, 能挡住大部分非重复值, 前面的相同了后面再全字符串校验, 只是为了防止冲突
    胆子大, 路子野, 再用一种 hash 算法来代替字符串全校验也不是不行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3627 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 10:30 · PVG 18:30 · LAX 02:30 · JFK 05:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.