NodeJS的Redis(五)

280 阅读2分钟

这是我参与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节点