惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
L
LINUX DO - 最新话题
Recorded Future
Recorded Future
月光博客
月光博客
博客园 - 【当耐特】
博客园 - 叶小钗
宝玉的分享
宝玉的分享
量子位
雷峰网
雷峰网
博客园 - 三生石上(FineUI控件)
The Cloudflare Blog
Vercel News
Vercel News
L
LangChain Blog
B
Blog
Y
Y Combinator Blog
爱范儿
爱范儿
GbyAI
GbyAI
S
Security @ Cisco Blogs
T
The Blog of Author Tim Ferriss
A
About on SuperTechFans
博客园 - Franky
P
Palo Alto Networks Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
云风的 BLOG
云风的 BLOG
C
Cisco Blogs
Scott Helme
Scott Helme
I
Intezer
T
The Exploit Database - CXSecurity.com
MyScale Blog
MyScale Blog
T
Tor Project blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Troy Hunt's Blog
N
News and Events Feed by Topic
大猫的无限游戏
大猫的无限游戏
F
Fortinet All Blogs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
S
Security Affairs
Cyberwarzone
Cyberwarzone
PCI Perspectives
PCI Perspectives
小众软件
小众软件
D
DataBreaches.Net
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Know Your Adversary
Know Your Adversary
Forbes - Security
Forbes - Security
S
Securelist
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
The Last Watchdog
The Last Watchdog

Redis

发现一个支持云同步的 Redis GUI 工具: RedisViewer 阿里云 Redis 命中率计算与监控的问题 - V2EX Redis 运行一段时间后报错导致挂掉,有什么办法解决呢? - V2EX Redis Stream 实现 MQ 的可行性 - V2EX Redis 缓存数据 - V2EX 支持 WinXP/2003 的 Redis 服务端 - V2EX 怎么才能学好 redis,有什么好的教程或者 blog 推荐吗? - V2EX 线上服务 redis 查询超时排查求教 - V2EX 有木有安卓 app 的 client 端呀? - V2EX 除了 Tiny RDM 之外还有什么比较好用的 Redis GUI 工具么? - V2EX Redis 支持 Hash 字段单独设置过期时间 - V2EX Redis 加上密码后,整体性能下降 20%? - V2EX 新学 redis 集群的疑惑 - V2EX Garnet 真比 Redis 快吗? - V2EX Redis 几乎每小时都出现大量超时,求助 - V2EX 问一下大家 redis 的配置 - V2EX Redis 怎样将字节串传递给 lua 脚本? - V2EX 微软 Garnet 的发展前景如何,有没有可能替代 Redis? - V2EX 业内有没有把 redis 开启 aof=always 当做数据库使用的? - V2EX 有谁试过 redis 的 string 自增性能吗, 我这怎么是个位数? - V2EX 突然想起一个问题,你们用的 redis 有崩过吗?是什么原因崩的? - V2EX 关联表查询结果的 Redis 缓存如何设计 API 请求如何方便的做并发测试? - V2EX 请教兄弟们一个问题, datagrip 连接 redis 如何显示 redis 键的 过期时间呢? 关于 Redis RESP3 的想法 - V2EX 轻便式 Redis Monitor 面向研发人员图形可视化监控平台 Redis 中使用 pipeline 执行命令时,有单次执行数量的限制吗? - V2EX [故障模拟]redis cluster 3 机 3 主 6 从,主节点都转移到了其中一台机器上,然后这台机器宕机 你们现在连接 redis 集群是用的什么工具,可以分享一下下载链接吗? - V2EX 求教一下 Redis 哨兵模式下,主从延迟问题 - V2EX 想问下大佬 40M 的字符串适合放到 redis 缓存吗? - V2EX redis 有时取不到值 - V2EX redis 集群中 执行事务 或者 lua 脚本 涉及到多个 key 时,这些 key 要求在同一个节点还是同一个 slot? - V2EX redis 7 所有命令都是原子的吗? - V2EX Redis 是鸡肋吗? - V2EX Redis 服务挂了,一段时间后又恢复,不会造成缓存与数据库不一致吗? - V2EX 为什么 MySQL 有缓存,还要使用 Redis? - V2EX 关于缓存一致性问题,不知道我这个方案是否可行 - V2EX redis 集群获取不到连接 - V2EX 用 redis 直接替换 app/物联网的 mq 服务器的可行性大吗?怎么对客户端进行限制 - V2EX redis 怎么裁剪 zset 只保留排名前 100 的数据 - V2EX 缓存失效后先返回再触发更新的场景要怎么处理? - V2EX 关于 redis 一个小问题(随机性) - V2EX 求教大佬,线上 redis cluster 中适合使用 redis lua script 吗?以及使用时有什么注意事项? - V2EX 怎么使用命令批量删除匹配的 key 值? - V2EX 对 redis 的 zset 做分片的时候怎么选择分片个数 - V2EX 关于消息推送方案的讨论 - V2EX Redis 的 zset 按 score 排序做分页的时候怎么保证数据不丢失? - V2EX redis 的 zset 如果打散成多个 zset 的话,如果要分页查询怎么处理呢? - V2EX 一个 abtest 实验中 redis 设计的思考
关于社区场景下,用户已读文章不再推荐这种需求实现方案的探讨 - V2EX
ben548 · 2023-06-07 · via Redis

需求:
用户签到页面,为用户推荐后台配置好的文章内容,按发布时间倒叙排列(数据存储在 redis 的 zset 中,score 是文章发布时间,value 是文章 id ),并且可以认为被推荐的内容数量有上限限制(不多于 1000 条),用户已阅的数据不再推荐给用户,直到所有的内容被推荐完,再从头开始再推荐一遍,一直循环下去。
实现方案:
一般涉及到这种需求,都会想到用布隆过滤器或者 bitmap 来实现,我最终选择了用布隆过滤器,不用 bitmap 的主要原因是:
1.目前 post_id 的值是雪花算法生成的,长度有 16 位,如果不做处理直接把这个 id 当成 bitmap 的 offset 会造成极大的内存空间浪费,而怎么把这些 post_id 转换成更小的从 1 开始递增的数字,处理起来比较麻烦(不是不可以,自己想到的就有几种,比如说:因为展示的内容都是关联了某些 tag 的内容,用数据库里面的关联关系表的 id 作为 bitmap 的 offset 来处理是可以做到的,之所以不选择 bitmap 最主要还是下面的原因 2 );
2.getbit 不支持批量查询(当然我知道有人可能要说可以用 lua 脚本,用 pipeline 之类的,但是写起来有点麻烦)而选择布隆过滤器就没有上面这两个问题了
这次选用的是直接装 redis 的布隆过滤器模块,实现方案如下:
1.每个用户初始化一个 500 长度的布隆过滤器,用户已阅的内容通过 bf.add 操作加入他的布隆过滤器中
2.获取列表数据的时候,按下面的步骤进行:
2.1 从 zset 中读取 100 条数据,
2.2 通过 bf.mexist 操作查询这些内容是否已阅,已阅的内容跳过
2.3 一直循环 2.1 和 2.2 步骤,直到查到满足条目数的内容为止(目前是定的 12 条一页)
2.4 如果 zset 查到最后都没有得到满足条件的条目数,则返回经过了 2.1 和 2.2 步骤之后获取到的数据(可能有数据,只是不满足 12 条的条件,总数记为 total1 )+zset 中按发布时间顺序倒序获取 12-total1 条数据作为补充 2.5 什么时候删除用户的布隆过滤器? 2.4 步骤中发现 total1 的数量为 0 (说明所有内容都已经阅读过了)时进行删除
内存占用估算:有试过模拟一个 500 长度 size 的布隆过滤器大致的内存占用为 800 多个字节,按 50w 日活来计算的话,总的占用空间为两三百 M 左右,在可接受范围内,但是如果为每个用户初始化 1000 长度 size 的布隆过滤器,内存占用就有点高了,初步预估在 900M 左右
我的疑问:
1.其实用布隆过滤器的方案,有通过 golang 自己依赖 redis 的 bitmap 结构实现一个的方案也有直接用 redis 的布隆过滤器模块(需要编译安装)的方案,我好奇哪种方案更好?
2.上面说到的获取列表数据的逻辑,总感觉是不是有什么地方可以优化,因为按上面描述的逻辑,每一次都要遍历一遍 zset 中的数据,最差的情况下,会有数十次的 redis 查询(比如最后一页)
3.可能有人会说可以用 bf.count 看用户已阅内容的总数,因为总是最新的内容展示出来,那么直接跳过 bf.count 的总数去获取数据即可,就不用那么麻烦,但是这样获取有个问题,就是新加入 zset 的内容(而且发布时间还是最新的),按这个方案来处理,几乎无法得到展示(只有等内容耗尽,到下一轮推荐才能展示)
4.这个列表是展示在用户签到的下方内容推荐的模块中,我在想每个用户的布隆过滤器初始长度设置为多少比较合适,一开始想着直接设置 1000 的长度,但是想到真实的场景,用户可能签完到就离开了,不会去消费内容(虽然不会主动下拉消费,但是底部会外漏出 2 到 4 条内容出来,也被认为是用户已阅的内容),所以直接初始化 1000 长度我感觉有点浪费,所以考虑先初始化 500 个,消费内容超过 500 个的话,Redis 的布隆过滤器会自动扩容,扩容成自己的 2 倍内存空间(试过,这种扩容最终占的内存空间会比一开始就初始化 1000 长度的内存空间占用大很多),不知道这么设计是否合适?以上就是我个人的一些实现方案的想法和探索,大家有什么观点和看法,欢迎评论留言一起探讨一下