Redis的几种用途

Redis常用作于缓存,但实际上它的用途不止于此:

  1. 缓存
  2. 分布式锁
  3. 延时队列
  4. 位图
  5. 布隆过滤器

Redis用于缓存

在互联网应用中,Redis常作为数据库的缓存。典型的使用流程如下:

redis用作数据库缓存


Redis用于分布式锁

在分布式应用中,多个服务不在同一个应用里面,因此无法在代码里面实现锁操作,这时候可以引入 Redis 作为分布式锁。但是使用 Redis 作为多个服务公共的锁,可能存在以下几个问题:

  1. 锁超时:Redis的分布式锁不能解决超时问题,不要用来做时间较长的任务;
  2. 单点/多点问题:单机部署的Redis可能挂掉,锁会丢失;多机部署的Redis若主机获得锁后挂掉,另一个服务可以在从机获得;
  3. 可重入性:在应用中对 set 进行包装,使用 Threadlocal 和 引用计数 来解决重入问题。

Redis用于延时队列

Redis的 list 数据结构是链表,可以当队列使用。A服务往 redis 的 list 不断 push 数据,B服务随时 pop 取出处理。

但是,相较于专业的消息队列中间件,如 MQ、Kafka等, Redis 的消息队列显得不那么靠谱,如果对消息的可靠性有要求,不建议将 Redis 当队列用。


Redis用于位图

位图其实就是普通的字符串(byte数组)。可以用 get/set 直接获取整个位图的内容,也可以用 getbit/setbit 将 byte数组 当作 位数组 来使用。

一个使用场景是,用户一年的签到记录,签了是1,未签是0,将一个字符串当作位数组,其实就可以搞定。


Redis用于布隆过滤器

布隆过滤器(Bloom Filter)可以理解为一个不太精确的 Set,当它说某个值存在,这个值不一定存在,当它说不存在,那就肯定不存在。

Redis 在 4.0 支持布隆过滤器插件。

Redis的布隆过滤器底层是一个位数组 + 几个 hash 函数。添加元素时,这几个 hash 函数都会对该值计算一个 hash 值,并对数组长度取模得到一个下标(每个hash函数算到的下标都不一样)。获取元素时,需要该值对这些 hash 函数 hash 后的下标都为 1,才能判定该值存在。

布隆过滤器可以用来不太准确地判断一个值是否存在,以及准确地判断一个值不存在,例如新闻客户端的推送(以及推送过的就放进布隆过滤器,存在了就不重复推送了)。在 Hbase 等 NoSQL 里用来过滤掉大量不存在的 row 请求,再去磁盘查询。邮箱系统中用来判断垃圾邮件。