CNode

如何保证缓存数据的同步性

问答
Iim-here发布于10 年前最后回复10 年前10 回复6629 浏览0 收藏

用redis做缓存,假如我缓存里有一个数据用来记录公会里所有成员总等级之和,有玩家加入,总等级加上对应玩家的等级,有玩家退出,减去对应玩家的等级。 现在的问题是:如果多个玩家同时退出或加入的时候,会导致缓存数据脏读。 这个怎么保证不脏读呢?或者是 我这设计有问题?

查看回复

回复 (10)

H
huangshaohui#1·10 年前

可以用一个变量来控制,确保同一时刻只有一个修改。

var processing = false;

var change = function(val) {
    if (!processing) {
	    processing = true;
		// 操作redis,在回调里修改processing=false
	}
	
	setTimeout(function() {
	    change(val);
	}, 20);
};
I
im-here#2·10 年前
引用 huangshaohui可以用一个变量来控制,确保同一时刻只有一个修改。

@huangshaohui 好像可行,但这样的话,如果同一时间修改的请求太多,后面的请求都会等待了。

Y
yunheli#3·10 年前

不知道你怎么设计的,可以尝试incr decr 这些命令都是原子操作的,即使是同时操作也是有先后顺序 From Noder

I
im-here#4·10 年前
引用 yunheli不知道你怎么设计的,可以尝试incr decr 这些命令都是原子操作的,即使是同时操作也是有先后顺序 From Noder

@yunheli 就是有一张公会表,公会表里存了一个总等级,就是所有成员的等级之和。 因为公会表还有别的数据,incr decr肯定是不行的。

V
vincent1853#5·10 年前

测试

M
MiguelValentine#6·10 年前

最佳方案是维护一个 queue

K
kentkwan#7·10 年前

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

T
TimothyJin#8·10 年前

pub sub

B
blackjack#9·10 年前

incr decr 比较靠谱

I
im-here#10·10 年前
引用 blackjackincr decr 比较靠谱

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

参与回复
登录后即可参与回复。登录