redis集群的常見面試題
1) 簡單說一下你對分布式理解?
答:一個業務分拆多個子業務,部署在不同的服務器上實現相同的業務就是分布式若是一個字節業務點垮了 那么整個項目將無法運行
2) 簡單說一下你對集群理解?
為了解決大型網站的訪問量大、並發量高、海量數據的問題 和對分布式的問題進行解決的一個方案 將幾台服務器集中在一起,實現同一業務,多個處理相同功能的服務器集合。若一台服務器垮了,其它的服務器可以頂上來。
3) 說一下分布式和集群聯系和區別
區別:集群是相當於一個存儲數據的地方 而分布式就是就是一直工作的方式
相似點 就是集群只要布置在不同的服務器上或者不同的機器上就可以稱為集群
分布式一個程序運行在不同的機器上就可以稱為分布式
聯系:集群可能運行在一個或多個分布式系統,也可能根本沒有運行分布式系統;分布式系統可能運行在一個集群上,也可能運行在不屬於一個集群的多台(2台也算多台)機器上。
4) redis集群方式有哪些?
三種方式:
- 主從復制
① 支持主從復制,主機會自動將數據同步到從機,可以進行讀寫分離
缺點:
- Redis不具備自動容錯和恢復功能,主機從機的宕機都會導致前端部分讀寫請求失 敗,需要等待機器重啟或者手動切換前端的IP才能恢復。
- 主機宕機,宕機前有部分數據未能及時同步到從機,切換IP后還會引入數據不一致的問題,降低了系統的可用性
- Redis較難支持在線擴容,在集群容量達到上限時在線擴容會變得很復雜。
- 哨兵模式:
① 監控主服務器和從服務器是否正常運行。
② 主服務器出現故障時自動將從服務器轉換為主服務器。
③ 主從可以自動切換,系統更健壯,可用性更高。
缺點:
1.Redis較難支持在線擴容,在集群容量達到上限時在線擴容會變得很復雜。
5)簡單說一下redis-cluster里面槽?
槽是存放數據,存放是要通過key計算槽位,選擇對應的服務器來存儲,獲取也是同樣的算法.
默認16384個槽位要均勻分布到主節點上面
為了槽里面數據安全要對主節點進行1-N從節點備份
6)簡單說一下redis-cluster里面選舉投票機制
所有主節點都參與投票,默認半數以上掛點,啟動容錯機制,提升從節點為主節點.
7)怎么通過命令連接redis集群 -c
8)怎么通過jedis連接集群
1.通過代碼
@Testpublic void testJedisCluster() throws Exception {
//創建一連接,JedisCluster對象,在系統中是單例存在
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("127.0.0.1", 7001));
nodes.add(new HostAndPort("127.0.0.1", 7002));
nodes.add(new HostAndPort("127.0.0.1", 7003));
nodes.add(new HostAndPort("127.0.0.1", 7004));
nodes.add(new HostAndPort("127.0.0.1", 7005));
nodes.add(new HostAndPort("127.0.0.1", 7006));
JedisCluster cluster = new JedisCluster(nodes);
//執行JedisCluster對象中的方法,方法和redis一一對應。
cluster.set("cluster-test", "my jedis cluster test");
String result = cluster.get("cluster-test");
System.out.println(result);
//程序結束時需要關閉JedisCluster對象 cluster.close();
}
2.通過spring(ioc控制反轉)
配置XML
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg index="0">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.101.3"></constructor-arg>
<constructor-arg index="1" value="7001"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.101.3"></constructor-arg>
<constructor-arg index="1" value="7002"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.101.3"></constructor-arg>
<constructor-arg index="1" value="7003"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.101.3"></constructor-arg>
<constructor-arg index="1" value="7004"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.101.3"></constructor-arg>
<constructor-arg index="1" value="7005"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="192.168.101.3"></constructor-arg>
<constructor-arg index="1" value="7006"></constructor-arg>
</bean>
</set>
</constructor-arg>
<constructor-arg index="1" ref="jedisPoolConfig"></constructor-arg></bean>
測試代碼:
private ApplicationContext applicationContext;
@Before
public void init() {
applicationContext = new ClassPathXmlApplicationContext(
"classpath:applicationContext.xml");
}
// redis集群 @Test
public void testJedisCluster() {
JedisCluster jedisCluster = (JedisCluster) applicationContext
.getBean("jedisCluster");
jedisCluster.set("name", "zhangsan");
String value = jedisCluster.get("name");
System.out.println(value);
}