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服务。

     

     

  • 相关阅读:
    ....
    CodeForces 375A(同余)
    POJ 2377 Bad Cowtractors (最小生成树)
    POJ 1258 AgriNet (最小生成树)
    HDU 1016 Prime Ring Problem(全排列)
    HDU 4460 Friend Chains(bfs)
    POJ 2236 Wireless Network(并查集)
    POJ 2100 Graveyard Design(尺取)
    POJ 2110 Mountain Walking(二分/bfs)
    CodeForces 1059B Forgery(模拟)
  • 原文地址:https://www.cnblogs.com/baoyi/p/redis.html
Copyright © 2011-2022 走看看