在redis中维护全局计数器的缺点

时间:2016-11-27 23:21:50

标签: redis

如果我在几分钟内对存储在键上的值执行了数百万次hincrby操作,并同时获取显示它的值,那么我是否需要了解任何竞争条件?此外,hincrby命令会在扩展时自动排队吗?

基本上我正在设置并获取一个全局计数器,用于我的应用程序中的高频率事件(每秒数百个事件,每秒导致数百个set和get命令)。

2 个答案:

答案 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写入率是已知数量。