ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis 数据结构

2020-11-22 16:32:29  阅读:264  来源: 互联网

标签:index 数据结构 UV Redis html 110 html0527


目录

string、hash 最多个 2^32 个 key。每个 key 最大 512MB,value 最大 512MB。
list、set、zset 最多 2^32 个元素。

string

使用场景

选举

  1. 节点抢占 leaderKey SET leaderKey hostId NX EX 30
  2. 节点每20秒查询一次 GET leaderKey
  3. 如果自己是 master,做一次续约 EXPIRE leaderKey 30

分布式锁

分布式锁

分布式ID

可以使用 INCR 每次自增1,但这样发号,客户端要请求一次 Redis,影响性能。
推荐号段生成:

  1. INCRBY 步长,如果 key 不存在,从 0 开始自增;如果 key 存在,返回自增后的数值。
  2. 客户端分配号段 [结果 - 步长, 结果)

数据结构

简单动态字符串,Simple Dynamic String 有 free、len 两个字段:
len 的作用:

  1. 二进制安全。不同于 c字符串通过 '\0' 判断字符串长度,SDS 通过 len 记录长度
    free 的作用:
  2. 空间预分配。当进行 concat 等扩展操作时,SDS 会预留 free 空间,避免连续扩展带来的内存分配消耗
  3. 惰性释放空间。当进行字符串缩减操作时候,SDS 并不会马上收回空间,避免后续有扩展操作带来内存分配消耗

hash

使用场景

统计 PV、UV

  1. 用户110 访问 index.html HINCRBY index.html0527 110 1
  2. 用户110 再次访问 index.html HINCRBY index.html0527 110 1
  3. 查询 index.html 5月27日 PV HGETALL index.html0527,然后算总和(不建议,HGETALL 时间复杂度 O(n),会阻塞主线程)
  4. 查询 index.html 5月27日 UV HLEN index.html0527

统计 UV(BitMap)

  1. 用户110 访问 index.html SETBIT index.html0527 110 1
  2. 用户233 访问 index.html SETBIT index.html0527 233 1
  3. 查询 index.html 5月27日 UV BITCOUNT index.html0527

统计 UV(HyperLogLog)

  1. 用户 110、233 访问 index.html PFADD index.html0527 110 233
  2. 查询 index.html 5月27日 UV PFCOUNT index.html0527

数据结构

dict 哈希表,元素数量多于64 使用。链地址法

set

使用场景

共同关注

  1. 用户110 关注用户996 SADD follow110 996
  2. 用户110、233 的共同关注 SUNION follow110 follow233

数据结构

dict 哈希表,元素数量多于64 使用。value 存储 null

list

使用场景

限流(令牌桶)

  1. 固定速率生成令牌 LEFTPUSH limit UUID
  2. 达到上限,停止生成令牌 LLEN limit
  3. 消耗令牌 RIGHTPOP limit

数据结构

quicklist 双向链表,每一个节点都是 ziplist

zset

使用场景

限流(滑动窗口)

  1. 用户110 请求进来 ZADD limit110 UUID cur_time
  2. 时间范围内的请求 ZRANGEBYSCORE limit110 cur_time - interval cur_time
  3. 删除历史请求记录 ZREMRANGEBYSCORE limit110 0 cur_time - interval

排行榜

  1. 用户110 获得 99分 ZADD board 99 110
  2. 查询前100名高分用户 ZREVRANGE board 0 99
  3. 查询用户110的排名 ZRANK board 110

延时队列

  1. 按任务时间戳升序 ZADD deplay timpestamp A
  2. while 检查第一个元素 ZRANGE deplay 0 0
  3. 比较时间戳,如果能执行,就删除第一个元素 ZREM deplay A

数据结构

dict 哈希表,key 是 member,value 是 score。
zskiplist 跳表。0层存储完整数据,随机建新层,最高32层就可以容纳 2^64 个元素。

对比红黑树

命令 红黑树 跳表 说明
ZADD O(logN) O(logN) 并发环境,跳表需要锁定的粒度更少
ZSCORE O(1) O(1) 引入 dict
ZRANK O(logN) O(logN) 复杂度一样,跳表实现更简单
ZRANGE O(N) O(logN+k) 跳表更高效

压缩数据结构

intset 当 set 元素数量少于64 使用
zipmap 当 hash 元素数量少于64 使用
ziplist 当 zset 元素数量少于64 使用。list 的节点就是 ziplist

参考文献

标签:index,数据结构,UV,Redis,html,110,html0527
来源: https://www.cnblogs.com/mougg/p/14019782.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有