問題描述
今天在使用python的redis客戶端時碰到了這樣的報錯:redis.exceptions.ResponseError: value is not an integer or out of range,是在使用setex函數時出的問題。
問題分析
明明在我的開發環境上跑的好好着,怎么到測試環境就有問題了?然后試着看了下我的開發環境和測試環境的redis客戶端版本,一個是2.x,一個是3.x,測試環境的redis客戶端是新安裝的,那就把3.x卸了裝個2.x吧,再跑的就ok了,看來是版本差異。本着將問題追蹤到底的宗旨,去PyPI上找redis客戶端的更新文檔,一般這種在使用上出現了較大差異的都是大版本更新,直接找到3.0的更新文檔,看到了下面這樣的說明。
大意就是3.0的客戶端已經廢棄了Redis這個類,將之前的StrictRedis類改名為Redis,這樣在使用SETEX方法時,參數的順序已經變了(name, time, value),不再是之前的(name, value,time),那么Redis這個類和StrictRedis類有什么區別呢?如下:
StrictRedis:用於實現大部分官方的命令,並使用官方的語法和命令(比如,SET命令對應與StrictRedis.set方法)
Redis:是StrictRedis的子類,用於向后兼容舊版本的redis-py。
簡單的說,官方推薦使用StrictRedis類,不推薦Redis類,原因是他和咱們在redis-cli操作有些不一樣,主要不一樣是下面這三個方面。
1、LREM:參數 'num' 和 'value' 的順序交換了一下,cli是 lrem queueName 0 'string' , 這里的0時所有的意思, 但是Redis這個類,把0和string的位置調換了;
2、ZADD:實現時 score 和 value 的順序不小心弄反了,后來有人用了,就這樣了;
3、SETEX:time 和 value 的順序反了。
解決方法
所以解決辦法就有兩種,第一種,按照3.x中的規定修改setex函數的參數順序,第二種,換回2.x,當然還是推薦第一種辦法。