这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战
Redis订阅发布模式
Redis的订阅发布模式可使用list + redis的订阅发布模式构建类似kafka的消息推送队列;
// Redis提供了信道,信道是数据传递机制,提供了发布/预定功能
let sub = redis.createClient(6379, '127.0.0.1'); // 监听消费者
let pub = redis.createClient(6379, '127.0.0.1'); // 生产者
// 在sub开始监听时允许触发subscribe事件进行操作,类似连接数据库的connect事件
sub.on('subscribe', function(channel, count) {
console.log(`${channel}:${count}`); // test channel:1
pub.publish('test channel', 'channel message test')
})
sub.on('message', function(channel, message) {
console.log(`${channel}-message:${JSON.stringify(message)}`) // test channel-message:"channel message test"
})
sub.subscribe('test channel');
Monitor的事件对整个redis的所有客户端操作进行监听
const redis = require('redis');
const client = redis.createClient( 6379, '127.0.0.1');
client.monitor(function(err, res) {
console.log(res); // ok
})
client.on("monitor", function (time, args) {
console.log(time + ": " + args); // 1556285641.395573: [ 'lindex', 'myset', '2' ]
});
Redis 分区
分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。
1. 范围分区
- 定义: 将不同范围的对象映射到不同Redis实例。
- 缺点: 建立一张表存储数据到redis实例的映射关系,维护并且需要为每一类对象建立映射关系
2. 散列分区
将键名称转换为一个数字,对转换后的散列值进行取模,以产生一个数字,使这个key映射到Redis实例当中
3. 分区的优势
- Redis使用所有机器的内存,管理更大的内存。如果没有分区,只能使用一台机器的内存。
- 增加Redis的计算能力成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。
4.分区的不足
Redis的一些特性在分区方面表现的不是很好:
- 涉及多个key的redis事务不能使用。
- 当使用分区时,数据处理较为复杂。
- 增加或删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力
5.不同的分区实现方案
- 客户端分区:客户端决定在哪个redis节点读取
- 代理分区:客户端将请求发送给代理,代理决定在哪个redis节点读写数据
- 查询路由:客户端随机地请求任意redis实例,Redis请求转发给正确的Redis节点