设为首页 收藏本站
查看: 683|回复: 0

[经验分享] redis的list 功能实践

[复制链接]

尚未签到

发表于 2016-12-19 10:05:56 | 显示全部楼层 |阅读模式
redis特点是单线程复用IO,支持list,set,sorted set,hash等众多数据结构,线程安全。
最近是用list做了一个商品交易记录的承载。需要显示给用户最近一个月的交易记录,且每个商品显示不超过750条。
原有实现:MySql+memcached。由于交易记录的即时性,缓存不宜太久,所以很容易把memcache击穿,mysql查询压力山大,对于交易记录太大的商品甚至出现超时错误。所以,需要改进。
分析一下这个场景,需要保存最近一个月的交易记录,而且只是提供最多750条的显示,因此对每个商品来说,这个记录数量是一定的。从数据存取角度来看,这是一个需要不断添加数据,查询方式基本固定的场景。由于可以保持列表长度在控制范围,因此考虑应用redis的list作为存储的主力。
这里的主要问题,一是如何存、二是如何取、三是原有数据的订正。
存。所用接口:Lpush+Ltrim。redis List是个双向列表,提供左侧和右侧的数据顺序插入功能,这里由于要把最近的记录放到列表头,采用左侧插入(Lpush接口),同时为了控制列表长度,判断长度超过一个阈值时进行截断操作Ltrim,这里有个技巧就是截断后的长度最好低于阈值一个区间,可以防止频繁的trim操作。
取。所用接口:LRange。这里有点麻烦,因为是需要查询一个时间点之前的记录,那么需要把List对象取出来进行核对,好在整个List长度是有设置上限的且是按照时间先后顺序存入的,那么可以采用二分查找的方式,这样比遍历性能要好很多。其次,还要在此基础上实现一个分页的查询。这里需要注意LRange(key,start,end)的start和end都是包括在取出列表的,跟java的list有些不同。
数据订正。这是所有数据迁移项目的必然痛点,问题关键在于如何把发生在新老存储切换时间所产生的新纪录写到新的redis存储上,其实万全的方式是吧这些新纪录写到另外一个地方,当存储切换完毕后再从这个地方回写。虽然描述的很简单,但这其中的数据一致性校验等种种问题足够你喝几壶的。考虑种种,最后还是采取了简单粗暴的方式,凌晨时执行老数据全量覆盖,期间产生的新数据丢弃,因为考虑到交易记录更多的时候是作为流水账来出现,有时是要根据数据的重要性评估投入产出比的。
整个实现之后,较原有实现性能提升了一大截,但是有几个问题在里面:1)由于rdb并非关系型数据不能实现像sql一样的条件查找,导致需要按照条件查找并做分页时,需要把整个列表都取出来再判断,造成不必要的内存损耗。但由于列表持有时间不长,暂不会造成FullGC困扰 。2)这样实现只能记一个流水账,因为内存有限。如果要查一个月前的记录目前还要查询订单。解决这个问题倒是有个好东东--Hbase,可以一直往里丢而且查询极快,奈何那是高富帅系统用的装备,维护成本很高,小网站用不起啊。。
后记:redis确实是个好东东,适合的场景可以大胆尝试一下

   

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-316288-1-1.html 上篇帖子: Redis skip list结构分析 下篇帖子: Redis-1 数据类型
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表