Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Redis design ideas and usage specifications

Redis design ideas and usage specifications

Avatar for halfrost

halfrost

June 18, 2019
Tweet

More Decks by halfrost

Other Decks in Programming

Transcript

  1. 数据结构 Redis对字典的哈希表执行rehash步骤: 1. 为ht[1]哈希表分配空间,大小取决于要执行的操作,以及ht[0]当前包含的键值对数量(ht[0].userd) a. 如果执行扩展操作,那么ht[1]的大小为第一个大于等于ht[0].used * 2 的2n b.

    如果执行的是收缩操作,那么ht[1]的大小为第一个大于等于ht[0].used的2n 2. 将保存在ht[0]上的键值对,rehash到ht[1]上面,即重新计算键值哈希即索引,放到ht[1]哈希表指定位置 3. 当ht[0]包含的所有键值对都迁移到ht[1]之后(ht[0]变为空表)释放ht[0], ht[1]变成ht[0], ht[1]新创建一个空 哈希表,为下一次rehash做准备 字典
  2. 单机数据库实现 与RDB通过保存数据库中的键值对来记录数据库状态不同,AOF(Append Only File)是通过保存Redis服务器所执行 的命令来记录数据库状态的。AOF持久化功能的实现可分为命令追加、文件写入、文件同步三个步骤。 AOF持久化的效率性与安全性 服务器配置的appendfsync的值直接决定了AOF的效率性和安全性。 - always 每个事件循环都会将aof_buf缓冲区的内容写入AOF文件,并且同步。效率最低,但最安全,最多丢是一个事

    件循环中产生的命令数据。 - everysec 每个事件循环都会同步aof_buf缓存区内容,每隔一秒钟子线程对AOF文件进行一次同步。效率足够快,故 障时会丢失一秒钟的数据。 - no 每个事件循环都会将aof_buf缓冲区的内容写入AOF文件,至于何时同步由操作系统控制。写入速度最快,但是故 障时会丢失上次同步AOF文件之后的所有写数据。 持久化—AOF
  3. 多机数据库实现 Redis Cluster是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移 功能。 握手 一个Redis Cluster由多个node组成,node0向另一个node1发送Cluster Meet命令进行握手,握手成功后node1就会 添加到node0所在集群;但是这个集群还是处于下线状态,因为没有分配槽; 槽指派

    Redis通过分片方式保存数据库中的键值对,集群整个数据库被分为16384个槽(slot)。在clusterState中记录为包含 16384个项的数组。数组的每一项指向了clusterNode 集群中执行命令 Redis首先会计算key属于哪一个槽,CRC16(key) & 16384; 再看槽是否属于当前节点,如果不是会返回MOVED错误, 指引客户端转到正在负责槽的节点。 集群
  4. 使用规范与常见问题 Key设计 1. 可读性和可管理性 - 业务名为前缀,防止key冲突,冒号分割,如ele:wp:uid:1 2.简洁性 - 保证语义前提下,控制key长度 3.不包含特殊字符

    Value设计 1. 避免bigkey - String控制在10KB内 - hash、list、set、zset元素不超过5000,反例:一个包含百万原生的list、hash,一个巨大的json字符串 2.bigkey的危害 - 网络阻塞;慢查询阻塞其他命令;集群节点数据不均衡;应用需要频繁序列化&反序列化 使用规范
  5. 使用规范与常见问题 bigkey删除 - 直接del删除bigkey非常慢,对redis发生阻塞 - 小心bigkey隐性删除,如过期 - 可以使用lazy delete(unlink命令),后台删除,不会阻塞前台命令线程 bigkey

    预防 - 优化数据结构,例如二级拆分,按天/小时存入 - 命令优化,避免hgetall,使用hmget、hscan - 报警和定期优化 合理的数据结构 1. 避免数据松散,hash可能更适合,ziplist能够节省内存 2. 需求 100万数据(picId -> userId)有哪些存储方案? 使用规范
  6. 使用规范与常见问题 缓存穿透 - 不存在的数据,不能命中缓存,查询DB - 业务代码问题、恶意攻击 - 关注指标缓存命中率,缓存空(设置过期),布隆过滤器 缓存雪崩 -

    cache承载大量请求,如果宕机,流量直接打到后端,造成级联故障。或者缓存集中过期,发生大量缓存穿透。 - 保证高可用;二级缓存;后端限流;避免集中过期;提前演练 无底洞问题 - 添加机器是,客户端性能不升反降 - 命令本身优化,减少通信次数,其他IO优化 热key问题&热key重建问题 常见问题