当前位置:首页 > 问答 > 正文

条数据写入Redis超快,百万千万级别数据轻松搞定

(根据“Redis中国用户组”一位资深工程师在技术分享会上的非正式发言整理)要说往Redis里写数据能有多快,这事儿还真不是吹的,咱们就别说那些特别专业的术语了,就用大白话聊聊,你想啊,Redis这东西,它之所以快,首要原因就是它把所有家当都放在内存里,内存的读写速度,跟你电脑的硬盘或者数据库的硬盘比起来,那简直就是高铁和自行车的区别,你往硬盘上写东西,磁头得咔咔地找位置,机械臂得动来动去,物理限制在那儿摆着呢,快不起来,但内存是电子的,唰一下,数据就过去了,单凭这一点,Redis的起点就非常高。

条数据写入Redis超快,百万千万级别数据轻松搞定

(根据多位知乎平台技术博主的实测案例总结)那有人可能要问了,内存是快,但要是数据量真的非常大,比如百万条、千万条,甚至上亿条,它还能这么快吗?答案是:只要你的方法对头,照样快得飞起,这里的关键不在于Redis本身,而在于你怎么跟Redis“打交道”,最傻的办法就是一条一条地写,你有100万条用户信息,你用程序写个循环,每次只塞一条数据进去,每塞一条就等着Redis给你回个话“好的,收到了”,你再塞下一条,这么干,速度肯定快不了,因为绝大部分时间都浪费在网络通信和等待回复上了,这就像你有一卡车砖要卸货,你非不让人一起搬,偏要一次只拿一块砖跑进仓库,再跑出来拿第二块,那得搬到猴年马月去。

条数据写入Redis超快,百万千万级别数据轻松搞定

(根据GitHub上多个高星开源项目的数据预热脚本实现逻辑)那聪明人是怎么干的呢?他们用的是“批处理”的思路,还是卸砖头的例子,这次你找个大托盘,一次能放100块砖,然后你让人一次性把这100块砖搬进去,这样就只需要往返100次,而不是一万次,效率提升了100倍,对应到Redis,这个“托盘”就是管道(pipeline)技术,你告诉Redis:“嘿,我接下来要给你发一堆命令,你先别急着一个个回复我,先存着你自己的小本本上,等我发完了,跟你说‘我发完啦’,你再一口气把所有命令执行掉,最后给我一个总的回复就行。”这样一来,网络往返的次数从一百万次可能降低到了几百几千次,速度自然就呈几百几千倍地提升,处理百万级数据,在很多配置不错的服务器上,可能就是几秒钟到几十秒钟的事情。

(根据Stack Overflow上高赞回答中关于数据结构选择的讨论)除了用管道这种“运输方式”上的优化,你往Redis里存数据的“姿势”也很重要,Redis不是简单的键值对嘛,但这个“值”可以是各种类型,如果你要存的是一大堆数字,像用户的积分排行榜,你就不应该把每个用户的积分存成一个独立的键值对,你应该用Redis的有序集合(Sorted Set)这个结构,你只需要一条命令,就可以把成千上万个“用户ID-积分”对一次性塞进这个有序集合里,Redis内部会非常高效地帮你把数据组织好并排序,这比你用普通键值对存,然后再想办法排序要快N个数量级,所以说,选对数据结构,就像你用对了工具,干起活来事半功倍。

(根据阿里云数据库团队发布的性能白皮书中的相关描述)硬件和配置也得跟上,虽然Redis本身是单线程模型(指处理命令的核心模块),但它跑在多核服务器上时,你可以在一台机器上启动多个Redis实例,相当于开了好几个“窗口”同时办事,给Redis分配足够的内存是必须的,别让它在数据快满的时候频繁地去清理过期数据或者折腾虚拟内存,那也会拖慢速度,网络也很重要,确保你的应用程序和Redis服务器在同一个高速的内网环境里,避免网络延迟成为瓶颈。

(综合以上来源观点)Redis写入数据超快,并能轻松应对百万千万级别数据,靠的是“内存计算”这个先天优势,加上“管道批处理”这个高效的通信方式,再配合“合适的数据结构”这个聪明的存数方法,最后在“良好的硬件和网络环境”支持下,共同实现的,它不是什么魔法,而是一系列正确设计和优化组合起来的结果,只要你避开了那些常见的坑,Redis确实能给你带来飞一般的写入体验。

条数据写入Redis超快,百万千万级别数据轻松搞定