2017-07-31 594 views
0

我打算使用Redis作为我的PHP API的第二类数据库(Predis for PHP & Redis连接),我的主数据库是MySQL。我对它很陌生,我想知道我是否正确,或者我完全错误。正确的方法来更新Redis中的LIST/SET上的特定记录

我将使用Redis进行所有“SELECT”或Retrieval查询,而不是从MySQL获取它。以下是示例流程。

我有一个用户在其他表上有多个记录(1:很多)。 TableA包含所有用户,TableB包含所有用户的所有体验记录。

**TableA** 
UserID - 1234 
UserID - 4567 
UserID - 7890 

------------------------------------------------------- 


**TableB** 
ExperienceID - 1 | UserID - 1234 | Experience - Waiter 
ExperienceID - 2 | UserID - 1234 | Experience - Chef 
ExperienceID - 3 | UserID - 4567 | Experience - Developer 
ExperienceID - 4 | UserID - 4567 | Experience - Technician 
ExperienceID - 5 | UserID - 4567 | Experience - Support 
ExperienceID - 6 | UserID - 7890 | Experience - Engineer 
ExperienceID - 7 | UserID - 7890 | Experience - Engineer 
ExperienceID - 8 | UserID - 7890 | Experience - Draftsman 
  • 保存在MySQL的新经验,一旦成功,这将推动Redis的相同的经历(在Redis的格式)。
  • 获取/ Retreive从Redis的,而不是MySQL的
  • 更新关于MySQL的经验,所有的记录,一旦成功,将更新Redis的具体经验--->我不知道如何做到这一点对Redis的无循环它在PHP这不是好主意,如果我有记录 :(巨大的名单

这是我在Redis的布局。

uid:1234:experience 
uid:4567:experience 
uid:7890:experience 

里面的记录体验的命名空间的

我用SADD使用JSON编码的数据设置

$userExperience1 = array(
    'id'   => 1, 
    'user_id'  => 1234, 
    'experience' => 'Waiter' 
); 

$userExperience2 = array(
    'id'   => 2, 
    'user_id'  => 1234, 
    'experience' => 'Chef' 
); 


$redis->sadd('uid:' . $userId . ':experience', json_encode($userExperience1)); 
$redis->sadd('uid:' . $userId . ':experience', json_encode($userExperience2)); 

我使用LIST

$redis->rpush('uid:' . $userId . ':experience', json_encode($userExperience1)); 
$redis->rpush('uid:' . $userId . ':experience', json_encode($userExperience2)); 

也试过,但我不知道正确的方式来对Redis的更新特定的记录,比如我想仅更新用户1234的“服务员”体验。

任何暗示或建议?多谢你们。

回答

1

对于集合,您没有其他选项,只是遍历应用程序级别的集合。

通过列表,您可以使用单个对象,只需要将列表中的项目标识映射到体验标识。事情是这样的:

$listId = $redis->rpush('uid:' . $userId . ':experience', json_encode($userExperience1)); 
$redis->set('eid:' . $userExperience1['id'] . ':listId', $listId); 

所以更新很简单:

$listId = $redis->get('eid:' . $newUserExperience['id'] . ':listId', $listId); 
$redis->lset('uid:' . $userId . ':experience', $listId - 1, json_encode($newUserExperience)); 

但你需要,如果你从列表中删除任何经验,以保持地图的同步格外小心。

+0

很酷。谢谢@Alex Blex。这是一个好方法。 $ redis-> lset('uid:'。$ userId。':experience',$ listId - 1,json_encode($ newUserExperience));我把“-1”得到正确的索引。对于删除,你认为它更好地做软删除?或者你有关于如何删除列表中的特定记录的建议。 – jamcoder

+1

谢谢,更新了答案。是的,软删除是最简单的方法。如果你有很多,你可能需要在删除经验的某个阈值后重新加载。 –

+0

明白了。我会做软删除的方法。谢谢@Alex Blex。 – jamcoder

相关问题