zoukankan      html  css  js  c++  java
  • Redis的使用场景

    一.前言 

      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有多种数据类型,以及提供多种命令操作,给数据操作和查询提供便利。

      

  • 相关阅读:
    从验证谈起
    今天感触
    弱点
    经济平衡一些看法
    关于灵魂
    关于博弈论中的一硬币正反问题的分析<二>
    java8新特性:对map集合排序
    junit单元测试不通过报documentationPluginsBootstrapper相关异常
    Maven打包报错:[WARNING] The POM for xxx is missing, no dependency inform
    理解maven命令package、install、deploy的联系与区别
  • 原文地址:https://www.cnblogs.com/shadoll/p/14416038.html
Copyright © 2011-2022 走看看