1.一致性哈希分区

 

一致性哈希的目的就是为了在节点数目发生改变时尽可能少的迁移数据,将所有的存储节点排列在收尾相接的Hash环上,每个key在计算Hash 后会顺时针找到临接的存储节点存放。而当有节点加入或退 时,仅影响该节点在Hash环上顺时针相邻的后续节点。

 

优点

加入和删除节点只影响哈希环中顺时针方向的相邻的节点,对其他节点无影响。

 

缺点 

数据的分布和节点的位置有关,因为这些节点不是均匀的分布在哈希环上的,所以数据在进行存储时达不到均匀分布的效果。

 

虚拟槽分区

 

本质上还是第一种的普通哈希算法,把全部数据离散到指定数量的哈希槽中,把这些哈希槽按照节点数量进行了分区。这样因为哈希槽的数量的固定的,添加节点也不用把数据迁移到新的哈希槽,只要在节点之间互相迁移就可以了,即保证了数据分布的均匀性,又保证了在添加节点的时候不必迁移过多的数据。

Redis的集群模式使用的就是虚拟槽分区,一共有16383个槽位平均分布到节点上

 

 

2.redis 扩容

 

当新增节点时,将各节点分出一些插槽给新节点,将待迁移插槽放入, 迁出插槽列表中, 使用类似于scan的扫描,进行迁移,迁移过程中有新数据产生

如果有get命令,集群查本地的插槽,有返回,没有返回ask命令, 客户端通过ask再次请求新的节点,新节点有则返回,没有返回空

如果有set命令,节点强制将新key迁移到目标节点

 

 

 

3.为什么redis不是先记日志后响应请求?

redis有两种功能,一种是做持久化数据库,一种是做缓存,如果先记请求日志,因为文件io操作是阻塞的,影响redis的性能

 

 

4.redis使用场景:

最主要的是in-memory,高性能,分布式

1.服务端session一致等

2.分布式锁

3.布隆过滤器(hash缓存所有的有效数据),防止cc攻击

 

 

5.redis对比memcache有哪些优势

1.redis可以持久化

2.redis支持多种数据结构

3.redis服务端支持集群,不需要每个客户端自己做这个事, memcached 不支持主从

4.redis支持的最大value1G, memcahce支持的是1M

 

 

6.Redis有哪几种数据淘汰策略

1.volatile-lru  最近最少使用的有过期时间的键删除

2.volatile-ttl  快过期的先删除

3.volatile-random 随机删除有过期时间的key

4.allkey-lru

5.allkey-random

6.no-enviction(驱逐):禁止驱逐数据  不淘汰数据

 

 

7.redis集群方案

1.主从: 可以读写分离,提高集群的tps, 一般在从库上持久化

2.哨兵: 主节点down机,可以自动从从节点中选举主节点,提供服务

3.集群:多个主节点提供写服务,不同的主节点分配不同的插槽,保存key/value

 

 

8.Redis如何设置密码及验证密码

requirePass yourPass 设置密码

auth password 验证密码

 

9.说说Redis哈希槽的概念

hash槽16384个,虚拟节点,每个真实节点包含多个虚拟节点,当扩容缩容时,只需要迁移部分槽中的key,(扩容时,只需要迁移少部分数据,叫一致性hash)

 

10.Redis集群的主从复制模型是怎样的

从节点打开slaveof ip port ,设为某个节点的从库,第一次接入时,主库执行一次bgsave,将内存中的数据同步到从数据库,从节点成功rdb文件,然后解析rdb文件,恢复数据,这段时间内,产生的数据会放在缓冲区中

当从库同步完rdb文件后,会增量同步,缓冲区里的数据,如果缓存区设置太小,那么主节点再次bgsave影响主节点的响应

 

11.edis集群会有写操作丢失吗?为什么

会,同步日志都是异步的,当redis主机down的时候,写入是会丢失的

如果是rdb备份,是定时备份,上次备份到down机的时间内,写操作都丢失

aof备份有几个选项

appendonly no 需要打开

# appendfsync always

appendfsync everysec

# appendfsync no

 

 

11.Redis中的管道有什么用

将多个命令一起发到redis,减少网络延迟

 

12.怎么理解Redis事务?

redis事务三阶段:

 

    开启:以MULTI开始一个事务

    入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面

    执行:由EXEC命令触发事务

redis事务三大特性:

单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题

不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

 

13.Redis事务相关的命令有哪几个

multi  exec  discard取消  watch 监控 乐观锁,一致性

 

 

14.Redis如何做内存优化

1.对象共享:数字

2.压缩结构:编码优化

3.内存回收

 

 

 

 

分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。

分区的优势

 

    通过利用多台计算机内存的和值,允许我们构造更大的数据库。

    通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络带宽。

 

分区的不足

 

redis的一些特性在分区方面表现的不是很好:

 

    涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例上时,你就不能对这两个set执行交集操作。

    涉及多个key的redis事务不能使用。

    当使用分区时,数据处理较为复杂,比如你需要处理多个rdb/aof文件,并且从多个实例和主机备份持久化文件。

    增加或删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性。然而,一种叫做presharding的技术对此是有帮助的。

 

 

Redis常见性能问题和解决方案:

 

    Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件

    如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

    为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

    尽量避免在压力很大的主库上增加从库

 

 

COW技术原理(Copy On Write,写时复制)

在复制一个对象的时候并不是真正的把原先的对象复制到内存的另外一个位置上,而是在新对象的内存映射表中设置一个指针,指向源对象的位置,并把那块内存的Copy-On-Write位设置为1.

 

这样,在对新的对象执行读操作的时候,内存数据不发生任何变动,直接执行读操作;而在对新的对象执行写操作时,将真正的对象复制到新的内存地址中,并修改新对象的内存映射表指向这个新的位置,并在新的内存位置上执行写操作。

 

这个技术需要跟虚拟内存和分页同时使用,好处就是在执行复制操作时因为不是真正的内存复制,而只是建立了一个指针,因而大大提高效率。但这不是一直成立的,如果在复制新对象之后,大部分对象都还需要继续进行写操作会产生大量的分页错误,得不偿失。所以COW高效的情况只是在复制新对象之后,在一小部分的内存分页上进行写操作。

 

 

redis 持久化

RDB  AOF

RDB 默认的持久化方式 有save bgsave(cow  不阻塞的copy)  定时复制

save m n   m秒写入多少次,触发

aof 需要打开开关