redis集群的常见面试题

Posted 1999wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis集群的常见面试题相关的知识,希望对你有一定的参考价值。

                redis集群的常见面试题

 

1) 简单说一下你对分布式理解?

答:一个业务分拆多个子业务,部署在不同的服务器上实现相同的业务就是分布式若是一个字节业务点垮了 那么整个项目将无法运行

2) 简单说一下你对集群理解?

为了解决大型网站的访问量大、并发量高、海量数据的问题  和对分布式的问题进行解决的一个方案   将几台服务器集中在一起,实现同一业务,多个处理相同功能的服务器集合。若一台服务器垮了,其它的服务器可以顶上来。

 

3) 说一下分布式和集群联系和区别

区别:集群是相当于一个存储数据的地方  而分布式就是就是一直工作的方式

相似点 就是集群只要布置在不同的服务器上或者不同的机器上就可以称为集群

分布式一个程序运行在不同的机器上就可以称为分布式

联系:集群可能运行一个或多个分布式系统,也可能根本没有运行分布式系统;分布式系统可能运行在一个集群上,也可能运行在不属于一个集群的多台(2台也算多台)机器上。

 

4) redis集群方式有哪些?

三种方式:

  1. 主从复制

① 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离

缺点:

  1. Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失 败,需要等待机器重启或者手动切换前端的IP才能恢复。
  2. 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性
  3. Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
  4. 哨兵模式:

① 监控主服务器和从服务器是否正常运行。

② 主服务器出现故障时自动将从服务器转换为主服务器。

③ 主从可以自动切换,系统更健壮,可用性更高。

缺点:

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);

    }

以上是关于redis集群的常见面试题的主要内容,如果未能解决你的问题,请参考以下文章

面经 | Redis常见面试题

面经 | Redis常见面试题

Java中的常见面试题

Mybatis 的常见面试题

vuex的常见面试题

TCP协议的常见面试题