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

Redis缓存用一次就没了,读完马上过期那种瞬间消失的东西

直接引用自知乎问题“如何理解Redis?”下的高赞回答,作者:柳星,部分摘录自微信公众号“阿里技术”发布的文章《Redis为什么这么快?》,以及CSDN博客用户“编程不良人”关于Redis缓存击穿的文章观点)

Redis缓存用一次就没了,读完马上过期那种瞬间消失的东西

“Redis这东西,说白了就是个临时记事儿本,而且是个记性特别差、到点就忘的记事儿本,你想啊,你平时拿个本子记东西,可能放那儿一年半载的还在,但Redis不是,你让它记个东西,比如你跟你对象说‘晚上七点楼下麻辣烫’,你刚把这句话写进Redis这个‘本子’里,转头你就可以给它定个规矩:‘五分钟后就给我忘了’,好,五分钟一到,你再去Redis里找这句话,没了,干干净净,好像从来没写过一样,这就是它最典型的用法,叫‘缓存’,就是为了应付那种‘用一次就扔’的信息。”

Redis缓存用一次就没了,读完马上过期那种瞬间消失的东西

“为啥需要这种‘瞬间消失’的特性呢?举个例子,你上淘宝看一个热门商品,比如最新款的手机,那个商品详情页的信息(价格、库存、描述啥的)又不是每分钟都变,但直接从存所有家底的数据库里查,数据库压力大,反应也慢,这时候就用上Redis了,淘宝的程序会把手机详情‘唰’地一下先存到Redis里,设定一个过期时间,比如一分钟,这一分钟内,不管来一万个人看这个页面,都直接从Redis这个‘记事儿本’里读,快得飞起,一分钟到了,Redis‘啪’一下就把这个信息忘了,下一个再来查看请求,发现‘记事儿本’上没记这事儿,那就只好再去麻烦数据库查一次,查完回来,再重新写到Redis里,同时再设定一个新的一分钟倒计时,这样一来,数据库就不用被每分钟几万次的查询给冲垮了,大部分压力都让Redis这个‘瞬移’的记事儿本给扛了。”

“这种‘读完就过期’的设计,特别适合那种‘热点数据’,就是一瞬间大家都来抢着看,但过一阵子就没人搭理的东西,除了商品详情,还有像新闻网站的头条新闻、微博的热搜榜、微信文章的阅读量点赞数这种,这些数据你不可能让它永远待在Redis里占地方,因为它的价值就在那短暂的一阵爆发期,就像春节抢红包,那几分钟系统压力巨大,Redis就得像超人一样顶上去,高速处理每个抢红包的请求,记录谁抢了多少,等红包抢完,热度过去了,这些临时记录就可以清掉了,给下一波热点腾地方。”

“但这种‘秒忘’的机制有时候也会带来麻烦,正好在Redis里那条信息过期被删除的那个瞬间,同时有成千上万个请求涌进来,发现‘记事儿本’上是空的,于是这帮人‘轰’地一下全冲向后端的数据库去要数据,数据库可能一下子就被这突如其来的流量打趴下了,这种现象有个挺形象的名字,叫‘缓存击穿’,这就好比电影院散场,本来大家是陆陆续续走的,但突然消防铃响了(缓存过期),所有人同时挤向同一个窄门(数据库),可不就堵死了嘛,为了解决这个问题,程序员们想了不少办法,比如让第一个发现缓存过期的人去数据库查,查回来之前,告诉后面来的人‘稍等一下,我正在查’,或者干脆让热点数据永远不过期,通过别的方式去更新它。”

“所以你看,Redis这个‘瞬间消失’的特性,既是它的核心价值所在——用速度换空间,抗住高并发;同时也带来了需要小心处理的挑战,它就像一个超级高效的短期记忆大脑,只负责记住最紧要、最当下的那点事,至于那些需要长期记住的,它可不管,得交给数据库那个‘长期记忆硬盘’,理解了它这个‘记性差’的特点,就知道该在什么时候用它,怎么用它了。” 结束)

Redis缓存用一次就没了,读完马上过期那种瞬间消失的东西