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

用Redis来搞定用户信息读取,流程其实可以更简单点儿

这个想法其实是从网上看来的,觉得特别有道理,很多人一说到用户信息,比如名字、头像、积分这些,第一反应就是去数据库里查,比如MySQL,每次点开一个App或者网页,都要连一次数据库,数据库就要忙着找数据,然后再传回来,用户少的时候没事,一旦人多了,数据库就累得够呛,速度自然就慢下来了,用户就得等着转圈圈。

这时候,Redis就能派上大用场了,你可以把Redis想象成放在数据库前面的一個“超级快取区”,或者叫“临时记事本”,它的最大特点就是快,非常快,因为它把数据都存在内存里,不像数据库大多存在硬盘上,从内存里拿东西,可比从硬盘里翻要快成百上千倍。

那具体怎么用这个“临时记事本”来让流程变简单呢?流程大概是这样的:

用Redis来搞定用户信息读取,流程其实可以更简单点儿

当一个用户第一次登录或者第一次查看自己信息的时候,系统还是会老老实实地去数据库里把这位用户的完整信息查出来,比如用户ID、昵称、头像地址、会员等级、积分余额等等,关键的一步来了,在把这些信息返回给用户的同时,系统会顺手把这些数据写一份到Redis里存起来,存的时候,会设置一个“保质期”,比如半个小时,这就好比你去超市买了一大瓶可乐,回家后先倒一杯喝,同时把剩下的放进冰箱,告诉自己这几个小时内想喝就从冰箱拿,不用再跑一趟超市了。

在接下来的半个小时里,无论这个用户是刷新页面,还是跳到其他页面需要显示用户信息,系统都不再去麻烦数据库了,它直接扭头就问Redis:“嘿,用户123的信息有吗?” Redis瞬间就能把数据找出来递过去,这个过程非常快,用户几乎感觉不到延迟,体验就非常流畅,这就避免了数据库被反复查询同样数据的压力。

用Redis来搞定用户信息读取,流程其实可以更简单点儿

万一用户在这半小时内修改了自己的昵称或者头像怎么办呢?这就是设置“保质期”的聪明之处了,当用户的信息有更新时,比如成功修改了昵称,系统在把新昵称存入数据库之后,会立刻做两件事中的一件:要么直接删掉Redis里存的这个用户的旧数据,要么就用新数据把Redis里的旧数据覆盖掉,这样,下次再要读取信息时,因为Redis里要么没数据了,要么数据是旧的(已过保质期),系统就会重新去数据库取最新的数据,然后再次刷新Redis里的缓存,这就保证了用户看到的信息最终是一致的,不会出现改了名却还显示旧名字的情况,这个做法,有个挺形象的说法,叫做“淘汰缓存”。

还有一种情况,如果Redis因为某种原因重启了,或者缓存数据被全部清空了,那这个“超级快取区”就空了,没关系,这时候系统会发现从Redis里读不到数据,它就会自动地、无缝地再次回到数据库去取数据,取回来之后又会重新填满Redis,整个流程对用户来说是完全没有感觉的,系统自己就处理好了。

你看,引入了Redis之后,整个用户信息读取的流程就变得简单又智能了,大部分时候,轻松快速地访问Redis就搞定了,只有在必要的时候(比如第一次读取、数据过期、或者数据有更新后)才去动一下数据库,数据库的压力一下子就小了很多,它就能更专注地去处理那些更复杂的、需要写入和更新数据的操作了,这样分工合作,整个系统的响应速度就上来了,用户体验自然就好了。

简单总结一下,这个思路的核心就是:用Redis这个高速缓存扛住大量的、简单的读请求,保护后方相对“娇贵”的数据库,用空间(内存空间)换时间(响应时间),让流程变得更高效、更简单,这比一窝蜂全都去挤兑数据库要聪明得多。