Redis应用 — GeoHash

Redis应用 — GeoHash

用数据库来计算附近的人

地球上的任一位置都可以用经纬度(经度:东西方向,以本初子午线为起始点;纬度:南北方向,以赤道为起始点)来表示,如果将坐标位置存在数据库中,它的数据模型应该是:

坐标表(元素id,经度值x,纬度值y)
Read More
Redis应用 — 漏斗限流

Redis应用 — 漏斗限流

设计思想

漏斗限流是最常用的限流方式之一,其来源灵感于漏斗。漏斗的容量是有限的,如果将溜嘴堵住,然后一直往里面灌水,它就会变满,直至再也装不进去。如果将漏嘴放开,水就会往下流,流走一部分后,又可以继续往里面灌水。如果漏嘴流水的速率大于灌水的速率,那么漏斗就永远都装不满。如果漏嘴流水速率小于灌水速率,那么一旦漏斗满了,灌水就需要暂停并等待漏斗腾出一部分空间。

所以,漏斗的剩余空间代表当前行为可以持续进行的数量,漏嘴的流水速率代表着系统允许该行为的最大频率。

Read More
Redis应用 — 简单限流

Redis应用 — 简单限流

简单限流

限流算法在分布式领域是一个经常被提起的话题,当系统处理能力有限时,如何阻止计划外的请求继续对系统施压,这是一个需要重视的问题。

以论坛社区为例,我们可以通过限流控制用户行为,避免垃圾请求。比如用户的发帖、点赞、回复等行为需要严格管控,限定某行为在规定的时间内次数,超过了次数就是非法行为。

Read More
Redis应用 — 布隆过滤器

Redis应用 — 布隆过滤器

什么是布隆过滤器

使用 HyperLogLog 数据结构进行去重统计非常高效,但是如果我们想知道某个 value 是否在 HyperLogLog 结构里面这时它就无能为力了。它只提供了 pf.add 和 pd.count 方法,并没有 pf.contains 方法。

Read More
Redis应用 — 位图

Redis应用 — 位图

何为位图(bitmap)

位图不是特殊的数据结构,它本身是一个普通字符串,即 byte 数组。一个 byte 使用 8 个二进制位存储。redis 提供一系列操作二进制位的指令操作,这些操作称为「位图操作」。

计算机存储单位有:bit、byte、KB、MB、GB、TB、ZB、EB、BB。bit 是计算机的最小存储单位,存储的都是 0 和 1;byte(字节)是计算机的最小数据处理单元,一个字母用一个 byte 存储,一个汉字用两个 byte 存储,1 Byte = 8 bit。

1 byte = 8bit
1 kb = 1024byte
1 mb = 1024kb
……

Read More
Redis应用 — HyperLogLog

Redis应用 — HyperLogLog

何为 HyperLogLog

HyperLogLog 是一种高级数据结构,在数据去重统计时非常有用。假设我们需要对网站的每个页面计算 UV,每个用户一天之内的多次访问只计算一次,这里涉及到数据的去重。

Read More
Redis应用 — 延时队列

Redis应用 — 延时队列

异步消息队列

使用 redis 的 list 数据结构可以实现简单的消息队列效果。redis 消息队列没有 ask 机制,如果对消息的可靠性有严格要求则应该使用专业的消息队列中间件如 rabbitmq、kafka。

要使用 redis 的消息队列可以通过搭配 rpush、lpoplpush、rpop 命令实现。

生产者通过 rpush、lpush 推送消息到 list 中,消费者不断轮询 key,通过 rpop、lpop 获取消息。

Read More
Redis应用 — 分布式锁

Redis应用 — 分布式锁

何为分布式锁

使用分布式锁,是为了解决并发情况下相同代码块被多个线程同时执行带来的数据错乱问题。使用分布式锁以保证同一个代码块只有一个线程被执行。

这个代码块的执行是一个原子操作,操作一开始就会一直运行到结束,不能被线程调度机制打断,不能发生线程上线文切换。

Read More
Redis应用 — 基本数据结构