首页 > 解决方案 > 如何使用 redis 缓存用户的喜欢和收藏?

问题描述

假设我需要做用户喜欢缓存,因为在短时间内可能有很多用户点击喜欢按钮或不喜欢按钮。

我的想法是创建一个 mysql 表,其中包含 user_id、liked_object_id、liked_object_type、create_time 和(user_id、liked_object_id、like_object_type)字段作为复合键。当用户点击like按钮时,向表中插入一条记录,当用户取消like时,从表中删除该行。此 mysql 表用于持久化数据。

然后把redis放进去,当用户点击like按钮时,先在redis数据库中添加一个hash对象,然后把那个hash对象的key放到一个叫“cached_keys”的集合中,这样我就可以更容易地抓取这些hash对象了。如果用户取消喜欢,则取消的哈希对象的键从“cached_keys”移动到另一个名为“deleted_keys”的集合,所有取消的喜欢的键都在其中。我这样做的原因是我可以跟踪添加了哪个喜欢的对象或者当我在一段时间后将redis中的所有数据写回mysql表时删除。除了坚持到mysql,我只查询和写入redis。

还有其他问题。点赞查询某一类对象和一个用户的所有点赞。为了做到这一点,我需要创建许多redis集合,其中命名空间是object_type和user_id的组合,并将所有相应的object_id存储在集合中,并与“cached_keys”和“deleted_keys”等其他集合一起修改它们。另一个类似的情况是查询所有喜欢某个对象的用户。

另一个问题是连接查询。由于数据缓存在redis中,因此很难对mysql的likes表进行分页连接查询,例如查询一个对象列表,按它的like count排序。我必须将所有对象从 mysql 获取到内存中,然后从 redis 中获取喜欢计数并对它们进行排序,然后对结果进行分页。如果我想查询某个用户喜欢的一种类型的对象,我必须从 redis 中获取所有键并使用“IN”。

这样做感觉不是正确的方法。每次持久化发生时,它都会一次将所有记录写入数据库,感觉它不能很好地扩展,以及连接查询。

我该如何改善这一点,或者我应该以完全不同的方式来做呢?非常感谢。

标签: mysqlredis

解决方案


推荐阅读