redis使用非常简单,好像一个map。但是面试总是要造火箭的,如果只满足于get、set方法,技术得不到提升,当然也拿不到高薪。大家都是来赚钱的,一样的加班,一样的苦逼,何不多拿点呢。当同事和你一样加班,他拿20k你拿30k是不是很爽?反之就是他爽。
最近的面试中经常问到redis的集群方案。当然了微服务时代,没有谁能逃得过集群。
- cluster是redis自带的集群方案,它引入了哈希槽(slot),数据和哈希槽关联,哈希槽和redis关联。 下面是官网对它的描述:
Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:
节点 A 包含 0 到 5500号哈希槽.
节点 B 包含5501 到 11000 号哈希槽.
节点 C 包含11001 到 16384号哈希槽.
这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上. 如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.
- Redis 集群的主从复制模型
为了高可用,集群使用主从复制。一主多从。
就像官网上提供的A、B、C节点,如果A挂了,那哈希槽就少了0-5500节点,导致集群失效。所以就出现了它们的备胎A1、B1、C1。那么整个集群就有3个master和3个slave。这样A节点失败后,集群会选出A1成为master。整个集群就可以继续服务,当然为了以防万一,可以多几个slave。当然A、A1都挂了只能认栽,集群不可用。
注意:master复制数据到slave是异步的,也就是A的数据复制到A1是异步的,有可能A挂的时候,数据还没来得及同步给A1,当A1成为master的时候就丢数据了。如果要保证强一致性,需要用同步的方式,牺牲性能。