如何保证缓存数据的同步性
发布于 8 年前 作者 im-here 5727 次浏览 来自 问答

用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肯定是不行的。

incr decr 比较靠谱

@blackjack 但是实际业务中不不只是就等级一个数据,还有别的一些数据。就是我4楼回答的。

最佳方案是维护一个 queue

redis是单线程的 用原子操作 不会有问题

回到顶部