Redis Cluster 模式
· 阅读需 22 分钟
引言
Redis Cluster 是 Redis 的分布式解决方案,它提供了一种在多个 Redis 节点间分配数据的方案。本文将深入探讨 Redis Cluster 的架构设计和核心机制,并对比其与主从模式、哨兵模式的区别。我们将从运行机制、节点发现机制、故障转移等方面进行详细分析,帮助读者理解 Redis Cluster 的设计思想和应用场景。
Redis Cluster 是 Redis 的分布式解决方案,它提供了一种在多个 Redis 节点间分配数据的方案。本文将深入探讨 Redis Cluster 的架构设计和核心机制,并对比其与主从模式、哨兵模式的区别。我们将从运行机制、节点发现机制、故障转移等方面进行详细分析,帮助读者理解 Redis Cluster 的设计思想和应用场景。
发现生产环境的业务报了好多错误, 涉及的 Node.js 代码是一个基于 Redis 的频率计数器,那部分逻辑大概是这样
// 查询并增加一次计数
async incr (id) {
const key = `${this.namespace}:${id}`
const now = getMicrotime()
const start = now - this.duration * 1000
const operations = [
['zremrangebyscore', key, 0, start],
['zcard', key],
['zadd', key, now, now],
['pexpire', key, this.duration]
]
const res = await this.redis.multi(operations).exec()
const count = toNumber(res[1][1])
return count
}
错误是:
Cannot read property '1' of undefined
It is in fact possible to listen to the "expired" type keyevent notification using a subscribed client to the specific channel ( and listening to its message event.
通过 subscribe client
可以监听 __keyevent@{db}__:expired
( db
是你传入的配置 ) 频道来接收过期的事件 ,
const redis = require('redis')
const CONF = {db:3}
let pub, sub
// Activate "notify-keyspace-events" for expired type events
pub = redis.createClient(CONF)
pub.send_command('config', ['set','notify-keyspace-events','Ex'], subscribeExpired)
// Subscribe to the "notify-keyspace-events" channel used for expired type events
function subscribeExpired(e, r){
sub = redis.createClient(CONF)
const expired_subKey = `__keyevent@${CONF.db}__:expired`
sub.subscribe(expired_subKey, function () {
console.log(' [i] Subscribed to "'+expired_subKey+'" event channel : '+r)
sub.on('message', function (chan, msg){
console.log('[expired]', msg)}
)
TestKey()
})
}
//例如,设置一个 key 并设置 10s 超时
function TestKey(){
pub.set('testing', 'redis notify-keyspace-events : expired')
pub.expire('testing', 10)
}
平时直接启动没问题,今天出了这个问题,启动失败,加上配置文件也不行。
D:\redis2.8>redis-server.exe
[8264] 08 Nov 09:28:43.943 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server.exe /path/to/redis.conf
[8264] 08 Nov 09:28:43.948 # Creating Server TCP listening socket *:6379: bind: No such file or directory
Redis 报错:
[6644] 02 Apr 23:11:58.976 # Creating Server TCP listening socket *:6379: bind: No such file or directory
的解决方案如下按顺序输入如下命令就可以连接成功
1. redis-cli.exe
2. shutdown
3. exit
4. redis-server.exe redis.windows.conf
之前的一篇文章说到了维护一个cookie池来降低500的概率。
在知乎上看到有人说只需要SNUID替换,其他的不影响。 所以我就写了一个SNUID的池,存储在redis中。
思路: