美文网首页
redis3.x版本启动失败解决

redis3.x版本启动失败解决

作者: 明明就_c565 | 来源:发表于2022-07-26 10:11 被阅读0次

    原因分析

    由于高版本setex写入值参数和低版本写入值参数有变化,故高低版本无法兼容

    解决办法

    1,更换低版本2.x

    卸载

    yum remove redis

    安装

    rpm -ivh redis.xxx.rpm

    删除dump文件

    rm -rf /var/lib/redis/dump.rdb

    删除dump文件原因分析:

    redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)。在redis服务重启的过程中,redis会自动加载dump.rdb文件以恢复上一次的状态,由于rdb文件版本高于redis服务器版本,导致rdb文件读取失败,服务无法启动,需要删除该文件

    2,更换api入参

    从报错来看入参不对

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

    setex()

    大意就是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 的顺序反了。

    参考

    https://www.cnblogs.com/lucky-heng/p/11135287.html

    https://blog.csdn.net/zhangle_1025/article/details/109714147

    相关文章

      网友评论

          本文标题:redis3.x版本启动失败解决

          本文链接:https://www.haomeiwen.com/subject/awasvltx.html