问题
在使用predis包的时候,使用redis的ZPOPMAX命令,发现报错了,错误提醒如下:
Predis\ClientException: Command 'ZPOPMAX' is not a registered Redis command
背景
在PHP的日常开发中,在使用redis的时候 我们常用的redis包有两个,一个是predis/predis,另一个是phpredis/phpredis。
这两者的区别简单来说就是 phpredis/phpredis包是用c写的php的高效扩展,而predis是用php代码写的。
Laravel 官方原来是推荐使用 PRedis 的,因为纯 PHP 实现的原因,只需要 Composer 即可安装,非常符合 Laravel 便捷的思想。但现在由于 PRedis 这个插件好久都没有维护了,因此从 Laravel6 开始官方推荐推荐使用 phpredis 来代替 PRedis。
问题定位
经过对predis的源码进行调试,发现predis包里,predis/src/Profile/目录下存储了一系列的redisversion文件,里面记录了redis在对应版本及其以下版本中redis的命令,并且在通过predis包执行redis命令时,会对使用的redis命令进行校验,确认使用的命令是否在这个命令集合中存在,如果不存在则抛出上述异常。