我正在尝试使用php将数组附加到redis中的现有键。
我现在正在做的是尝试首先获取键中的数组。如果该键不存在,则为该键设置一个二维数组。
如果键确实存在,请获取该键中的原始数组,然后将一个数组附加到原始数组中。然后将其放回该键。
我的问题是,当两个不同的客户端A和B同时添加新数组时,缺少某些数组。
我的猜测是,客户端A和B获得相同的原始数组,但A首先将其放回去。然后,B将它放回去,覆盖刚刚设置的记录Client A。
我的代码是:
$cache = new Redis();
$origin = $cache->getArray(self::CACHE_PREFIX . $uid);
if(is_array($origin) && count($origin) > 0){
array_push($origin, $arr);
$master = $origin;
}else{
$master = [$arr];
}
$cache->setArray(self::CACHE_PREFIX . $uid, $master);
我应该怎么做才能做到这一点?
编辑:
这是日志
2019-03-22 11:57:45 1553227065.3247 ORIGINfalse //Client A operate, the key is not exist
2019-03-22 11:57:45 1553227065.326 MASTER[{"sids":["759"],"to":"7223","status":1,"type":"notice"}] //Client A insert an new array
2019-03-22 11:57:45 1553227065.3402 ORIGIN[{"sids":["759"],"to":"7223","status":1,"type":"notice"}] //Client A operate
2019-03-22 11:57:45 1553227065.3402 ORIGIN[{"sids":["759"],"to":"7223","status":1,"type":"notice"}] //Client B operate
2019-03-22 11:57:45 1553227065.3411 MASTER[{"sids":["759"],"to":"7223","status":1,"type":"notice"},{"sids":["764"],"to":"7223","status":1,"type":"notice"}] //Client A append an new array
2019-03-22 11:57:45 1553227065.3413 MASTER[{"sids":["759"],"to":"7223","status":1,"type":"notice"},{"sids":["760"],"to":"7223","status":1,"type":"notice"}] //Client B also append an new array ,and overwrite Client A's data
答案 0 :(得分:0)
我解决了这个问题。 原来我使用了错误的数据结构,我应该使用List。 并使用Lpush和Lpop方法。
当客户端插入数据时,只需将数据推入列表即可。无需获取原始数据并拼接新数据。