redis数据结构
string
结构:embstr = RedisObject对象头 + sds结构;最大存储512M。
RedisObject 用于redis 数据内存回收和记录引用计数。sds结构包括已用空间和可用空间。
- 惰性空间释放 SDS 缩短时,并不会回收多余的内存空间,而是使用 free 字段将多出来的空间记录下来。如果后续有变更操作,直接使用 free 中记录的空间,减少了内存的分配。
- 空间预分配 append操作会额外分配与 len 相同长度的未使用空间。
- 二进制安全 C中字符串遇到 '\0' 会结束,那 '\0' 之后的数据就读取不上了。但在 SDS 中,是根据 len 长度来判断字符串结束的。O(1)复杂度计算长度。
zset
压缩列表:存储不同长度元素的数组,使用连续的内存。
带有分数的成员自动排序,按照score增大的顺序
127.0.0.1:6379> ZADD page_rank 10 google.com (integer) 1 127.0.0.1:6379> ZRANGE page_rank 0 -1 1) "google.com" 127.0.0.1:6379> ZADD page_rank 7 baidu.com (integer) 1 127.0.0.1:6379> ZRANGE page_rank 0 -1 1) "baidu.com" 2) "google.com"
(1)延时队列:按照插入redis的时间排序,可以实现延时队列,实现对消息的延时消费。
(2)排行榜:还可以以点赞数量作为score,实现排行榜功能,对key对应的socre+1操作。
(3) 滑动窗口限流:把用户的 ID 作为 key 来定义zset ,member 和 score 都为访问时的时间戳。我们只需统计某个 key 下在指定时间戳区间内的个数,就能得到这个用户滑动窗口内访问频次,如果超过最大访问频次就与最小的score比较判断是否在规定的时间内,来决定是否允许通过。
hash
压缩列表:ziplist
HSET :Redis HSet 命令用于设置哈希表中的键值对。
HGET :Redis Hget 命令用于返回哈希表中指定字段的值。
// 哈希表名:age 键值对:tom=>33 127.0.0.1:6379> hset age kik 23 (integer) 1 127.0.0.1:6379> hset age kik 24 (integer) 0 127.0.0.1:6379> hget age kik "24"
链表:
quicklist: quicklist是由ziplist组成的双向链表,链表中的每一个节点都以压缩列表ziplist的结构保存着数据,相当与一个quicklist节点保存的是一片数据,而不再是一个数据。
实现消费者生产者模式
lpush age 20 //往age链表中加入value :20 brpop age 60 //从age链表中阻塞式取值,超时时间60s,超时时间设置为0表示永久阻塞。 lrange age 0 -1 //查看list value数量
使用debug object XXX 查看数据使用类型