0

0

如何在ThinkPHP中利用Redis实现点赞排行榜_Zset有序集合与自增指令结合

P粉602998670

P粉602998670

发布时间:2026-03-18 05:57:24

|

563人浏览过

|

来源于php中文网

原创

应使用ZINCRBY而非INCR实现点赞排序:以articleId为member、变化量为score存入zset;查榜用ZREVRANGE WITHSCORES;防重复点赞需Lua原子脚本;空榜单须设空标记防穿透。

如何在thinkphp中利用redis实现点赞排行榜_zset有序集合与自增指令结合

点赞时用 ZINCRBY 而不是 INCR

ThinkPHP 本身不封装 Redis 的 Zset 操作,直接调用底层连接更可靠。很多人误以为给用户点赞就是对某个 key 做 INCR,结果发现排序失效——因为 INCR 只能存单个数值,没法按分数自动排序。

真正该用的是 ZINCRBY:它把「用户ID」当 member、「点赞数变化量」当 score,写入一个 zset,天然支持按分数升序/降序查榜。

  • 场景:用户 A 点赞文章 B,需增加文章 B 在排行榜中的分数
  • 操作:$redis->zIncrBy('rank:article', 1, $articleId)
  • 注意:$articleId 必须是字符串(如 '123'),整型可能被截断或类型转换异常
  • 别漏掉 key 前缀(如 rank:article),否则多个业务混在一起会互相干扰

查榜必须用 ZREVRANGE + WITHSCORES

默认 ZRANGE 是从小到大排,点赞榜要“最多点赞在前”,得用 ZREVRANGE。而且只取 ID 不够,得同时拿到分数做展示,否则前端还得挨个查分,IO 浪费严重。

  • 正确写法:$redis->zRevRange('rank:article', 0, 9, ['WITHSCORES' => true])
  • 返回是关联数组:['123' => '45', '456' => '32', ...],键是 articleId,值是当前总分
  • 如果用 ZRANGE,你会拿到点赞最少的几条,和预期完全相反
  • 别在 PHP 层手动 sort —— Redis 已排序,再 sort 是纯 CPU 白耗

去重点赞得靠 ZSCORE 判断 + 事务控制

同一个用户反复点同一文章,不能重复加分。但 Redis zset 本身不阻止重复 ZINCRBY,它只是累加。所以得先查当前 score,再决定是否执行加分。

提客AI提词器
提客AI提词器

「直播、录课」智能AI提词,搭配抖音直播伴侣、腾讯会议、钉钉、飞书、录课等软件等任意软件。

下载

立即学习PHP免费学习笔记(深入)”;

  • 错误做法:先 ZSCOREZINCRBY,中间可能被并发请求插队
  • 稳妥做法:用 Lua 脚本原子执行(ThinkPHP 的 eval 方法)
  • 示例脚本:if redis.call("zscore", KEYS[1], ARGV[1]) == false then return redis.call("zincrby", KEYS[1], 1, ARGV[1]) else return 0 end
  • 调用:$redis->eval($script, ['rank:article'], [$articleId])
  • 返回 0 表示已点过,非 0 是新加分后的总分

缓存穿透风险:空榜单不能直接返回 null

如果某类文章还没人点赞,ZREVRANGE 返回空数组。这时候如果业务逻辑没兜底,前端可能报错或空白。更麻烦的是,攻击者故意刷大量不存在的 $articleId,每次都会穿透到 Redis 查询空结果,压垮后端。

  • 简单防御:查完为空时,往 Redis 写个空标记(如 empty:rank:article:999,过期 1 分钟)
  • 别用空字符串或 0 做默认值——它们可能是合法分数,无法区分真假
  • ThinkPHP 中可统一包装查询方法,在 zRevRange 后加一层空值判断和缓存写入
  • 注意:Zset 本身不支持设置空成员,所以这个兜底必须额外用 string 类型 key 实现

zset 的 score 是浮点数,精度问题、负分场景、超大排行榜的分页性能——这些都在真实压测里才露出来,别只在本地跑通就认为没问题。

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

387

2024.04.10

thinkphp性能怎么样
thinkphp性能怎么样

thinkphp 是一款高性能的 php 框架,具备缓存机制、代码优化、并行处理和数据库优化等优势。官方性能测试显示,它每秒可处理超过 10,000 个请求,实际应用中被广泛用于京东商城、携程网等大型网站和企业系统。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

362

2024.04.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1091

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

256

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1154

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

848

2023.08.22

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

410

2023.09.04

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

17

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号