Redis深入学习(三)

109 阅读1分钟

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

七、redis的集群

根据分区规则,比如哈希算法,我们把数据放到不同的redis服务器中。

具体实现cluster-enabled : true \ cluster-config-file

多个master,然后每个master又有自己的slave。

在这里插入图片描述

八、Zset实现原理

ZSET(SORTED SET)在redis中的编码可以是ziplist或者是skiplist

  • 跳表的原理skiplist

    参考视频:www.bilibili.com/video/BV1LJ…www.bilibili.com/video/BV18J… 两个非常好的skiplist原理讲解,这方面视频很少。

    skiplist的java实现:blog.csdn.net/bohu83/arti…

    
      public Integer insert(int key, int value) {
        	SkipListEntry p, q;
            int i = 0;
     
            // 查找适合插入的位子
            p = findEntry(key);
     
            // 如果跳跃表中存在含有key值的节点,则进行value的修改操作即可完成
            if(p.key ==key) {
                Integer oldValue = p.value;
                p.value = value;
                return oldValue;
            }
     
         // 如果跳跃表中不存在含有key值的节点,则进行新增操作
            q = new SkipListEntry(key, value); 
          
         q.left = p;
         q.right = p.right;
         p.right.left = q;
         p.right = q;
     
           //本层操作完毕,看更高层操作
         //抛硬币随机决定是否上层插入
         while ( r.nextDouble() < 0.5 /* Coin toss */ )
         {
        	 if ( i >= h )   // We reached the top level !!!
             {
                //Create a new empty TOP layer
        		 addEmptyLevel();
             }
        	 /* ------------------------------------
             Find first element with an UP-link
             ------------------------------------ */
    	      while ( p.up == null )
    	      {
    	         p = p.left;
    	      }
          /* --------------------------------
    	   Make p point to this UP element
    	   -------------------------------- */
              p = p.up;
     
    	/* ---------------------------------------------------
              Add one more (k,*) to the column
    	   Schema for making the linkage:
                   p <--> e(k,*) <--> p.right
                             ^
    		          |
    		          v
    		          q
    	   ---------------------------------------------------- */
      	SkipListEntry e;
      	 // 这里需要注意的是除底层节点之外的节点对象是不需要value值的
      	e = new SkipListEntry(key, null); 
      	/* ---------------------------------------
    	   Initialize links of e
    	   --------------------------------------- */
    	e.left = p;
    	e.right = p.right;
    	e.down = q;
    	/* ---------------------------------------
    	   Change the neighboring links..  
    	   --------------------------------------- */
    	p.right.left = e;
    	p.right = e;
    	q.up = e;
        
    	//把q执行新插入的节点:
    	 q = e; 
    	 // level增加
    	 i = i + 1;  
    	
        	 
         }
        n = n+1; //更新链表长度        
            return null;
    

    redis的skiplist参考文章:blog.csdn.net/weixin_3800…

    跳表跳表的查找插入都是logN复杂度。