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 查看数据使用类型

posted @ 2022-02-13 17:08  dsfsadfdgd  阅读(39)  评论(0)    收藏  举报