zoukankan      html  css  js  c++  java
  • Redis学习笔记

    1. redis的数据类型

    字符串

    list(链表)

    set(集合)

    zset(有序集合)

    hash(哈希)

    2. redis 持久化机制

    RDB  调用调用save 和 配置文件中配置save

    rdbcompression yes #当导出到 .rdb 数据库时是否用LZF压缩字符串对象

    rdbchecksum yes #版本5的RDB有一个CRC64算法的校验和放在了文件的最后。这将使文件格式更加可靠。

    dbfilename dump-master.rdb #持久化数据库的文件名

     

    AOF 在配置文件中将 appendonly no 设置为yes。

    appendfilename "appendonly.aof" #aof文件名

    3. Redis主从复制

    原理:master会记录一组数据,replication Id,offset,当slave使用PSYNC命令向master发送自己的版本信息的时候,master会计算与slave之间的偏移量,并将缓冲区中的数据偏移量同步到slave。

    避免slave被清空的办法:1. master做持久化 2. master故障后,立即选slave做master。

    4. 哨兵

    从Redis宕机 恢复后自动完成同步

    主Redis宕机 1. 在数据库中执行 SLAVEOF NO ONE命令,断开主从关系并且提升为主库继续服务 2. 将主库重启后执行SLAVEOF命令,将其设置为从库,自动更新数据回来。

    哨兵的作用:1. 监控,2. 提醒,3. 自动故障迁移,

    多个哨兵,不仅同时监控主从数据库,而且哨兵之间互为监控

    5. 哨兵原理

    每个sentinel实例启动后,都会和已知的slaves/master以及其他的sentinels建立TCP连接,周期性的发送PING(默认为1s)来判断server的状态。

    SDOWN 主观失效 不可用

    ODOWN 客户失效 

    在交互中,如果redis-server无法在”down-after-milliseconds”时间内响应或者响应错误信息,都会被认为此redis-server处于SDOWN状态.

    SDOWN的server为master,那么此时sentinel实例将会向其他sentinel间歇性(一秒)发送”is-master-down-by-addr <ip> <port>”指令并获取响应信息,如果足够多的sentinel实例检测到master处于SDOWN,那么此时当前sentinel实例标记master为ODOWN…其他sentinel实例做同样的交互操作.配置项”sentinel monitor <mastername><masterip> <masterport> <quorum>”,如果检测到master处于SDOWN状态的slave个数达到<quorum>,那么此时此sentinel实例将会认为master处于ODOWN.

     

    每个sentinel实例将会间歇性(10秒)向master和slaves发送”INFO”指令,如果master失效且没有新master选出时,每1秒发送一次”INFO”;”INFO”的主要目的就是获取并确认当前集群环境中slaves和master的存活情况.

    经过上述过程后,所有的sentinel对master失效达成一致后,开始failover.

    Sentinel与slaves”自动发现”机制:

    在sentinel的配置文件中,都指定了port,此port就是sentinel实例侦听其他sentinel实例建立链接的端口.在集群稳定后,最终会每个sentinel实例之间都会建立一个tcp链接,此链接中发送”PING”以及类似于”is-master-down-by-addr”指令集,可用用来检测其他sentinel实例的有效性以及”ODOWN”和”failover”过程中信息的交互.在sentinel之间建立连接之前,sentinel将会尽力和配置文件中指定的master建立连接.sentinel与master的连接中的通信主要是基于pub/sub来发布和接收信息,发布的信息内容包括当前sentinel实例的侦听端口.

     

    redis错误信息:

    Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: READONLY You can't write against a read only slave.] with root cause
    io.lettuce.core.RedisCommandExecutionException: READONLY You can't write against a read only slave.
    at io.lettuce.core.protocol.AsyncCommand.completeResult(AsyncCommand.java:118)
    at io.lettuce.core.protocol.AsyncCommand.complete(AsyncCommand.java:109)
    at io.lettuce.core.protocol.CommandWrapper.complete(CommandWrapper.java:57)
    at io.lettuce.core.protocol.CommandHandler.complete(CommandHandler.java:601)
    at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:559)
    at io.lettuce.core.protocol.CommandHandler.channelRead(CommandHandler.java:511)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
    at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
    at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:545)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:499)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:886)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:748)

    解决方案:

    修改redis.conf中的slave-read-only为no,重启redis服务。

     

     

  • 相关阅读:
    编译原理第一次作业
    【码制】关于原码,反码,补码的一些笔记和理解
    输出1到50以内的所有素数【C】
    方法和数组
    if条件判断和switch,for do while
    变量
    全选,删除,添加
    java基础
    二级联
    轮播图
  • 原文地址:https://www.cnblogs.com/baoyi/p/redis.html
Copyright © 2011-2022 走看看