V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Sponsored by
LinkedIn
不坐班的神仙工作 · 去任何你想去的地方远程,赚一线城市的工资
2000 个不用出门 Social 的全球远程工作,帮助 V2EX 的小伙伴开启全新的工作方式。
Promoted by LinkedIn
leebs
V2EX  ›  Redis

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

  •  
  •   leebs · 204 天前 · 2794 次点击
    这是一个创建于 204 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对提交的数据校验是否重复,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  
       204 天前
    roaringbitmap
    leebs
        2
    leebs  
    OP
       204 天前
    @MoYi123 字符串转换成数字有什么好的编码方案嘛。
    edward1987
        3
    edward1987  
       204 天前
    原数据是字符串的话,有长度和编码吗? 如果都不固定,那就只能存原数据了吧。hash 会有碰撞的可能,不满足你的业务需求
    blu10ph
        4
    blu10ph  
       204 天前
    HyperLog
    Maboroshii
        5
    Maboroshii  
       204 天前 via Android
    md5 哈希,存数据库加索引
    corningsun
        6
    corningsun  
       204 天前
    @Maboroshii

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