如果我在几分钟内对存储在键上的值执行了数百万次hincrby
操作,并同时获取显示它的值,那么我是否需要了解任何竞争条件?此外,hincrby
命令会在扩展时自动排队吗?
基本上我正在设置并获取一个全局计数器,用于我的应用程序中的高频率事件(每秒数百个事件,每秒导致数百个set和get命令)。
答案 0 :(得分:1)
Redis命令以原子方式执行,并且 NO 竞争条件。
Redis非常快,每秒可能需要数千次快速操作(例如HINCRBY
)。所以我认为在你的场景中(即每秒数百次操作),你不需要担心性能。另外,为什么不进行基准测试:)
答案 1 :(得分:0)
为避免在流量较高时颠簸Redis服务器,一个选项是让您的应用限制其写入Redis的速率。您的应用服务器可以保留自己的内部计数器,并且只能以已知的间隔(例如,每10秒)将其总计持久保存到Redis。
我的意思的简单代码示例:
var mycounter = 0;
// maintain internal counter
var increment = function() {
mycounter++;
};
// only write to Redis once every ten seconds
setInterval(function() {
var val = mycounter;
if (val > 0) {
mycounter = 0;
redisclient.hincrby("mykey", "counter", val);
}
}, 10000);
计算永远无法达到Redis的风险,但至少Redis写入率是已知数量。