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

Redis design ideas and usage specifications

Redis design ideas and usage specifications

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重建问题 常见问题