Redis应用场景

1,782 阅读4分钟

[TOC]

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

Redis 作为高性能的Key-Value的内存数据库,在实际应用场景中,尝尝被作为缓存使用,可以面对数据高并发读写,避免对关系型数据库造成过大压力。

Redis应用场景

缓存

作为高性能的Key-Value内存数据库,日常开始使用中最常见的使用场景便是作为数据缓存。只需要通过String类型将待缓存数据对象通过序列化后缓存起来即可。但使用时也有一些需要注意的点:

  • 必须保证不同缓存内容的key不会重复,并且尽可能短。可以使用对象主键等。
  • 对于热点数据在数据库新增或查询后将其放入缓存,修改后更新缓存,删除后对应去除缓存。同时也需要对其设置过期时间。
  • 合理利用缓存提高接口、网站访问速度,同时能够有效降低数据库压力。
  • Redis提供键过期,可以将其作为缓存过期淘汰策略。

计数器

Redis提供了incr命令来实现计数功能,通过内存操作性能高,能够很好适用于这些场景。

  • 社交业务产品中统计技术功能
    • 用户点赞数、关注数、粉丝数
    • 帖子点赞数、评论数、热度
    • 消息已读、未读,红点消息数
    • 话题消息数、帖子数、收藏数
  • 统计网站、接口的调用次数等。

限流

限流是一种限制某些操作、接口执行访问速率的操作。例如网关限制接口访问频次,针对于用户维度、全局维度来控制接口的访问频率。

  • MQ 防止重复消费同样可以利用incr计数,保证时间段内只会被消费一次。
  • 接口限流,限制接口时间段内请求次数上限。
  • 限流方式:
    • 本地令牌桶
    • lua脚本使用incr实现redis简单限流

队列

Redis有list pushlist pop这样的命令,可以很方便的执行队列操作。但是一般情况下不使用。

分布式锁

在分布式场景下,对同一资源的并发访问。比如全局ID、库存减少、秒杀、订单状态一致性等。并发量不大情况下可以使用数据库悲观锁、乐观锁来实现。但是并发量高的场景中,利用数据库锁机制来控制资源会很大程度影响数据库的性能。此时可以使用Redis的setnx功能来编写分布式锁,进行操作是来获取分布式锁,当然实际操作中需要考虑更多细节内容。

  • 互斥性。互斥是所得基本特性,同一时刻只能被一个线程操作。
  • 超时释放。通过超时释放,可以避免死锁,防止不必要的线程等待和浪费资源。MySQL的InnoDB中innodblockwait_timeout参数配置超时释放锁。
  • 可重入性。一个线程在持有该锁的情况下可以对其再次请求加锁。防止锁在线程执行完临界操作前释放。
  • 高性能和高可用。加锁和解锁的过程需要尽量减少性能消耗,但是也需要保证高可用,避免分布式锁意外失效。

在此说一下分布式锁的实现方案:

  • Memcached分布式锁

    利用Memcached的add命令,此命令是原子操作。只有在key不存在的情况下才能add成功,此时就获得到锁。

  • Zookeeper分布式锁

    利用zookeeper的顺序临时节点来实现分布式锁和等待队列。

  • Redis分布式锁

    基于Redis的分布式锁和Memcached的实现方式类似,Redis是使用其setnx命令,此命令同样也是源自操作,只有在key不存在的情况下才可以设置成功,从而获得锁。

分布式锁

排行榜

使用Redis的sortedset操作对热点数据进行排序。展示一段时间点赞量最多的帖子等等。