使用php将数组附加到Redis中的现有键

时间:2019-03-22 06:42:44

标签: php redis

我正在尝试使用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

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。 原来我使用了错误的数据结构,我应该使用List。 并使用Lpush和Lpop方法。

当客户端插入数据时,只需将数据推入列表即可。无需获取原始数据并拼接新数据。