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

Redis缓存那些事儿,语法要点其实没那么难掌握

主要基于个人对Redis的实践经验总结,并参考了《Redis设计与实现》一书中的部分核心思想,以及Redis官方文档中关于数据类型的说明。)

Redis这个东西,说白了就是一个速度超快的“大字典”,它把数据都存在内存里,所以读写的速度比我们平时用的关系型数据库像MySQL要快上百倍,很多人一听到“缓存”就觉得它很高深,其实它的核心思想特别简单:就是把那些经常要用到、但计算或者查询起来又很慢的结果,暂时放在这个高速的“字典”里,下次再用的时候直接来拿,省去了复杂耗时的过程。

你完全可以把它想象成一个你身边随叫随到的超级助理,你网站的首页内容大部分是不怎么变的,但每次有用户访问,你都去数据库里把所有内容查一遍,数据库压力大,页面打开也慢,这时候你就可以让Redis这个“助理”把首页内容记下来,下次用户再来,直接问助理要,瞬间就拿到了,这就是缓存最根本的用处。

说到Redis的语法,别看它功能强,但常用的命令就那么几个,而且起名都很直白,一点都不难记,它处理的数据类型主要有这么几种,我们一个一个来看,你会发现特别贴近你的直觉。

字符串(String),这是最基础的类型,就是一个键对应一个值,这个值可以是数字,也可以是文字,你想记录网站的在线人数,用命令 SET online_users 100 就存进去了,想增加一个人?用 INCR online_users,它就变成101了,想减少就用 DECR,想查现在多少人?GET online_users 就行了,是不是很像在操作一个变量?

第二种是哈希(Hash),这个特别适合存一个对象的信息,比如一个用户的信息,有姓名、年龄、城市,如果你用字符串存,得存三个键(user:1:name, user:1:age...),很麻烦,用哈希,一个键就搞定了:HSET user:1 name "张三" age 28 city "北京",这就好比一个文件夹,里面放了几个不同的文件,取年龄就用 HGET user:1 age,取所有信息就用 HGETALL user:1,管理起来非常清晰。

第三种是列表(List),它的特点就是有序,而且可以从两头操作,这简直就是为消息队列或者最新列表量身定做的,你想做一个网站的最新10条新闻列表,每次发一条新新闻,就用 LPUSH news_list "新闻标题" 从左边塞进去,然后想展示的时候,用 LRANGE news_list 0 9 就能取出最新的10条,因为它从左边塞,最新的总是在最前面,如果你想让列表像个队列(先进先出),还可以用 RPOP 从右边取,非常灵活。

第四种是集合(Set),它的最大特点就是里面的元素不能重复,而且没有顺序,这个特性用来干吗呢?给文章贴标签,一篇文章的标签肯定是不能重复的,你可以用 SADD article:1:tags "技术" "Redis" "数据库" 来添加标签,判断某个标签是否存在用 SISMEMBER,还有一个妙用是求交集并集,比如找出同时喜欢“科技”和“体育”的用户,用 SINTER 一个命令就能搞定。

第五种是有序集合(Sorted Set),它比集合多了个“分数”的概念,可以根据分数来排序,这简直是排行榜的天然实现,比如做一个游戏分数排行榜,玩家每得一次分,就用 ZADD leaderboard 1500 "玩家A" 来添加或更新分数,要查前十名?ZREVRANGE leaderboard 0 9 就出来了,从高到低排得明明白白。

你看,这些核心的数据类型和命令,是不是并没有想象中那么复杂?它们都是为了解决实际中最常见的场景而设计的,学习Redis,一开始根本不需要去深究它底层是怎么实现的,你先把这些常用的“工具”用熟练了,就能解决大部分的问题。

Redis还有一些重要的概念,比如设置过期时间,这是缓存的一个关键点,你不能让数据永远存在内存里,不然内存会爆掉的,给一个键设置10分钟后自动消失,命令很简单:EXPIRE key_name 600,这样就不用你手动去清理了。

还有持久化,就是怎么把内存里的数据存到硬盘上,防止重启后数据丢失,Redis提供了两种主要方式(RDB和AOF),这个在你真正要用到生产环境时再去详细了解也不迟。

Redis的语法要点真的不难掌握,你先别把它当成一个庞然大物,就把它看作是一个有几种不同口袋(数据类型)的万能工具箱,每个口袋适合装不同的东西,也有不同的拿取方式(命令),你需要的不是一下子背下所有命令,而是当你遇到“排行榜”、“缓存对象”、“去重”、“队列”这些场景时,能立刻想到“哦,Redis的那个有序集合/哈希/集合/列表正好能派上用场”,多动手写几个小例子,你会发现,这个强大的工具很快就能为你所用了。

Redis缓存那些事儿,语法要点其实没那么难掌握