最近对华为云分布式缓存产品 Redis 做了一些研究, 于是整理了一些基本的知识拿出来与大家分享, 首先跟大家分享的是, 如何从不同的角度来详细使用 Redis.
小编将从以下 9 个角度来进行详细分析, 希望可以帮到大家.
一, 网络模型:
Redis 使用单线程的 IO 复用模型, 自己封装了一个简单的 AeEvent 事件处理框架, 主要实现了 epoll,kqueue 和 select, 对于单纯只有 IO 操作来说, 单线程可以将速度优势发挥到最大, 但是 Redis 也提供了一些简单的计算功能, 比如排序, 聚合等, 对于这些操作, 单线程模型实际会严重影响整体吞吐量, CPU 计算过程中, 整个 IO 调度都是被阻塞住的.
二, 内存管理:
Redis 使用现场申请内存的方式来存储数据, 并且很少使用 free-list 等方式来优化内存分配, 会在一定程度上存在内存碎片, Redis 跟据存储命令参数, 会把带过期时间的数据单独存放在一起, 并把它们称为临时数据, 非临时数据是永远不会被剔除的, 即便物理内存不够, 导致 swap 也不会剔除任何非临时数据(但会尝试剔除部分临时数据), 这点上 Redis 更适合作为存储而不是 cache.
三, 数据一致性问题:
在一致性问题上, 个人感觉 Redis 没有 Memcached 实现的好, Memcached 提供了 cas 命令, 可以保证多个并发访问操作同一份数据的一致性问题. Redis 没有提供 cas 命令, 并不能保证这点, 不过 Redis 提供了事务的功能, 可以保证一串命令的原子性, 中间不会被任何操作打断.
四, 支持的 KEY 类型:
Redis 除 key/value 之外, 还支持 list,set,sorted set,hash 等众多数据结构, 提供了 KEYS 进行枚举操作, 但不能在线上使用, 如果需要枚举线上数据, Redis 提供了工具可以直接扫描其 dump 文件, 枚举出所有数据, Redis 还同时提供了持久化和复制等功能.
五, 客户端支持:
Redis 官方提供了丰富的客户端支持, 包括了绝大多数编程语言的客户端, 比如我此次测试就选择了官方推荐了 Java 客户端 Jedis. 里面提供了丰富的接口, 方法使得开发人员无需关系内部的数据分片, 读取数据的路由等, 只需简单的调用即可, 非常方便.
六, 数据复制:
从 2.8 开始, Slave 会周期性 (每秒一次) 发起一个 Ack 确认复制流 (replication stream) 被处理进度, Redis 复制工作原理详细过程如下:
1. 如果设置了一个 Slave, 无论是第一次连接还是重连到 Master, 它都会发出一个 SYNC 命令;
2. 当 Master 收到 SYNC 命令之后, 会做两件事:
a) Master 执行 BGSAVE: 后台写数据到磁盘(rdb 快照);
b) Master 同时将新收到的写入和修改数据集的命令存入缓冲区(非查询类);
3. 当 Master 在后台把数据保存到快照文件完成之后, Master 会把这个快照文件传送给 Slave, 而 Slave 则把内存清空后, 加载该文件到内存中;
4. 而 Master 也会把此前收集到缓冲区中的命令, 通过 Reids 命令协议形式转发给 Slave,Slave 执行这些命令, 实现和 Master 的同步;
5. Master/Slave 此后会不断通过异步方式进行命令的同步, 达到最终数据的同步一致;
6. 需要注意的是 Master 和 Slave 之间一旦发生重连都会引发全量同步操作. 但在 2.8 之后, 也可能是部分同步操作.
2.8 开始, 当 Master 和 Slave 之间的连接断开之后, 他们之间可以采用持续复制处理方式代替采用全量同步.
Master 端为复制流维护一个内存缓冲区 (in-memory backlog), 记录最近发送的复制流命令; 同时, Master 和 Slave 之间都维护一个复制偏移量(replication offset) 和当前 Master 服务器 ID(Masterrun id).
当网络断开, Slave 尝试重连时:
a. 如果 MasterID 相同(即仍是断网前的 Master 服务器), 并且从断开时到当前时刻的历史命令依然在 Master 的内存缓冲区中存在, 则 Master 会将缺失的这段时间的所有命令发送给 Slave 执行, 然后复制工作就可以继续执行了;
b. 否则, 依然需要全量复制操作.
七, 读写分离:
Redis 支持读写分离, 而且使用简单, 只需在配置文件中把 Redis 读服务器和写服务器进行配置, 多个服务器使用逗号分开如下:
八, 水平动态扩展:
历时三年之久, 终于等来了期待已由的 Redis 3.0. 新版本主要是实现了 Cluster 的功能, 增删集群节点后会自动的进行数据迁移. 实现 Redis 集群在线重配置的核心就是将槽从一个节点移动到另一个节点的能力. 因为一个哈希槽实际上就是一些键的集合, 所以 Redis 集群在重哈希 (rehash) 时真正要做的, 就是将一些键从一个节点移动到另一个节点.
九, 数据淘汰策略:
Redis 内存数据集大小上升到一定大小的时候, 就会施行数据淘汰策略. Redis 提供 6 种数据淘汰策略:
volatile-lru: 从已设置过期时间的数据集 (server.db[i].expires) 中挑选最近最少使用的数据淘汰
volatile-ttl: 从已设置过期时间的数据集 (server.db[i].expires) 中挑选将要过期的数据淘汰
volatile-random: 从已设置过期时间的数据集 (server.db[i].expires) 中任意选择数据淘汰
allkeys-lru: 从数据集 (server.db[i].dict) 中挑选最近最少使用的数据淘汰
allkeys-random: 从数据集 (server.db[i].dict) 中任意选择数据淘汰
小编写的都是一些偏新手向的东西, 希望各位大咖见了不要笑话我, 作为一个菜鸟也希望能够帮到其他人, 毕竟入这一行着实需要不断学习和总结, 如果想进行深入的探讨欢迎来华为云社区论坛 https://support.huaweicloud.com/index.html?infodoc 发帖, 这里大咖云集, 也可以上华为云帮助中心, 里面的资料也是精心编写的干货. 感谢!
来源: http://www.bubuko.com/infodetail-3009422.html