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

2022-03-08 10:33:57 +08:00
 leebs

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

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

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

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

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

+1 ,数据库单独建表,摘要字段设置唯一索引,直接插入,报错就说明有值了,删除也快。
labulaka521
2022-03-08 11:59:14 +08:00
为什么不加个哈希索引呢?前几天看个帖子百亿数据百毫秒查出
leebs
2022-03-08 13:39:58 +08:00
@labulaka521 mongodb 文档型结构,字段名不是固定的。
ffxrqyzby
2022-03-08 13:45:29 +08:00
https://github.com/aviggiano/redis-roaring
redis 可以用这个, 亲测压缩效果不错
另外看你们业务场景, 大数据离线可以用一些好用的 olad, 基本天生支持 HLL, bitmap, 毫秒级去重
ffxrqyzby
2022-03-08 13:45:53 +08:00
olad -> olap
MoYi123
2022-03-08 14:15:51 +08:00
@leebs 看你能接受 bitmap 才提得, 根据鸽笼原则, string 转 int 肯定是没有准确的方案的.
lbp0200
2022-03-08 14:51:34 +08:00
复合主键
HBASE
tendis
swcat
2022-03-09 08:55:16 +08:00
我是这样做的, (crc32 + hash 取 n 个字符) + 字符串全校验
leebs
2022-03-09 09:11:07 +08:00
@swcat 数据存在哪边呢
swcat
2022-03-09 11:23:22 +08:00
@leebs 存 mysql 可以啊, 存 redis 也可以啊, 存文件都行啊, crc32 + hash 只是初步过滤 key 存在不存在, 能挡住大部分非重复值, 前面的相同了后面再全字符串校验, 只是为了防止冲突
胆子大, 路子野, 再用一种 hash 算法来代替字符串全校验也不是不行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/838798

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX