Redis知识整理(二)

如何保证redis中的数据都是热点数据?

Redis中的数据集大小上升到一定大小的时候哦就会进行淘汰来释放空间存放新的数据。

Redis提供了以下几种淘汰策略:

volatile-lru:根据LRU算法删除设置了超时属性(expire)的键,直

到腾出足够空间为止。如果没有可删除的键对象,回退到noeviction策略。

volatile-ttl:根据键值对象的ttl属性,删除最近将要过期数据。如果

没有,回退到noeviction策略。

volatile-random:随机删除过期键,直到腾出足够空间为止。

allkeys-lru:根据LRU算法删除键,不管数据有没有设置超时属性,

直到腾出足够空间为止。

allkeys-random:随机删除所有键,直到腾出足够空间为止。

noenviction:默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端误信息(error) OOM command not allowed when uesd memory,此时redis只响应读命令。

 

内存溢出控制策略可以采用config set maxmemory-policy{policy}动态配置。Redis支持丰富的内存溢出应对策略,可以根据实际需求灵活定制,比如当设置volatile-lru策略时,保证具有过期属性的键可以根据LRU剔除,而未设置超时的键可以永久保留。还可以采用allkeys-lru策略把Redis变为纯缓存服务器使用。当Redis因为内存溢出删除键时,可以通过执行info stats命令查看evicted_keys指标找出当前Redis服务器已剔除的键数量。每次Redis执行命令时如果设置了maxmemory参数,都会尝试执行回收

内存操作。当Redis一直工作在内存溢出(used_memory>maxmemory)的状态下且设置非noeviction策略时,会频繁地触发回收内存的操作,影响Redis服务器的性能。如果当前Redis有从节点,回收内存操作对应的删除命令会同步到从节点,导致写放大的问题。建议线上Redis内存工作在maxmemory>used_memory状态下,避免频繁内存回收开销。对于需要收缩Redis内存的场景,可以通过调小maxmemory来实现快速回收。此操作会导致数据丢失和短暂的阻塞问题,一般在缓存场景下使用。

 

查看Redis使用情况和状态信息使用什么命令?

info

Redis集群怎么做,集群方案有哪些?

1.twemproxy,大概概念是,它类似于一个代理方式,使用方法和普通redis无任何区别,设置好它下属的多个redis实例后,使用时在本需要连接redis的地方改为连接twemproxy,它会以一个代理的身份接收请求并使用一致性hash算法,将请求转接到具体redis,将结果再返回twemproxy。使用方式简便(相对redis只需修改连接端口),对旧项目扩展的首选。 问题:twemproxy自身单端口实例的压力,使用一致性hash后,对redis节点数量改变时候的计算值的改变,数据无法自动移动到新的节点。

2.codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 节点数量改变情况下,旧节点数据可恢复到新hash节点。

3.redis cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。具体看官方文档介绍。

4.在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key 进行hash计算,然后去对应的redis实例操作数据。 这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。

Redis集群节点最多可以有多少个?

16384个

什么情况下会导致redis集群不可用?

  1. 如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态.

注意:redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

2.如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

注意:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

参考博客:https://blog.csdn.net/itcastcn/article/details/78995426

Redis集群怎么选择数据库?

无法选择,数据默认保存在编号为0的库里

Redis哈希槽的概念?

Redis有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放在哪个槽,集群中每个节点负责一部分的hash槽。

Redis集群的主从复制原理

主库master和从库slave的复制分为全量复制和增量复制:

全量复制:全量复制一般发生在slave初始化阶段,此时slave需要将master上的所有数据都复制一份,具体步骤如下:

1. 从库连接到主库,并发送一条SYNC命令;

2. 主库接收到SYNC命令后,开始执行BGSAVE命令生成RDB快照文件,并使用缓冲区记录此后执行的所有写命令;

3. 主库执行完BGSAVE之后,将快照文件发送到所有从库,在此期间,仍继续将所有写命令记录到缓冲区;

4. 从库在接收到快照文件后,丢弃所有旧数据,载入快照文件中的新数据;

5. 主库继续向从库发送缓冲区中的写命令;

6. 从库将快照文件中的数据载入完毕后,继续接收主库发送的缓冲区中的写命令,并执行这些写命令以更新数据。

完成上面的步骤之后,从库可以开始接收来自用户的读数据请求。

 

增量复制:增量复制是指,在slave初始化完成后的工作阶段,主库将新发生的写命令同步到从库的过程。主库每执行一条写命令,都会向从库发送相同的写命令,从库会执行这些写命令。

总结:主库和从库初次建立连接时,进行全量复制;全量复制结束后,进行增量复制。但是当增量复制不成功时,需要发起全量复制。

参考博客:https://blog.csdn.net/xiangwanpeng/article/details/54632928

Redis集群之间是如何复制的?

异步复制

Redis集群会有写操作丢失吗?为什么?

Redsi集群并不能保证强一致性,所以在特定环境下可能会导致数据丢失。

主要可能会有以下几个原因:

第一:异步复制中断或异常。

第二:在一个网络分区中,客户端与少数实例隔离。

第三:master选举异常导致整个集群停止接受写操作。

猜你喜欢

转载自blog.csdn.net/Let_me_tell_you/article/details/81638975