zoukankan      html  css  js  c++  java
  • redis 那些事儿

    1 我的数据存入redis了但是怎么不见了?

     redis的内存使用是有限的,一直向redis中写入数据(如果配置了allkeyLRU)就会触发内存淘汰机制,将最近没有访问过的的key,value删除掉。

    2 数据设置了过期时间,到时间以后内存仍然看不到明显被释放呢?

     redis如果key设置了过期时间,清除算法是 “随机淘汰机制”+“被动删除机制”;当redis有一批key到达了过期时间,则会随机抽样删除一部分key,但是很多key会在你访问的时候去校验,如果过期则直接删除给你返回空值。这样做大大提升了redis的性能,否则加入几十万个key同时国企,redis又要完全主动删除则会非常消耗cpu!!!

    3 redis为什么性能这么好

    1)基于内存的数据存储;

    2)单线程内存模型,相比多线程会省去很多并发处理的内部逻辑,从而提高了效率‘

    3)多路复用机制,数据插入时由带有Looper监控的异步队列处理机制控制,并发性极好

    4)采用RESP协议,实现容易,解析速度快,而且可读性很高。

    4 redis的主从复制原理

    1)redis主从同步是基于RDB的快照进行的,当发生数据同步时,master节点会fork出子进程来进行dump.rdb的生成,如果配置了无磁盘化的操作时则将rdb直接发送给slave节点,并不会将dump.rdb放在本地一份;salve收到dump.rdb数据以后会落地磁盘然后将数据加载到内存。

    2)那么redis2.8以后也支持断点续传,重启后任然可以根据offset继续发送数据。

    5 reids“集群脑裂”和“异步复制”丢失数据问题:

    (1)如果master写入数据后直接挂掉,slave还没来得及同步数据。

    (2)脑裂:1个master,2个slave节点,如果master突然出现网络分区那么剩余的两个slave节点就会从中选举出一个节点作为master。这个时候集群中就会出现两个master,而这时有可能client还没有指向到新的master;而被分区的master恢复正常以后重新以slave身份加入集群会清除掉自己的数据,然后重新同步新的master数据,在这里会丢失数据。

    解决办法:
    配置参数min-slaves-to-write:1 master至少有1个slave节点挂接否则将拒绝客户端写入。
    配置参数min-slaves-max-lag:10 如果master异步复制到slave的节点数据ack超过10秒,则master拒绝客户端写入

    这样配合设置能够保证最多只丢失10秒的数据;当master拒绝后,客户端无法链接时jedis提供了mapcache机制,暂时保存数据,等到切换master成功后会将数据发送过去。

    6 redis的savecheck检查点

    - 5分钟 1个key变化就复制一份

    - 1分钟100个key变化就复制一份

    - 1秒钟1000key变化就复制一份

  • 相关阅读:
    linux设备模型
    dma
    POSIX thread
    Network: IP QoS
    TCP: sliding window of flow control
    TCPIP: UDP/TCP checksum
    Hebrew: Learning Resources
    Vivado: Uninstall Vivado on ubuntu/linux
    HLS: vivado_hls compile fail, csim and csyn error, no ip generated for udpLoopback and toe
    HLS: High-Level Synthesis Operators
  • 原文地址:https://www.cnblogs.com/zzq-include/p/11076365.html
Copyright © 2011-2022 走看看