一、缓存

说到redis,很多人第一个想到的就是缓存,也是我们用的最多的一个场景;国内外中大型的网站都离不开缓存。合理的利用缓存,比如缓存热点数据,不仅可以提升网站的访问速度,还可以降低数据库DB的压力。并且,Redis相比于memcached,还提供了丰富的数据结构,并且提供RDB和AOF等持久化机制,强的一批。

二、排行榜

当今互联网应用,有各种各样的排行榜,如电商网站的月度销量排行榜、社交APP的礼物排行榜、小程序的投票排行榜等等。Redis提供的zset数据类型能够实现这些复杂的排行榜。我们来举一个例子。

比如,用户每天上传视频,或者点赞的排行榜可以这样设计:

  • 用户Tom上传了一个视频,获得了6个赞:
zadd user:ranking:2021-03-03 Jay 3
  • 过了一段时间,在获得一个赞:
zincrby user:ranking:2021-03-03 Jay 1
  • 如果某个用户Jack作弊,需要删除该用户
zrem user:ranking:2021-03-03 John
  • 暂时获取赞数最多的三个用户
zrevrangebyrank user:ranking:2021-03-03 0 2

三、计数器应用

各大网站、APP应用经常需要计数器的功能,如短视频的播放数、电商网站的浏览数。这些播放数、浏览数一般要求实时的,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。

四、共享Session

如果一个分布式Web服务将用户的Session信息保存在各自服务器,用户刷新一次可能就需要重新登录了,这样显然有问题。实际上,可以使用Redis将用户的Session进行集中管理,每次用户更新或者查询登录信息都直接从Redis中集中获取。

五、分布式锁

几乎每个互联网公司中都使用了分布式部署,分布式服务下,就会遇到同一个资源的并发访问的技术难题,如秒杀、下单减库存等场景。

这里复习下两个redis命令:

  • SETNX 如果不存在该key,则设置并返回1,如果存在就返回0(不覆盖)
SETNX key value  //setnx是set if not exists 的简写
  • SETEX 将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。
SETEX key seconds value  //这里set value 和set time 是一个原子操作

这两个是实现Redis分布式锁的关键。具体的Redis分布式的实现后续会更新相关文章,敬请期待!

六、社交网络

赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适保存 这种类型的数据,Redis提供的数据结构可以相对比较容易地实现这些功能。

七、消息队列

消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。

八、位操作

用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,能怎么做?千万别说给每个用户建立一个key,然后挨个记(你可以算一下需要的内存会很恐怖,而且这种类似的需求很多。这里要用到位操作——使用setbit、getbit、bitcount命令。原理是:redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统。