如何在Redis,Predis中获取相关数据?

时间:2016-02-15 13:35:30

标签: php redis predis

我正在使用 mysql 作为后端, redis 作为缓存服务器的web应用程序,我将记录存储在mysql数据库以及redis(使用predis库)中。

在从数据库中提取记录期间,首先检查密钥是否存在(主键,即id),如果"是"直接从redis获取数据,否则在数据库中获取数据。

假设数据库表是 帖子,评论。

在存储帖子数据,评论详细信息,使用帖子,评论表格存储相应数据时。

具有帖子表的外键的注释表名为 post_id

redis服务器,对帖子,评论和不同字段使用散列键(id)进行发帖,评论如 post_ {id} 发布, comment_ {id} ,使用所有帖子,所有评论设置中的 hset,sadd redis命令评论和存储值。

使用普通的sql查询很容易执行连接操作以获取相关数据。

是否有任何解决方案可以在redis或predis中获取相关数据?

2 个答案:

答案 0 :(得分:0)

您可以为相关数据使用前缀,例如group1_yourhashedkey,group2_yourhashedkey ...等。您无法在Redis上进行连接。 Redis是缓存服务器,而不是SQL服务器。

http://redis.io/commands/KEYS

我还建议不要使用sql中的主键作为键,因为你使用的是多个表,很可能,你会有重复的数字ID(特别是如果你使用自动增量表)。让md5拥有独特的东西。

答案 1 :(得分:0)

嗯,有很多方法可以在redis中“加入”,但是它们不值得努力。特别是当您使用redis作为代理缓存时:

  

在从数据库中获取记录时,首先检查密钥是否存在(主键,即id),如果“是”直接从redis获取数据,否则在数据库中查找数据。

您可能已经拥有以下功能:

function getDataByIds($table, $ids)

其中$ table是'posts'或'comments'等,$ id是搜索键。

快速启动(使用http://redis.io/commands/hmget进行加载,使用“SELECT * FROM commments WHERE id IN(1,2,3,4,..)”在一个查询中加载缺失的密钥,使用流水线进行设置在redis加载的密钥中)

然后只需手动加载外键:

$comments = getDataByIds('comments', $commentsIds);
$postsIds = array_column($comments,'post_id');
$posts = getDataByIds('posts', $postsIds); 
foreach($comments as &$comment) {
    $comment['post'] = $posts[$comment['post_id']];
};

如果您想加入服务器端,可以尝试:

http://redis.io/commands/SORT

SORT mylist BY weight_*->fieldname GET object_*->fieldname

或使用lua脚本。