《Redis核心技术与实践》阅读笔记: 数据类型/存储开销/Rehash/案例等

说明

Redis 的存储开销方面讲的具体生动,特别是通过压缩列表减少内存空间的分析过程很细致,设计的几个案例也比较典型如果对这篇笔记中的内容感到陌生,推荐阅读::

试读链接任意四章试读入口

新人优惠极客时间新注册38元代金券

蒋德钧《Redis核心技术与实践》

常用操作

查看配置

127.0.0.1:6379> config get hash-max-ziplist-entries
1) "hash-max-ziplist-entries"
2) "512"
127.0.0.1:6379> config get hash-max-ziplist-value
1) "hash-max-ziplist-value"
2) "64"

数据类型

redis 采用单线程设计,没有额外的并发开销,利用操作系统的 epoll 实现I/O 的多路复用:

redis的 I/O多路复用

redis 中 key 和 value 的管理:

redis的key-value的存放方式

哈希冲突解决方法:维护两个哈希表,先使用第一个哈希表,当第一个哈希表中的数据过多时,创建第二个容量扩大一倍的哈希表,然后在以后的每次请求处理时,将对应的数据复制到第二个哈希表,渐进的完成哈希表的拷贝,最后删除第一个哈希表。

redis 的渐进式 rehash:

redis的rehash

对于集合类型(list/hash/set等),redis 会根据数据量选择合适的底层数据结构:

redis数据类型与底层数据结构对应关系

压缩列表就是带有起始偏移和和结束未知记录的数组。第一个元素和最后一个元素查询复杂度O(1),其它元素查询复杂度O(n)。数据量比较少时,用压缩列表可以极大减少内存占用(省去了指针)。

压缩列表

hash 类型的压缩列表使用边界:

hash-max-ziplist-entries: hash中元素小于等于该数值时,使用压缩列表,否则使用哈希表,默认配置 512
hash-max-ziplist-value:   压缩列表中单个元素最大长度,默认配置 64

set 类型的压缩列表使用边界:

zset-max-ziplist-entries: 默认 128

存储开销

redis 的 key 和 value 保存在 RedisObject 中,全局哈希表中的 key/value 是指向 RedisObject 的指针。对于一对 kv,哈希表的开销是 3 个指针 24 字节,考虑内存对齐,实际分配内存是 32 个字节。

redis的kv存储

RedisObject 由 8 字节的元数据和 8 字节的指针组成,如果是 int 数据直接存放到指针位置,如果是字符串数据,以 44 字节为界使用两种存放方式,redisObject 额外开销至少 8 字节,hash/list/set等集合类型另论。

redisobject编码

设计案例

海量数值类型 key-value 存储

key 为 8 字节数值,value 也是 8 字节数值,直接用 string 类型的存放,一对 kv 耗费 64 字节,额外开销占比高。如果拆分成用无数个成员不到 512 的 hash 存放,redis 会使用压缩列表存放每个 hash 中的成员,减少额外的存储开销,但是会浪费 CPU,单个 hash 中的成员查询采用遍历的方式。

计算每日留存用户

以天为单位创建 set,每天一个 set,在 set 中记录下当前登陆用户 id,通过两天的集合做并集得出留存用户

注意事项:Set 的集合运算开销高,数据量较大时,可能阻塞 redis 线程,考虑用从库计算。

用户每日签到记录

创建“用户-年度-月份”粒度的 bitmap,第 N 个 bit 位数值表示对应月份第 N 天的签到情况。

网页 UV 统计

方式1:每个页面一个 set,记录访问该页面的用户 uid。当页面 uv 超级大时,譬如千万,set 集合过大。

方式2:使用 HyperLogLog 模糊统计。 HyperLogLog 基于概率统计,标准错算率 0.81%。

地理空间查询

geo

时序数据保存

扩展模块 RedisTimeSeries。

用redis保存时序数据太费力,功能少问题多,应当用于专门的时序数据库。

缓存不一致/缓存雪崩/缓存击穿/缓存穿透

这部分参考 《高并发系统设计40问》阅读笔记,内容基本一样。高并发讲解的内容更全一些。

参考

  1. 李佶澳的博客

系统设计

  1. Netflix 的异地多活设计: Active-Active for Multi-Regional Resiliency
  2. Facebook 的缓存系统实践经验《Scaling Memcache at Facebook》
  3. 多机数据系统的正确性与一致性
  4. 《大型网站技术架构: 核心原理与案例分析》阅读摘录
  5. 《分布式金融架构课》阅读笔记2: 线性一致的分布式数据系统的实现过程
  6. 《分布式金融架构课》阅读笔记1: 单机&多机并发/多副本读写正确性和一致性
  7. 《消息队列高手课》阅读笔记: Rabbit/Rocket/Kafka/模型/消息事务/保序等
  8. 《消息队列高手课》阅读笔记: Rabbit/Rocket/Kafka/模型/消息事务/保序等
  9. 《Redis核心技术与实践》阅读笔记: 数据类型/存储开销/Rehash/案例等
  10. 《Redis核心技术与实践》阅读笔记: 数据类型/存储开销/Rehash/案例等
  11. 《高并发系统设计40问》阅读笔记: 数据库/缓存/消息队列/分布式服务
  12. 《高并发系统设计40问》阅读笔记: 数据库/缓存/消息队列/分布式服务
  13. 《MySQL实战45讲》阅读笔记: 索引类型/数据可靠性/事务/间隙锁/临时表等
  14. 系统性能分析方法论: 统计图谱工具
  15. 张磊《深入剖析Kubernetes》专栏的阅读笔记
  16. 代理服务软件haproxy、nginx、envoy对比,以及开源的API网关项目对比
  17. 蓝绿部署、金丝雀发布(灰度发布)、A/B测试的准确定义
  18. 阿里巴巴的应用限流和服务降级是怎样实现的?|如何打造平台稳定能力
  19. 陈皓《左耳听风》专栏的阅读笔记(持续更新)
  20. 好雨云帮,一款不错的国产开源PaaS
  21. 怎样为软件的不同版本命名?
  22. 怎样选择开源项目的license?
  23. Glusterfs的架构
  24. 怎样设计一个企业级的PaaS平台?
  25. 几种常见的LDAP系统
  26. DNS SRV介绍(一种用DNS做服务发现的方法)
  27. DNS,DNS-Domain Name System
  28. 思科的网络设备
  29. 虚拟化技术汇总
  30. 认证与授权系统的汇总
  31. 高可用实现方法汇总
  32. 编译器汇总
  33. Linux系统的优化方法
  34. CentOS7的一些变化
  35. 分布式系统的一些知识
  36. 计算机编程语言的特性汇总
  37. 网络通信的一些基础知识
  38. PCIE总线的一些知识
  39. 操作系统的API
  40. 网卡的一些知识
  41. Linux系统的构建过程
  42. 数据结构与算法
  43. CPU的相关知识

系统设计

  1. Netflix 的异地多活设计: Active-Active for Multi-Regional Resiliency
  2. Facebook 的缓存系统实践经验《Scaling Memcache at Facebook》
  3. 多机数据系统的正确性与一致性
  4. 《大型网站技术架构: 核心原理与案例分析》阅读摘录
  5. 《分布式金融架构课》阅读笔记2: 线性一致的分布式数据系统的实现过程
  6. 《分布式金融架构课》阅读笔记1: 单机&多机并发/多副本读写正确性和一致性
  7. 《消息队列高手课》阅读笔记: Rabbit/Rocket/Kafka/模型/消息事务/保序等
  8. 《消息队列高手课》阅读笔记: Rabbit/Rocket/Kafka/模型/消息事务/保序等
  9. 《Redis核心技术与实践》阅读笔记: 数据类型/存储开销/Rehash/案例等
  10. 《Redis核心技术与实践》阅读笔记: 数据类型/存储开销/Rehash/案例等
  11. 《高并发系统设计40问》阅读笔记: 数据库/缓存/消息队列/分布式服务
  12. 《高并发系统设计40问》阅读笔记: 数据库/缓存/消息队列/分布式服务
  13. 《MySQL实战45讲》阅读笔记: 索引类型/数据可靠性/事务/间隙锁/临时表等
  14. 系统性能分析方法论: 统计图谱工具
  15. 张磊《深入剖析Kubernetes》专栏的阅读笔记
  16. 代理服务软件haproxy、nginx、envoy对比,以及开源的API网关项目对比
  17. 蓝绿部署、金丝雀发布(灰度发布)、A/B测试的准确定义
  18. 阿里巴巴的应用限流和服务降级是怎样实现的?|如何打造平台稳定能力
  19. 陈皓《左耳听风》专栏的阅读笔记(持续更新)
  20. 好雨云帮,一款不错的国产开源PaaS
  21. 怎样为软件的不同版本命名?
  22. 怎样选择开源项目的license?
  23. Glusterfs的架构
  24. 怎样设计一个企业级的PaaS平台?
  25. 几种常见的LDAP系统
  26. DNS SRV介绍(一种用DNS做服务发现的方法)
  27. DNS,DNS-Domain Name System
  28. 思科的网络设备
  29. 虚拟化技术汇总
  30. 认证与授权系统的汇总
  31. 高可用实现方法汇总
  32. 编译器汇总
  33. Linux系统的优化方法
  34. CentOS7的一些变化
  35. 分布式系统的一些知识
  36. 计算机编程语言的特性汇总
  37. 网络通信的一些基础知识
  38. PCIE总线的一些知识
  39. 操作系统的API
  40. 网卡的一些知识
  41. Linux系统的构建过程
  42. 数据结构与算法
  43. CPU的相关知识

推荐阅读

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  系统软件  程序语言  运营经验  水库文集  网络课程  微信网文  发现知识星球