首页 > 技术文章 > Redis的使用场景

shadoll 2021-03-04 18:01 原文

一.前言 

  Redis一般用于辅助现有系统,用来优化现有数据库处理起来会效率较低的任务。本文中,会列举一些常见的业务场景,用Redis来进行优化处理。

二.场景

1.显示最新的数据列表

  比如说博客,总是按照最新发布的时间顺序进行排序,最新10条的sql如下,但这种方式的查询,会随着数据增加而越来越慢。

select top 10 * from table order by time desc

  获取最新数据列表的查询方式很常见,虽然数据创建的顺序肯定按时间来的,但要想查询却不得不做排序操作,查询相当于过滤一下所有数据,再取10条。

  类似这种场景可以使用Redis来处理。简单来说,就是用Redis来做缓存,把最新的数据,比如5000条数据存到Redis中,那只有在查询超过这个范围的数据才会访问数据库,在这范围里就读Redis,提高查询效率。

  每次有人发布新的博客,在把博客存到数据库后,再把这个博客的内容存到Redis中,怎么存到hash就省略了。取出这个博客的id,添加到Redis中的list,固定从左边push,来保证索引为0的数据是最新的数据。

lpush list id

  然后对list进行裁剪,确保Redis只保存最新的5000条数据。(ps.最新5000条数据的id,查博客详情根据id去找之前存的hash,Redis性能高,就算遍历5000个id去找也可以接受)

ltrim list 0 4999

  所以每次获取最新博客,或者说是在分页列表中范围属于最新这5000条里的,都可以直接查询Redis,只有超出才需要查询数据库。

 

2.排行榜

  比如一些线上游戏的排行榜,我们一般会根据分数来获取信息。如,得分前100名的玩家;某玩家的得分排名。

  这游戏可能有上百万玩家,每分钟可能有上百万的新的得分记录,而排行榜是需要实时更新的,这类查询对于SQL数据库来说,性能会相当不理想。

  但对Redis来说,就根本不是问题,性能就是好。

  跟得分相关的,我们可以用Redis中的SortedSet类型数据,每次新添得分记录,在Redis添加对应玩家id和得分的数据。

zadd key score userid

  得到前100名和对应玩家的排名就很简单了。

//得分从高到低 前100名
zrevrange key 0 99

//得分从高到低,该玩家的排名
zrevrank key userid

 

3.新闻热搜

  有点类似于排行榜,也是要实时更新的,这个用SQL数据库实现的话,性能不太理想,Redis可以很好解决。

  上热搜主要是看两点,一是时效性,二是用户查看或评论的量。按照给定的算法,就能算出上热搜排行的新闻。

  实现思路是,首先先根据时间找最新的新闻,比如查最新的1000条新闻,使用lpush+ltrim命令,参考场景1。

  然后再持续给最新的1000条新闻算分数。最后,当需要刷新热搜榜时,重新zadd添加列表,再算排行就好,参照场景2。

 

4.计数

  比如博客文章的访问量,每次有人访问,访问次数就加一,当访问量过大,sql写入的操作就会过于频繁,影响性能。我们可以使用Redis的计数器去处理。

  这个是String类型的数据,incr命令可以给这个key值自动+1。如果对应key不存在,它会创建并赋值1。如果它的value不为数字,会报错。

incr key

 

 三.总结

  1.篇幅有限,只列举了几个场景,具体如何使用Redis,还得看具体业务。

  2.这里的Redis使用主要是辅助SQL数据库,Redis是用内存作主存储的,性能比较好,能够有效优化SQL数据库查询过慢的问题。

  3.Redis有多种数据类型,以及提供多种命令操作,给数据操作和查询提供便利。

 

 

  

推荐阅读