redis报错: redis.exceptions.ResponseError: value is not an integer or out of range

问题描述

今天在使用python Django引用redis时碰到了这样的报错:redis.exceptions.ResponseError: value is not an integer or out of range,是在使用setex函数时出的问题。

问题分析

明明在我的另一个项目的环境上跑的好好着,怎么换了一个环境就有问题了?然后试着看了下我两个环境的redis客户端版本,一个是2.x,一个是3.x,3.x版本的出现了这样的问题,那就把3.x卸了装个2.x吧,再跑的就ok了,看来是版本差异。对比发现,3.0的客户端已经废弃了Redis这个类,将之前的StrictRedis类改名为Redis,这样在使用SETEX方法时,参数的顺序已经变了(name, time, value),不再是之前的(name, value,time)。

解决问题

第一种,按照3.x中的规定修改setex函数的参数顺序。在3.x redis包中的client.py下,把参数顺序改为:

name, value, time

第二种,换回2.x。

第三种,重写方法,在settings.py中加入

def newsetex(self, name, value, time):
    """
    Set the value of key ``name`` to ``value`` that expires in ``time``
    seconds. ``time`` can be represented by an integer or a Python
    timedelta object.
    """
    if isinstance(time, datetime.timedelta):
        time = int(time.total_seconds())
    return self.execute_command('SETEX', name, time, value)

Redis.setex = newsetex

 

posted @ 2021-01-06 10:25  Bert-H  阅读(1020)  评论(0)    收藏  举报