1.redis的槽是什么?
Redis Cluster中有一个16384长度的槽的概念,他们的编号为0、1、2、3……16382、16383。这个槽是一个虚拟的槽,并不是真正存在的。
2.redis的槽有什么用?
缓存 对于高访问量的网站,缓存是提高性能的重要手段。使用Redis槽技术可以将数据分散到不同节点上,减轻单节点的负载压力,提高缓存的并发和可用性。
解决存储能力问题:搭建分片集群,利用插槽机制实现动态扩容
3.redis的一个槽可以存储多少key?
摘自Redis官网的Data type章节,意思是内存允许的情况下,可以存超过40亿数据
Redis以slot(槽)作为数据存储单元,每个槽中可以存储N多个键值对。Redis中固定具有16384个槽。理论上可以实现一个槽是一个Redis。
4.如果redis的一个节点只有一个槽,那么16个库的数据怎么存?
数据存到哪个槽上,和库没关系,根据key的hash值算出数据应该存储在哪个槽上
5.redis的槽在集群中是怎么分配的?
5.redis的list有过期时间吗?
在用redis的list的时候,发现没有可以以设置过期时间的push方法。
最后采取了用expire设置的方法,也可以达到定时删除的目的。
jedis.rpush("list", "a");jedis.rpush("list", "b");jedis.rpush("list", "c");jedis.expire("list", 10);//设置过期时间为10秒
6.redis cluster哈希槽数量能改变吗?
不能,因为代码算法写死了,固定是2的14次方这个数字上,作者自己有过分析
原因是因为需要把所有的槽放到心跳包里面便于让节点知道当前的全部信息。16348=16k,用bitmap来压缩心跳包的话,就相当于使用2*8*10=2KB大小的心跳包。而如果用crc16算法(redis使用这个而不是用哈希一致性算法)来确定哈希槽的分配。他的最大值是是2的16次方。用上面的算法换算需要8KB的心跳包来传输,作者自己认为这样不划算。而一个redis节点一般不会有超过1000个master(这个是作者自己说的),用16k来划分是比较合适的
7.redis集群数据存储原理
在redis cluster中,如果想要存入一个key-value,
这个key首先会通过CRC16算法(和16384取余),
结果会对应上0-16383之间的哈希槽(hash slot)
最后,redis cluster会将key-value放置在对应的哈希槽中。
8.redis集群数据获取原理
当client向redis cluster中的任意一个节点发送与数据库key有关的命令时,
接收命令的节点会计算出要处理的key属于哪个哈希槽(hash slot),
并且先检查这个hash slot是否属于自己(管辖):
如果key所在的槽正好属于自己(管辖),节点会直接执行这个key相关命令。
如果key所在的槽不属于自己(管辖),那么节点会给client返回一个MOVED错误,
指引client转向负责对应槽的节点,并客户端需要再次发送想要执行的和key相关的命令。
9.redis不要直接修改AOF配置
会造成数据丢失。
原因:
如果redis目前在停止运行状态,我们想打开AOF,把设置修改为了yes,那么,在启动redis时,会优先加载AOF文件,由于文件是空的,所以什么数据也没有加载到,然后我们用shutdown停止了redis,由于用shutdown命令会触发RDB备份,所以备份文件将会被覆盖,备份数据会丢失,造成严重后果。
解决办法:
先对RDB文件进行备份,然后在redis运行时,用命令打开AOF,redis会把二进制文件放到AOF文件中,然后再把配置文件中的AOF配置改为yes,这样做是因为命令修改只是临时的。
10.IO多路复用
redis是单线程的,使用IO多路复用,因为命令执行耗时可以忽略不计,主要用时是数据的IO,所以,可以在数据IO时,开启多个线程进行读写。