- 博客(114)
- 资源 (2)
- 收藏
- 关注
原创 reids(六)集群
集群节点槽重新分片ASK错误集群中每个主服务器被称节点,然后将16384个槽分配给所有的节点。每个槽里面有多个key值。为什么是16384个槽不是其他的个数?(https://www.phpyuan.com/282515.html)心跳包文包含这个节点所有的配置,16k的槽需要2k的空间,65k大概需要8k的空间集群中主节点基本不会超过1000个,每个节点分到的槽位不会太少配置信息根据...
2019-02-25 14:49:10 244
原创 reids(五)sentinel哨兵
哨兵高可用命令连接和订阅连接连接发送信息的频率和作用判断是否下线主观下线客观下线选举领头sentinel(当主服务器客观下线后)故障转移高可用sentinel 哨兵就是 特殊的redis服务器。因为他里面保存着的对象是其他服务器的信息,被设计出来就是为了高可用性。下面会以各种角度来分析高可用性。命令连接和订阅连接通过上面的3张图,我们可以看到sentinel分别会对主服务器、从服务...
2019-02-25 02:48:16 294
原创 reids(四)多机数据库复制
复制同步旧版本(sync)命令传播旧复制功能的缺陷复制(psync)复制的实现这里主要涉及到了主从复制的问题。复制主要涉及到2个功能:同步和命令传播同步旧版本(sync)步骤:从服务器发送sync命令给主服务器主服务器发送rdb文件给从服务器并将缓冲区的所以写命令都发给从服务器命令传播需要主服务器发送命令给从服务器,他们的数据才会保存一致性。旧复制功能的缺陷在...
2019-02-25 01:24:04 242
原创 redis(三)RDB持久化和AOF持久化
RDB和AOFRDBsave和bgsavesavebgsave自动间隔保存AOFAOF写入与同步AOF文件的载入与数据还原AOF的重写与实现RDBsave和bgsavesavesave会对进程进行阻塞,直到RDB文件创建完毕。阻塞后redis不会接受任何请求。bgsave和save不同的是,bgsave是进程会fork一个子进程,这样主进程不会被阻塞,可以正常的服务。但是bgsave的...
2019-02-25 00:40:49 204
原创 redis(二)单机数据库
数据库数据库结构数据库键空间设置键的过期时间过期键删除策略AOF和RDB复制功能对过期键的处理RDBAOF复制数据库结构redis服务器会默认设置16个数据库,多机形式的话,会只使用每个redis服务的第一个数据库。数据库键空间redisDb就是16个中的一个,然后他里面的dict指针指向数据的键。设置键的过期时间redis> SET key valueredis> ...
2019-02-24 22:36:36 198
原创 分布式(六)—— raft算法
raft前角色介绍leader(主)follower (从)candidate (候选人)过程选举日志复制正常环境下(网络没有被分区)网络分区前raft是paxos的简化,同样是有拜占庭问题演化而来。http://thesecretlivesofdata.com/raft/ raft动画演示角色介绍将网络中的服务器看成节点。leader(主)所有的写操作都是通过主来控制的。foll...
2019-02-24 21:22:33 256
原创 redis(一)对象
对象字符串对象列表对象哈希对象集合对象有序集合对象redis 是一个非关系类型的数据库。里面的数据都是以键值对(key-value)形式来保存的。值的总类一共有5种:字符串对象、列表对象、哈希对象、集合对象、有序集合对象。typeof struct redisObejct { // 对象的类型 unsigned type:4; // 对象的编码 unsigned encoding:4...
2019-02-23 23:53:35 148
原创 分布式(五)——zk客户端
客户端组件一次会话创建的过程初始化会话创建回应处理上图就是客户端初始化,并与zk服务端创建连接的过程。组件ClientWatchManagerZookeeperClientCnxnHostProvider一次会话创建的过程初始化初始化Zookeeper对象,设置默认的Watcher。初始化HostProvider初始化ClientCnxn,同时他会实例化里面的两个线程...
2019-02-20 23:48:52 196
原创 剑指offer35——第一个只出现一次的字符
思路:hash表,第一次遍历先是进行hash并计算次数,第二次遍历char数组找出次数只有1的第一个字符。static Character getChar(char[] data) { HashMap<Character, Integer> hash = new HashMap<>(); for (char datum : data) { ...
2019-02-19 12:49:29 126
原创 剑指offer36——数组中的逆序对
思路:{7,5,6,4}={7,5},{7,4},{7,6},{5,4},{6,4}暴力的话,时间复杂度为o(n^2)这里可以使用归并的思想class Offer36 { static int count; static void sort(int[] data, int start, int end) { if (start < end) { ...
2019-02-19 12:30:48 179
原创 剑指offer37——两个链表的第一个公共结点
思路:将两个链表push进两个栈内,同时pop,如果节点不想等了,那上一个节点就是第一个公共节点。static Node getFirstNode(Node root1, Node root2) { Stack<Node> stack1 = new Stack<>(); Stack<Node> stack2 = new Stack<&g...
2019-02-19 11:51:04 130
原创 剑指offer34——丑数
思路:以丑数来算出丑数。static int getUglyNum4k(int k) { int[] num = new int[k + 1]; num[0] = 1; int numIndex = 1; int num2Index = 0; int num3Index = 0; int num5Index = 0; while (num...
2019-02-19 02:13:47 139
原创 剑指offer33——把数组排成最小的数
思路:数字转字符串,字符串比较的规则是,两个字符串合并成一个,ab 和 ba,比较两个字符串static String getMinNum(int[] data) { String[] list = new String[data.length]; for (int i = 0; i &lt; data.length; i++) { list[i] = Integ...
2019-02-18 15:19:28 155
原创 剑指offer32——从1到n整数中1出现的次数
思路:https://blog.csdn.net/yi_afly/article/details/52012593static int getNum4k(int n, int k) { if (n<k) return 0; int count = 0; int round = n; int base = 1; while (roun...
2019-02-18 14:55:53 145
原创 剑指offer30——最小的k个数
思路:先调整成小顶堆,再每次取堆顶 // 小顶堆 static void adjust(int[] data, int index, int size) { int child; for (; (2 * index + 1) < size; index = child) { child = 2 * index + 1; if (c...
2019-02-18 13:46:18 128
原创 剑指offer29——数组中出现次数超过一半的数字
关键字:超过一半思路:思路一:借助辅助内存,java使用hashMap将数字作为key,出现的次数作为value,统计完,最后遍历hashMap,得到value>data.length/2,就是那个数字。思路二: 使用快排的思路找到中位数思路三:其他的数字与超过一半的数字相抵,最后剩下的就是次数超过一半的数字 static int getNum(int[] data) throw...
2019-02-18 12:32:30 149
原创 剑指offer28——字符串的排序
思路:八皇后,回溯递归static void print(char[] data, int index) { if (index == data.length) System.out.println(Arrays.toString(data)); for (int i = index; i < data.length; i++) { cha...
2019-02-17 15:34:34 150
原创 剑指offer27——二叉搜索树与双向链表
思路:排序的双向链表,二叉搜索树的中序遍历的结果就是有序的。所以可以借助辅助内存,将中序遍历的结果保存,在用双向链表连接。static Node temp;static void deque(Node node) { mid(node); while (temp.left!=null) temp = temp.left; Node temp1...
2019-02-17 13:51:36 123
原创 剑指offer26——复杂链表的复制
思路:先复制节点再复制sibling节点的next最后两个指针进行剥离。static Node getCopy(Node head) { copyBrother(head); copySibling(head); return split(head);}static void copyBrother(Node head) { if (head =...
2019-02-17 11:35:59 168
原创 剑指offer25——二叉树中和为某一值的路径
思路:根据前序遍历来,返回上一层的时候需要删除path中的值static void findPath(Node root, int k) { List<Integer> path = new ArrayList<>(); findPath(root,k,0, path);}static void findPath(Node root, int k, ...
2019-02-17 01:00:14 118
原创 剑指offer24——二叉搜索树的后序遍历序列
关键字:二叉搜索树,后序思路:左子树一定比父节点小,右子树一定比父节点大/** * 5 * 3 7 * 2 4 6 8 * * 2 4 3 6 8 7 5 */static boolean check(int[] data ,int start, int end) { if (data == null) return false; ...
2019-02-17 00:35:48 108
原创 剑指offer23——从上往下打印二叉树
思路:删除某个节点就将他的子左节点或者子右节点添加进去static void printTree(Node root) { if (root == null) return; List<Node> nodes = new ArrayList<>(); nodes.add(root); while (nodes.size()...
2019-02-16 23:57:35 121
原创 剑指offer22——栈的压入、弹出序列
思路:创建栈,并且两个指针指向数组,直到pop数组结束,或者stack空了static boolean check(int[] push, int[] pop) { if (push==null || pop==null) return false; int pushIndex=0; int popIndex=0; Stack<Intege...
2019-02-16 23:52:23 153
原创 剑指offer19——二叉树的镜像
思路:使用辅助栈,层序遍历二叉树。null也需要pop进去递归,每次到一个节点,将他的左右节点做交换,再进行左右节点的递归static Node change(Node root) { if(root == null) return null; Node temp = root.left; root.left = root.right; root.righ...
2019-02-16 22:47:58 137
原创 剑指offer18——树的子结构
思路:显示遍历A树找到节点值和B的头节点值相等的节点,再去同时遍历A树和B树是否是相同的结构。 static boolean pre(Node rootA, Node rootB) { boolean result = false; // 判断当前遍历到的节点和节点B都不为null if (rootA != null && rootB != nu...
2019-02-16 22:31:39 139
原创 剑指offer17——合并两个排序的链表
思路:static ListNode merge(ListNode l1, ListNode l2) { ListNode node = null; while (l1 != null && l2 != null) { if (l1.value < l2.value) { if (node == null) { ...
2019-02-15 14:19:19 113
原创 剑指offer16——反转链表
思路:3个指针来控制,listNext指针指向下下一个节点,head 和pre指针确保前面2个节点的反转。static ListNode reverseList(ListNode head) { if (head == null) { return null; } ListNode reverseHead = head; ListNode lis...
2019-02-15 13:54:35 140
原创 剑指offer15——链表中倒数第K个结点
思路:使用堆栈,全部push进去pop出第k个结点两个指针,第一个先走k步,再第二指针开始走,k走到底的时候,第二个指针指向倒数第k+1个,这里有可能有歧义,(链表的最后是null,还是最后一个不为null的结点。)会影响代码的逻辑。static int getKNum(ListNode root, int k) throws Exception { if (root == n...
2019-02-15 13:25:56 127
原创 剑指offer14——调整数组顺序使奇数位于偶数前面
思路:因为不需要排序,所以头尾指针,偶数在后,奇数在前。类似快排里面的思路。static void reOrderOddEvent(int[] data) { if (data == null) return; int left = 0; int right = data.length - 1; while (left < right) {...
2019-02-15 12:31:36 145
原创 剑指offer13——在o(1)时间删除链表节点
思路:并不是真正的删除,而是让遍历链表的时候看起来节点已经被删除了。关键词:o(1)时间java是值传递,所以无法实现类似c++中传入指针,将指针置为nullListNode deleteNode(ListNode head, ListNode toBeDelete) { if (head == toBeDelete) { return null; } el...
2019-02-15 12:18:45 109
原创 剑指offer10——二进制中1的个数
// 负数的情况下会有问题 0xFFFFFFFFstatic int getCount(int n) { int count = 0; while (n != 0) { if ((n & 1) != 0) { count++; } n = n >> 1; } return...
2019-02-14 11:33:39 125
原创 排序算法比较
冒泡:static int[] bubbleSort(int[] data) { System.out.println(Arrays.toString(data)); for (int i = data.length - 1; i >= 0; i--) { for (int j = 0; j < i; j++) { if (d...
2019-02-14 01:13:55 192
原创 剑指offer9——斐波那契数列
思路:递归,但是有重复计算。第二次迭代的方式:时间复杂度o(n)最终的是使用数学公式o(1)static int fibonacci(int n) { if (n == 0) return 0; if (n == 1) return 1; return fibonacci(n - 1) + fibonacci(n - 2);}s...
2019-02-13 11:27:45 133
原创 剑指offer8——旋转数组的最小数字
思路:二分查找,如果是例子中,非严格递增的,遇到后使用顺序查找/** * {3,4,5,1,2} * {5,1,2,3,4} * <p> * {0,1,1,1,1} * {1, 0,1,1,1} * {1,1,1, 0,1} */static int getMinNum(int[] data) { int left = 0; int right = ...
2019-02-13 11:20:22 126
原创 剑指offer6——重建二叉树
根据遍历的特性,找到根,算出左子树和右子树的范围,再进行递归重建。/** * pre {1, 2,4,7, 3,5,6,8} * mid {4,7,2, 1, 5,3,8,6} */static TreeNode reBuild(int[] pre, int[] mid) { int rootValue = pre[0]; TreeNode root = new Tre...
2019-02-13 10:56:37 219
原创 剑指offer5——从尾到头打印链表
使用栈从头push进去,再pop出来static void tailPrint(TreeNode node) { Stack<TreeNode> stack = new Stack<>(); TreeNode temp = node; while (temp.left != null) { stack.push(temp); ...
2019-02-13 10:26:22 140
原创 剑指offer4——替换空格
思路:如果允许额外空间的话,使用辅助空间,线性遍历时间复杂度也是o(n)如果不允许,则需要对原本的空间进行扩容。计算出空格的个数,对数组需要进行遍历两次所以时间复杂度o(2n)static String replaceString(String s) { StringBuilder sb = new StringBuilder(s); int spaceCount = 0;...
2019-02-13 10:19:08 111
原创 剑指offer3——二维数组中的查找
static boolean getNum(int[][] data, int k) { if (data == null) return false; int row=0; for (int i = data.length - 1; i >= 0; i--) { for (int i1 = row; i1 < data[i]...
2019-02-13 09:35:49 123
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人