Redis的几种用途
Redis常用作于缓存,但实际上它的用途不止于此:
- 缓存
- 分布式锁
- 延时队列
- 位图
- 布隆过滤器
Redis用于缓存
在互联网应用中,Redis常作为数据库的缓存。典型的使用流程如下:
Redis用于分布式锁
在分布式应用中,多个服务不在同一个应用里面,因此无法在代码里面实现锁操作,这时候可以引入 Redis 作为分布式锁。但是使用 Redis 作为多个服务公共的锁,可能存在以下几个问题:
- 锁超时:Redis的分布式锁不能解决超时问题,不要用来做时间较长的任务;
- 单点/多点问题:单机部署的Redis可能挂掉,锁会丢失;多机部署的Redis若主机获得锁后挂掉,另一个服务可以在从机获得;
- 可重入性:在应用中对 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 请求,再去磁盘查询。邮箱系统中用来判断垃圾邮件。