0

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

在从数据库中获取记录的过程中,首先检查redis中是否存在key(主键即id),如果是,则直接从redis获取数据,否则访问数据库获取数据。

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

在存储帖子的数据期间,评论详细信息,使用的帖子,评论表用于存储相应的数据。

具有名为post_id的 post 表的外键的评论表

redis 服务器上,对帖子、评论和帖子使用不同字段的哈希键 (id) ,评论如post_{id}用于帖子,comment_{id}用于评论和使用hset 存储的值,在所有帖子中添加 redis 命令,所有评论套。

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

有没有在 redis 或 predis 中获取相关数据的解决方案?

4

2 回答 2

0

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

http://redis.io/commands/KEYS

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

于 2016-02-15T14:01:44.013 回答
0

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

在从数据库中获取记录的过程中,首先检查redis中是否存在key(主键即id),如果是,则直接从redis获取数据,否则访问数据库获取数据。

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

function getDataByIds($table, $ids)

其中 $table 是“posts”或“comments”等,$ids 是搜索键。

使其快速(使用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 脚本。

于 2016-02-15T19:16:22.837 回答