「这是我参与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复杂度。