如何保证缓存数据的同步性
用redis做缓存,假如我缓存里有一个数据用来记录公会里所有成员总等级之和,有玩家加入,总等级加上对应玩家的等级,有玩家退出,减去对应玩家的等级。 现在的问题是:如果多个玩家同时退出或加入的时候,会导致缓存数据脏读。 这个怎么保证不脏读呢?或者是 我这设计有问题?
10 回复
可以用一个变量来控制,确保同一时刻只有一个修改。
var processing = false;
var change = function(val) {
if (!processing) {
processing = true;
// 操作redis,在回调里修改processing=false
}
setTimeout(function() {
change(val);
}, 20);
};
@huangshaohui 好像可行,但这样的话,如果同一时间修改的请求太多,后面的请求都会等待了。
不知道你怎么设计的,可以尝试incr decr 这些命令都是原子操作的,即使是同时操作也是有先后顺序 From Noder
@yunheli 就是有一张公会表,公会表里存了一个总等级,就是所有成员的等级之和。 因为公会表还有别的数据,incr decr肯定是不行的。
pub sub
incr decr 比较靠谱
@blackjack 但是实际业务中不不只是就等级一个数据,还有别的一些数据。就是我4楼回答的。
测试
最佳方案是维护一个 queue
redis是单线程的 用原子操作 不会有问题