使用Redis实现点赞功能的核心是利用其高性能的ZSET数据结构。点赞操作:ZINCRBY key 1 user_id,查询点赞数:ZCARD key 或 ZSCORE key user_id。简单高效,支持百万级并发点赞无压力!
点赞计数实现
在Redis中,使用Sorted Set(ZSET)存储点赞数据,每个帖子一个key,如"like:post:123",member是用户ID,score是1。点赞时ZINCRBY like:post:123 1 user123,取消点赞ZINCRBY like:post:123 -1 user123。查询总点赞数ZCARD like:post:123,判断用户是否点赞ZSCORE like:post:123 user123 > 0。
高效查询用户点赞列表
要获取用户点赞过的帖子列表,可以用另一个ZSET,key为"liked_by:user123",member为post_id,score为点赞时间戳。点赞时ZADD liked_by:user123 timestamp post123。用户首页可显示最近点赞内容ZRANGE liked_by:user123 0 9 WITHSCORES。
防止重复点赞
使用Redis的原子操作ZSCORE检查用户是否已点赞,如果score存在则返回已点赞,否则ZINCRBY。整个过程单次命令组合用Lua脚本确保原子性:if redis.call('ZSCORE', KEYS[1], ARGV[1]) then return 1 else redis.call('ZINCRBY', KEYS[1], 1, ARGV[1]) return 0 end
分布式点赞计数
多实例Redis用Redisson或Codis集群,点赞key用一致性哈希分片。聚合计数时,从所有分片ZCARD求和。实际生产中,点赞数用最终一致性,异步聚合到MySQL。
点赞排行榜
全局点赞排行:ZSET key="post_like_rank",score=点赞数,member=post_id。每点赞ZINCRBY更新后ZREVRANGE 0 9显示Top10帖子,实时热榜超级吸引人!
性能优化
设置key过期时间EXPIRE 点赞key 30天,减少内存占用。热点key用本地缓存或读写分离。QPS测试:单机Redis轻松10w+点赞/秒,社交App点赞飞起。
FAQ
Q: 点赞数怎么持久化到数据库?
A: 点赞操作只写Redis,每5分钟异步任务统计ZCOUNT写入MySQL,业务查询优先Redis兜底MySQL。
Q: 如何处理点赞作弊?
A: 结合用户行为风控,ZSCORE检查重复,Lua脚本原子防刷,加IP/设备限频。
Q: 大V帖子点赞多怎么办?
A: 热点隔离,用proxy分流或本地缓存点赞数,ZSET只存用户列表。
Q: 取消点赞怎么实现?
A: ZINCRBY key -1 user_id,如果score<=0则ZREM key user_id,确保准确。