Redis深度历险-核心原理与应用实践
Table of Contents

Redis数据结构

Redis数据结构

String底层是sds,有点类似于java的ArrayList,预分配内存,不足扩容。

String

1.SDS(简单动态字符串),带长度信息的字节数组

2.SDS内包含数组容量,数组长度,数据内容等,二进制安全

3.存储方式,raw和embstr,embstr是对象头和数据内容连续分配在一起,raw是对象头和数据内容不连续。

4.SDS扩容为少于1M,则加倍增加,大于1m,则每次只增加1m

Redis实现消息队列

怎么用Redis实现消息队列?

答案是用Redis的list数据结构,通过lpush将消息推入队列中,rpop将消息取出消费。

消费端拉取数据的实现

  1. lpop+sleep,缺点是有延迟
  2. lbpop,阻塞读(书上提到lbpop后会有空闲连接的问题,应该要加一些重试解决)

分布式锁冲突处理

直白地讲,就是分布式锁加锁失败了。怎么处理呢,我认为得看场景

  1. 直接返回一个该请求是重复请求的错误码。让业务方重试处理
  2. 自旋,然后做幂等处理。但是需要线程做Sleep,会稍微耗时。

我认为一般会采用第一个方法,让请求快速失败掉。第二种方法一是自旋比较耗资源,第二是自旋得幂等做好。

延时队列的实现

通过zset实现,开多个线程去轮询获取队列里面的消息。

关键点:通过zrem将消息移除出队列。避免多线程同时处理同一条消息。

位图