使用Sorted Set存储评论,按时间戳score排序,zrangebyscore快速分页查询。高并发一致性用Lua脚本原子操作增量点赞,结合MySQL主从+Redis缓存双写一致,最终一致性通过binlog订阅异步修复。查询效率用Redis Pipeline批量操作,热点评论预热缓存,过期时间设置阶梯式避免雪崩。
来源1
评论数据模型:用户评论用Hash存储,key为"comment:user:{user_id}:{comment_id}",field存内容、时间等。评论列表用Sorted Set,key为"comment_list:article:{article_id}",member为comment_id,score为时间戳倒序。高并发下,点赞用INCR原子命令,Lua脚本防止超卖:if redis.call('GET',KEYS[1]) <= 0 then return 0 end; redis.call('DECR',KEYS[1]); return 1。数据一致性:写Redis+异步写MySQL,读Redis兜底MySQL, canal监听binlog同步Redis。
来源2
Redis存储评论列表采用ZSET,score=time*-1实现时间倒序。用户评论详情用Hash。分页查询zrevrangebyscore 0 9223372036854775807 withscores limit offset count。高并发点赞用Pipeline批量HINCRBY。多级缓存:L1 Redis评论列表,L2 MySQL。双写一致:先写MySQL后Redis,失败回滚用MQ补偿。查询效率:布隆过滤器防穿透,随机过期时间防雪崩。
来源3
评论存储:List适合顺序追加,但分页差,用ZSET member=comment_id:reply_id score=timestamp。回复评论用ZSET嵌套。点赞用String INCR "like:{comment_id}"。高并发:Lua脚本原子扣库存 if(tonumber(redis.call('get', KEYS[1])) <= 0) then return 0 end redis.call('decr', KEYS[1])。一致性:Redis+DB最终一致,写DB发MQ,consumer更新Redis。查询:热点数据local cache,穿透用setnx互斥锁。
来源4
采用Redis ZSet存储评论ID列表,按时间score排序,实现高效分页。高并发下点赞用HINCRBYFIELD原子命令。数据一致性方案:1.先写MySQL后写Redis,Redis失败忽略最终一致;2.使用分布式锁Lua脚本确保原子性。查询效率:预聚合评论统计到Redis Hash,Pipeline批量加载用户详情,减少RTT。
来源5
评论存储结构:zset:article:{aid}:comments score=-time member=cid。详情hash:comment:{cid}。高并发点赞:redis.call('HINCRBY','like:cid','uid',1) in Lua。一致性:TCC模式,先Try Redis占位,Commit/ Cancel同步MySQL。查询:用SCAN渐进式遍历大key,zrangebyscorebyscore高效范围查询。
来源6
用zset存评论排序,score为时间戳。回复链用zset score层级+时间。高并发:pipeline提交多命令减网络。缓存一致:延迟双删,先删Redis再操作DB 1s后删Redis。查询优化:只缓存前N页,深页从DB查。
FAQ
Q: Redis评论分页怎么实现?
A: 用ZSET zrevrange 0 20 limit 0 20,按score时间倒序。
Q: 点赞高并发怎么防重复?
A: Lua脚本检查HSETNX已赞再INCR。
Q: 数据丢失怎么处理?
A: Redis AOF持久化+MySQL主库备份。
Q: 大量评论key太多怎么优化?
A: 分片到多个zset,如按时间分月key。