创建时间: May 24, 2022 6:49 PM 标签: Redis, 对象存储
这是我参与「第三届青训营 -后端场」笔记创作活动的的第7篇笔记。
由于对 Redis 比较高级的指令不太熟悉,我产生了一下针对应用场景展开的思考。
Feed 视频流接口实现
上传流程
- 用户上传视频,由存储器接口的实现对象进行具体的上传操作(存储器设计以后整理)
- 视频上传操作完成后,将可以访问的资源链接存入数据库(主键 VideoID、VideoUrl、CoverUrl)
- 同时异步写入 Redis 缓存(缓存当前操作时间戳、主键)
视频流
-
接收时间戳
-
到缓存库中查找,匹配 VideoID 然后到 Mysql 中查询数据。
- 如何确保缓存有效?异步任务同步数据(以 Mysql 数据为准)。
这个时候需求看起来还比较”和蔼可亲“,很简单嘛。
到我快要展开实践的时候,开始犯难了。存在一个比较大的问题:当获得一个时间戳的时候,如何匹配到 ZSet 中的数据项?
- 暴力法(开销不可接受,一是内存开销,二是时间开销,肯定 PASS
- 二分查找
我能想到的看起来只有用二分查找了(在我不太了解 Redis 支持的分页查找情况下我是这么琢磨的。
- 用 ZCard 找到 ZSet 整个的长度
- 考虑查找方向,如果按照时间轴升序排列的话,哪怕二分的过程中有新的视频投稿也可以继续执行二分。
- 普通二分的过程肯定是需要查找 Mid 对应的 Score 值的,但找了很久,大部分 API 都对 ZSet 范围取值,想想如果用二分查找过程中会发送多次查询请求就感觉性能很低(多次 IO)。
最终 >> 查阅 Redis 官方文档寻找解决方案
zrangebyscore 命令 -- Redis中国用户组(CRUG)
Go-Redis 官方找不太到 zrangebyscore 更为详细的介绍,考虑用官方的 IntSliceCmd 自己封装一个返回 uint64 的方法。
💡 TODO 实际使用 go-Redis zrangebyscore 会返回 []string 使用不够优雅,尝试寻找让 redis 直接返回 []int64 的写法。