我正在使用 mysql 作为后端, redis 作为缓存服务器的web应用程序,我将记录存储在mysql数据库以及redis(使用predis库)中。
在从数据库中提取记录期间,首先检查密钥是否存在(主键,即id),如果"是"直接从redis获取数据,否则在数据库中获取数据。
假设数据库表是 帖子,评论。
在存储帖子数据,评论详细信息,使用帖子,评论表格存储相应数据时。
具有帖子表的外键的注释表名为 post_id
在 redis服务器,对帖子,评论和不同字段使用散列键(id)进行发帖,评论如 post_ {id} 发布, comment_ {id} ,使用所有帖子,所有评论设置中的 hset,sadd redis命令评论和存储值。
使用普通的sql查询很容易执行连接操作以获取相关数据。
是否有任何解决方案可以在redis或predis中获取相关数据?
答案 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']];
};
如果您想加入服务器端,可以尝试:
SORT mylist BY weight_*->fieldname GET object_*->fieldname
或使用lua脚本。