用PHP配合Redis搞数组操作,感觉比想象中简单多了,phpredis也挺好用的
- 问答
- 2026-01-01 13:36:39
- 1
(来源:V2EX社区用户分享)那天我在V2EX上瞎逛,看到有个老哥发帖说用PHP操作Redis处理数组"比想象中简单多了",正好我手头项目需要缓存用户行为数据,就抱着试试看的心态研究了下phpredis扩展,结果这一用还真香!
我以前总觉得Redis是高端玩意儿,得记一堆命令行参数,但用phpredis之后发现,它就是把Redis命令直接包装成了PHP函数,比如你要存个数组,根本不用想复杂序列化,直接set('key', $array)就行,取的时候get('key')拿回来的就是原样数组,跟操作普通PHP变量几乎没区别。
(来源:实际项目经验)上周我做用户签到功能,需要存每个人最近30天的签到记录,要是用MySQL,得专门建表还要考虑并发问题,用Redis就简单多了——直接用一个哈希表存每个用户的签到数据,key是用户ID,field是日期,value是签到时间,代码写起来特别直观:

$redis->hSet('user_sign:123', '2024-06-15', '09:30'); $redis->hSet('user_sign:123', '2024-06-16', '10:05');
查某天是否签到更是简单到离谱:$redis->hExists('user_sign:123', '2024-06-15')直接返回true/false,统计当月签到天数?hLen('user_sign:123')一秒出结果,这种操作要是放数据库里,得写SQL还要担心性能,Redis直接内存计算搞定。

(来源:个人踩坑记录)最让我惊喜的是处理列表操作,比如消息队列场景,我原来用数组存待发送消息,PHP进程重启就全丢了,改用Redis的list之后,lPush()往里塞消息,rPop()取消息,就算服务器断电重启数据也在,还有自动过期功能——setex('key', 3600, $data)设置1小时过期,再也不用写cronjob清理缓存了。
不过也有坑:第一次用mSet()批量设置时,我傻乎乎地传了关联数组,结果报错半天才发现要传扁平数组,还有一次误用hGetAll()取超大哈希表,直接把内存撑爆,后来学乖了,大哈希都用hScan()分批取。

(来源:开源项目参考)看Laravel框架源码时发现个骚操作:用有序集合zSet做排行榜,比如用户积分榜: $redis->zAdd('leaderboard', 100, 'user1'); $redis->zAdd('leaderboard', 200, 'user2'); 查排名前10直接zRevRange('leaderboard', 0, 9),带分数查排名zScore('leaderboard', 'user1'),比用SQL的ORDER BY省心一百倍。
现在我做数据统计也离不开Redis了,比如统计页面UV,原来要写埋点插数据库,现在一个incr('page_view:20240615')搞定,实时统计在线用户?sAdd('online_users', $userId)往集合里扔就行,要查共同在线用户还能用sInter()求交集。
(来源:团队技术分享)同事还教我用Geo模块做附近的人功能——geoadd()存坐标,georadius()搜周边,十几行代码就实现了原来要接第三方SDK的功能,虽然精度不如专业地图服务,但对内部系统够用了。
说实话phpredis文档写得一般,但好在Redis命令和phpredis函数几乎一一对应,官方文档查不到时直接搜Redis命令就行,比如想给哈希表加过期时间,搜"Redis hash expire"会发现要用expire()命令,对应phpredis就是$redis->expire('key', 3600)。
现在项目里我已经把Session、队列、计数器、排行榜全迁到Redis了,虽然偶尔会遇到持久化问题(比如突然重启可能丢几分钟数据),但对大多数场景来说,用Redis操作数组和数据结构的便捷性,远远超过这点风险,要是你也在用PHP做数据密集型应用,真可以试试phpredis这把瑞士军刀。
本文由酒紫萱于2026-01-01发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/72479.html
