問題描述python
今天在使用python的redis客戶端時碰到了這樣的報錯:redis.exceptions.ResponseError: value is not an integer or out of range,是在使用setex函數時出的問題。redis
問題分析函數
明明在個人開發環境上跑的好好着,怎麼到測試環境就有問題了?而後試着看了下個人開發環境和測試環境的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類有什麼區別呢?以下:spa
StrictRedis:用於實現大部分官方的命令,並使用官方的語法和命令(好比,SET命令對應與StrictRedis.set方法)blog
Redis:是StrictRedis的子類,用於向後兼容舊版本的redis-py。開發
簡單的說,官方推薦使用StrictRedis類,不推薦Redis類,緣由是他和我們在redis-cli操做有些不同,主要不同是下面這三個方面。rem
一、LREM:參數 'num' 和 'value' 的順序交換了一下,cli是 lrem queueName 0 'string' , 這裏的0時全部的意思, 可是Redis這個類,把0和string的位置調換了;文檔
二、ZADD:實現時 score 和 value 的順序不當心弄反了,後來有人用了,就這樣了;string
三、SETEX:time 和 value 的順序反了。
解決方法
因此解決辦法就有兩種,第一種,按照3.x中的規定修改setex函數的參數順序,第二種,換回2.x,固然仍是推薦第一種辦法。