点赞业务实现疑问redis+定时同步

各位,有个开发问题想请教一下。一个帖子点赞的实现,我看网上都是redis+定时同步到mysql较多,而且都不会考虑redis中是否已经有目标key,一上来直接在set中添加value。在真实开发中,这都不需要考虑吗?如果考虑的话,什么时候把key加载进redis中合适呢?这种key都不设置过期时间的吗?内存满了咋办?

redis有个命令incr直接将key的值+1,没有的话自动创建默认为0,不用考虑不存在的问题,存的就是一个值,占不了多少内存,定时把这个值更新到MySQL,可以每10秒一次、每分钟一次,或者其它任何频率,根据需要来。帖子存在这个key就不需要过期

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7430602
  • 这篇博客也不错, 你可以看下高薪程序员&面试题精讲系列116之如何保证Redis缓存与MySQL数据库的一致性?你遇到过哪些常见的缓存问题?什么是缓存雪崩?缓存穿透怎么解决?
  • 以下回答来自chatgpt:

    问题:

    如何在Redis中实现点赞功能以及处理内存满载问题?

    解决方案:

    1. 针对点赞功能的实现,可以使用Redis的Set数据结构来存储用户点赞的目标键(key)。每个用户点赞的目标键可以存储在一个Set中,利用Set的去重特性确保一个用户对同一个目标键只能点赞一次。

    ```python # 添加点赞 redis.sadd("likes:target_id", "user_id")

    # 移除点赞 redis.srem("likes:target_id", "user_id")

    # 获取点赞数 redis.scard("likes:target_id") ```

    1. 在实际的开发中,需要考虑Redis中是否已经存在目标键(key)。在进行点赞操作之前,可以先判断目标键是否存在于Redis中。如果键不存在,则可以将其添加到Redis中;如果键已经存在,则表示用户已经点赞过,可以给出相应的提示。

    python if not redis.exists("likes:target_id"): # 添加点赞 redis.sadd("likes:target_id", "user_id") else: # 用户已经点赞过 print("You have already liked this target")

    1. 可以选择为键(key)设置过期时间,防止无用的点赞数据长时间占用内存。设置合适的过期时间可以根据业务需求,比如每个点赞的键可以设置为一个小时后过期,这样可以保证点赞数据的实效性。

    python # 设置过期时间为1小时 redis.expire("likes:target_id", 3600)

    1. 处理内存满载问题可以采用多种方法,以下是一些常见的解决方案:

    2. 增加服务器的内存:如果当前服务器的内存不足以支持大量的点赞数据存储,可以考虑增加服务器的内存容量。

    3. 使用布隆过滤器过滤无效的点赞请求:通过布隆过滤器可以判断某个点赞的目标键是否一定不存在,如果确定不存在,则可以直接拒绝该点赞请求,减少对Redis的负载。

      python # 使用布隆过滤器判断目标键是否存在 if not bloom_filter.contains("target_id"): # 目标键一定不存在,拒绝点赞请求 print("Target does not exist") else: # 目标键可能存在,继续处理点赞请求 redis.sadd("likes:target_id", "user_id")

    4. 设置合理的缓存策略:可以通过设置适当的缓存策略,如LRU(最近最少使用)策略,根据Redis的内存使用情况淘汰不常访问的点赞数据,以减少内存的占用。

    5. 使用Redis集群或分片存储:将点赞数据分布在多个Redis实例中,可以均摊内存的压力,提高系统的并发处理能力。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^