Redis 核心技术与实战
蒋德钧
中科院计算所副研究员
25203 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
02 | 数据结构:快速的Redis有哪些慢操作?
04 | AOF日志:宕机了,Redis如何避免数据丢失?
17 | 为什么CPU结构也会影响Redis的性能?
课程目录
已完结/共 53 讲
开篇词 (1讲)
开篇词 | 这样学Redis,才能技高一筹
基础篇 (10讲)
01 | 基本架构:一个键值数据库包含什么?
02 | 数据结构:快速的Redis有哪些慢操作?
03 | 高性能IO模型:为什么单线程Redis能那么快?
04 | AOF日志:宕机了,Redis如何避免数据丢失?
05 | 内存快照:宕机后,Redis如何实现快速恢复?
06 | 数据同步:主从库如何实现数据一致?
07 | 哨兵机制:主库挂了,如何不间断服务?
08 | 哨兵集群:哨兵挂了,主从库还能切换吗?
09 | 切片集群:数据增多了,是该加内存还是加实例?
10 | 第1~9讲课后思考题答案及常见问题答疑
实践篇 (28讲)
11 | “万金油”的String,为什么不好用了?
12 | 有一亿个keys要统计,应该用哪种集合?
13 | GEO是什么?还可以定义新的数据类型吗?
14 | 如何在Redis中保存时间序列数据?
15 | 消息队列的考验:Redis有哪些解决方案?
16 | 异步机制:如何避免单线程模型的阻塞?
17 | 为什么CPU结构也会影响Redis的性能?
18 | 波动的响应延迟:如何应对变慢的Redis?(上)
19 | 波动的响应延迟:如何应对变慢的Redis?(下)
20 | 删除数据后,为什么内存占用率还是很高?
21 | 缓冲区:一个可能引发“惨案”的地方
22 | 第11~21讲课后思考题答案及常见问题答疑
23 | 旁路缓存:Redis是如何工作的?
24 | 替换策略:缓存满了怎么办?
25 | 缓存异常(上):如何解决缓存和数据库的数据不一致问题?
26 | 缓存异常(下):如何解决缓存雪崩、击穿、穿透难题?
27 | 缓存被污染了,该怎么办?
28 | Pika:如何基于SSD实现大容量Redis?
29 | 无锁的原子操作:Redis如何应对并发访问?
30 | 如何使用Redis实现分布式锁?
31 | 事务机制:Redis能实现ACID属性吗?
32 | Redis主从同步与故障切换,有哪些坑?
33 | 脑裂:一次奇怪的数据丢失
34 | 第23~33讲课后思考题答案及常见问题答疑
35 | Codis VS Redis Cluster:我该选择哪一个集群方案?
36 | Redis支撑秒杀场景的关键技术和实践都有哪些?
37 | 数据分布优化:如何应对数据倾斜?
38 | 通信开销:限制Redis Cluster规模的关键因素
期中测试 (2讲)
期中测试题 | 一套习题,测出你的掌握程度
期中测试题答案 | 这些问题,你都答对了吗?
未来篇 (3讲)
39 | Redis 6.0的新特性:多线程、客户端缓存与安全
40 | Redis的下一步:基于NVM内存的实践
41 | 第35~40讲课后思考题答案及常见问题答疑
加餐篇 (7讲)
加餐(一)| 经典的Redis学习资料有哪些?
加餐(二)| 用户Kaito:我是如何学习Redis的?
加餐(三)| 用户Kaito:我希望成为在压力中成长的人
加餐(四) | Redis客户端如何与服务器端交换命令和数据?
加餐(五) | Redis有哪些好用的运维工具?
加餐(六)| Redis的使用规范小建议
加餐(七) | 从微博的Redis实践中,我们可以学到哪些经验?
结束语 (2讲)
期末测试 | 这些Redis核心知识,你都掌握了吗?
结束语 | 从学习Redis到向Redis学习
Redis 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册
开通超级会员可免费学习本课程,还可解锁海量内容免费学特权。

28 | Pika:如何基于SSD实现大容量Redis?

你好,我是蒋德钧。
我们在应用 Redis 时,随着业务数据的增加(比如说电商业务中,随着用户规模和商品数量的增加),就需要 Redis 能保存更多的数据。你可能会想到使用 Redis 切片集群,把数据分散保存到多个实例上。但是这样做的话,会有一个问题,如果要保存的数据总量很大,但是每个实例保存的数据量较小的话,就会导致集群的实例规模增加,这会让集群的运维管理变得复杂,增加开销。
你可能又会说,我们可以通过增加 Redis 单实例的内存容量,形成大内存实例,每个实例可以保存更多的数据,这样一来,在保存相同的数据总量时,所需要的大内存实例的个数就会减少,就可以节省开销。
这是一个好主意,但这也并不是完美的方案:基于大内存的大容量实例在实例恢复、主从同步过程中会引起一系列潜在问题,例如恢复时间增长、主从切换开销大、缓冲区易溢出。
那怎么办呢?我推荐你使用固态硬盘(Solid State Drive,SSD)。它的成本很低(每 GB 的成本约是内存的十分之一),而且容量大,读写速度快,我们可以基于 SSD 来实现大容量的 Redis 实例。360 公司 DBA 和基础架构组联合开发的 Pika键值数据库,正好实现了这一需求。
Pika 在刚开始设计的时候,就有两个目标:一是,单实例可以保存大容量数据,同时避免了实例恢复和主从同步时的潜在问题;二是,和 Redis 数据类型保持兼容,可以支持使用 Redis 的应用平滑地迁移到 Pika 上。所以,如果你一直在使用 Redis,并且想使用 SSD 来扩展单实例容量,Pika 就是一个很好的选择。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
02 | 数据结构:快速的Redis有哪些慢操作?
04 | AOF日志:宕机了,Redis如何避免数据丢失?
17 | 为什么CPU结构也会影响Redis的性能?
24 | 替换策略:缓存满了怎么办?
40 | Redis的下一步:基于NVM内存的实践
加餐(七) | 从微博的Redis实践中,我们可以学到哪些经验?
开通超级会员免费畅看本课程
开通会员
该文章仅可免费阅读部分内容,如需阅读完整文章,请开通超级会员或单独购买本课程。
登录 后留言

精选留言(26)

  • Kaito
    是否可以使用机械硬盘作为Redis的内存容量的扩展?

    我觉得也是可以的。机械硬盘相较于固态硬盘的优点是,成本更低、容量更大、寿命更长。

    1、成本:机械硬盘是电磁存储,固态硬盘是半导体电容颗粒组成,相同容量下机械硬盘成本是固态硬盘的1/3。
    2、容量:相同成本下,机械硬盘可使用的容量更大。
    3、寿命:固态硬盘的电容颗粒擦写次数有限,超过一定次数后会不可用。相同ops情况下,机械硬盘的寿命要比固态硬盘的寿命更长。

    但机械硬盘相较于固态硬盘的缺点也很明显,就是速度慢。

    机械硬盘在读写数据时,需要通过转动磁盘和磁头等机械方式完成,而固态硬盘是直接通过电信号保存和控制数据的读写,速度非常快。

    如果对于访问延迟要求不高,对容量和成本比较关注的场景,可以把Pika部署在机械硬盘上使用。

    另外,关于Pika的使用场景,它并不能代替Redis,而是作为Redis的补充,在需要大容量存储(50G数据量以上)、访问延迟要求不苛刻的业务场景下使用。在使用之前,最好是根据自己的业务情况,先做好调研和性能测试,评估后决定是否使用。
    2020-10-21
    4
    80
  • Roy Liang
    SSD使用寿命和擦写次数相关,我们有的业务数据量和访问量特别大,使用SSD一年就得换了,这样实际成本降不下来。所以,请问有没有可能开发一套混合存储系统,热数据存储而不是缓存在Redis,冷数据存储在Pika,Redis中的热数据淘汰时,自动写入Pika,Pika的冷数据加载时,自动写入Redis,这样业务代码几乎就不用做数据一致性维护相关的内容。不知道这个系统是否存在可行性?其中的技术风险可能在哪里?

    作者回复: 这个方案是可行的,相当于冷热分层存储了,而且Pika和Redis的数据模型兼容,所以数据迁移起来会比较方便直接。

    我想到的关键技术问题:1. 数据冷热的区分方法,这有点类似于缓存算法,把经常访问的数据要能够筛选出来;2. 数据的迁移开销,数据迁移时需要避免对Redis前端读写请求的阻塞,开发这个系统时可能要考虑使用额外线程来迁移Redis数据;3. 数据迁移时数据读写正确性的保证,例如数据正在迁移,是否还能正常读写。

    2020-10-26
    3
    19
  • 孔祥鑫
    有个地方没搞明白,读ssd上的数据文件,和redis读rdb文件相比,两者都是文件,为什么会比redis快呢
    2020-11-16
    4
    8
  • 小文同学
    机械硬盘和 SSD 在性能上最大的区别是因为机械硬盘的随机访问涉及到机器臂的移动和寻址,所以非常慢。但我在了解 Pika 对文件的使用上,其实有考虑过这方面的问题,通过 A、B两块内存交换使用,以一块内存为单位进行磁盘写,在这个情况下。我认为机械硬盘的写性能并不一定比 SSD 差很多。

    在读数据的情况下,假如没有热点数据,和存在大量的随机读,则机械硬盘的读性能会显得很差,反之,由于有一大块的内存做缓冲,读性能或许并不会太差,这取决于业务场景。

    剩余机械硬盘的某些优势还是比较明显,Kaito 班长的留言已经非常明白,顾不复述。
    2020-11-12
    5
  • 杨逸林
    Redis 服务器有没有必要上 ECC 内存?
    还有如果那个 Memtable 有没有极端情况,Memtable1 还在写入 SSD,Memtable2 已经满了,这怎么办?虽然写入 SSD 很快,我是说如果。

    binlog 机制在 MySQL 那已经玩烂了。。。

    作者回复: ECC内存是需要的,Redis数据都在内存中,如果内存出错,会有影响的。

    关于Memtable的问题是个好问题。在你说的情况下,Memtable1还在写SSD,Memtable2已经满了,此时相当于有两个Memtable要刷盘,RocksDB会对前端的写进行限速。

    RocksDB中有个配置项是max_write_buffer_number,如果需要往盘上刷的memtable大于这个配置项,就会进行写限速了。

    2020-10-25
    3
    5
  • Geek_9a0c9f
    pika从性能上比当然不然redis,但是它你补了redis几个不足,那么pika在真是项目中都应用在什么场景呢?,与ssd的mysql比优势在哪里?除了o(1)的操作。
    2020-10-21
    4
  • Q, Q
    pika实际是使用ssd提高性能,那还不如把redis层去掉,mysql直接上ssd岂不是更加方便?
    2021-08-01
    4
  • neohope
    用机械硬盘阵列来做缓存,其实没有必要,速度太慢了:
    1、用redis来做缓存,就是因为mysql慢,所以加了一层
    2、redis比mysql快的最根本原因,不是redis技术强悍,而是内存比磁盘快
    3、mysql本身就是把热数据放到内存里,冷数据存到磁盘阵列上,并且做了很多数据查找的优化
    4、pika利用的是SSD比磁盘快,比内存便宜,才找到了自己的生存空间,其根本原因也不是RocksDB技术先进;
    5、Pika的用磁盘做缓存,从磁盘上查找记录,比mysql也快不了太多,解决不了什么问题,而且还引入了新的故障点,没有太多价值
    2021-02-19
    4
  • 麦呆小石头
    pika 的存储机制,集合类型的性能会低很多啊,hash 和跳表的特性都没了吧
    2020-12-02
    3
  • 游弋云端
    可以考虑内存、SSD、HDD做分级存储,当前这对系统要求就更高了,需要识别数据的冷温热,再做不同介质间的动态迁移,甚至可以做一些访问预测来做预加载和调级。

    作者回复: 分级存储时,数据的冷热度识别是一个主要要考虑的问题。通常可以用缓存算法策略来筛选冷热数据,目前也有些尝试是用机器学习的方法来预测数据冷热度,进而再放到不同的介质中。

    2020-10-21
    2
  • Tr丶Zoey
    有没有人用ssdb的啊?😂
    老大让我们用这个代替redis,说没问题,结果用下来坑真的多。。。
    2021-02-02
    2
    2
  • 由于是文件连续读写,Pika最大的问题并不是数据写入的时候吧。而是读取key的时候要去RocketsDB的SSTable里面挨个读文件。文章没有提及。相比之下,写入的性能降低和读取的性能降低比较不值一提啊。
    2021-09-07
  • 黄泓哲
    这让我想起来前几年的混合硬盘,机械+NAND
    2021-03-22
  • Geek_5b378d
    有一点不理解:RDB 文件生成时的 fork 时长就会增加
    不是用另外一个进程去生成 RDB 文件嘛,咋会阻塞 redis 实例呢
    2021-03-18
    2
  • 沈寅
    redis操作都是原子的,pika内部使用多线程,还能保证原子性吗?
    2021-02-20
  • silentyears
    老师,pika这样存储集合类型的方式不太明白,拿Hash来说,field存储在键中,value存储在值中,怎么快速定位呢?难道是hash后计算出来位置m,在键中“数组”位置m上找field,同样在值中“数组”位置m上找value?
    2021-02-13
  • 金龟
    刚才说错了,可以用mongodb
    2021-01-31
  • 💢 星星💢
    Pika 的多线程模型,可以同时使用多个线程进行数据读写,这在一定程度上弥补了从 SSD 存取数据造成的性能损失,多线程读写,会涉及到数据竞争吧,pika这一块是否有优雅的处理呢?
    2021-01-12
  • 范闲
    Pika就是支持多种数据结构的分布式kv。
    数据访问的性能一定会下降:
    memtable有大小限制,如果不在这里一定是从磁盘读,一定比从内存读慢。
    2020-12-03
  • Mr.蜜
    只要能区分出冷热数据,启用机械硬盘作为一部分存储介质也是一个可取的方案。

    作者回复: 如果用机械硬盘,考虑到机械硬盘的毫秒级别延迟,数据访问速度会比较慢,会拖慢前端应用的响应。一般还是建议用SSD更好些。

    2020-11-13
收起评论
26
返回
顶部