ShardingSphere
什么是 ShardingSphereApache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。 它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
一套开源的分布式数据库中间件解决方案。
有三个产品:JDBC、Proxy、Sidecar。
什么是分库分表当我们使用读写分离、索引、缓存后,数据库的压力还是很大的时候,这就需要使用到数据库拆分了。
数据库拆分简单来说,就是指通过某种特定的条件,按照某个维度,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面以达到分散单库(主机)负载的效果。
分库分表之垂直拆分专库专用。一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面。如下图:
优点:
拆分后业务清晰,拆分规则明确。
系统之间整合或扩展容易。
数 ...
docker安装redis集群
拉取镜像1docker pull redis:5.0.5
创建redis容器创建三个 redis 容器:
redis-node1:6380
redis-node2:6381
redis-node3:6382
12345docker create --name redis-node1 --net host -v /data/redis-data/node1:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-1.conf --port 6380docker create --name redis-node2 --net host -v /data/redis-data/node2:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-2.conf --port 6381docker create --name redis-node3 --net host -v /data/redis-data ...
redis核心问题
redis核心问题redis线程,高并发下的缓存穿透、击穿、血崩、缓存淘汰策略、持久化机制,redis的分布式锁
01.说一下在你项目中的redis的应用场景1,5大value类型 :根据我的redis课有场景的介绍
2,基本上就是缓存~!
3,为的是服务无状态,延申思考,看你的项目有哪些数据结构或对象,再单机里需要单机锁,在多机需要分布式锁,抽出来放入redis中;
4,无锁化
02.redis是单线程还是多线程1, 无论什么版本,工作线程就是一个
2, 6.x高版本出现了IO多线程
3,使用上来说,没有变化
4, [去学一下系统IO课],你要真正的理解面向IO模型编程的时候,有内核的事,从内核把数据搬运到程序里这是第一步,然后,搬运回来的数据做的计算是第二步,netty
5,单线程,满足redis的串行原子,只不过IO多线程后,把输入/输出放到更多的线程里去并行,好处如下: 1,执行时间短,更快; 2,更好的压榨系统及硬件的资源(网卡能够高效的使用);
*,客户端被读取的顺序不能被保障哪个顺序是可以被保障的: 在一个连接里,socket里
6.x以前
缓存不严谨,尽量去分 ...
MySQL进阶部分
一、MySQL的架构介绍1.MySql简介 概述:
2.MySQL逻辑架构介绍
1.Connectors指的是不同语言中与SQL的交互
2 Management Serveices & Utilities:系统管理和控制工具
3 Connection Pool: 连接池管理缓冲用户连接,线程处理等需要缓存的需求。负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。
4 SQL Interface: SQL接口。接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
5 Parser: 解析器。SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由 ...
MySQL基础部分
一、为什么要学习数据库数据库的好处 1.持久化数据到本地 2.可以实现结构化查询,方便管理
二、数据库的相关概念 1、DB:数据库,保存一组有组织的数据的容器 2、DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据 3、SQL:结构化查询语言,用于和DBMS通信的语言
三、数据库存储数据的特点 1、将数据放到表中,表再放到库中 2、一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。 3、表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。 4、表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似java 中的”属性” 5、表中的数据是按行存储的,每一行类似于java中的“对象”。
四、初始MySQLMySQL产品的介绍MySQL产品的安装MySQL服务的启动和停止 方式一:计算机——右击管理——服务 方式二:通过管理员身份运行 net start 服务名(启动服务) net stop ...
Elasticsearch概述
第1章 Elasticsearch概述01-开篇教学视频
结构化数据
非结构化数据
半结构化数据
02-技术选型Elasticsearch 是什么The Elastic Stack, 包括 Elasticsearch、 Kibana、 Beats 和 Logstash(也称为 ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。
Elaticsearch,简称为 ES, ES 是一个开源的高扩展的分布式全文搜索引擎, 是整个 ElasticStack 技术栈的核心。
它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。
elastic英 [ɪˈlæstɪk] 美 [ɪˈlæstɪk]n. 橡皮圈(或带);松紧带adj. 橡皮圈(或带)的;有弹性的;有弹力的;灵活的;可改变的;可伸缩的
全文搜索引擎Google,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这些非 ...
动态规划
动态规划动态规划题目的特点
计数
求最大最小值
求存在性
最后都是得出一个最优值,而不是所有的可能性。
动态规划解题思路有2,5,7三种类型的硬币,求用这三种硬币拼出来的总量为27,但是用的硬币个数最小。
组成部分一:确定状态也就是说,在解动态规划问题的时候需要开一个数组,数组的每个元素f[i]或者f[i][j]代表什么
确定状态需要两个意识:
最后一步也就是最后存在的解
例如:
这个题一定存在一个解,即K枚硬币组合在一起达到了总量为27
关键点1我们不关心前面的k-1枚硬币是怎么拼出来27-aK的(可能有一种拼法,可能有100种拼法),而且我们现在甚至还不知道ak和K,但是我们确定前面的硬币拼出了27-ak
##### 关键点2
因为是最优策略,所以拼出27-ak的硬币数量一定要最小,否则这就不是最优策略了
需要最小的硬币数,所以:
这个时候,我们可以用递归方法解题
但是有一个问题,递归是从上到下进行计算的,这样的话会产生大量的重复运算
所以说,这不是一个好的解法,解决方法就是将计算结果保存下来,改变计算顺序
看到这里是不是感觉好像记忆化递归的逆序,没错!这就是 ...
面试之算法1
题目原题目:
12Given two array A, B, in all the indexes o array A elements which are also n array B. For example a = [5,3,1,5,4],b =[5,3],and the resutis [0,1,3]
翻译后:给定两个数组A、B,找出两个数组中重复的A的索引下标
思路思路1:双重for循环暴力破解i,时间复杂度O(n^2^),然后用一个list存放结果
思路2:先把一个数组放入hashmap中,然后再把一个数组放入hashmap,如果有重复那么就不能放入,然后把下标放入list队列,时间复杂度O(N)
思路3:因为hashmap是Api,所以如果这不考虑移除且数组中的数是正整数,那么可以考虑使用一个数组,把值当做索引存入,时间复杂度O(N)
实现暴力破解
基本排序算法
排序类型
平均情况
最好情况
最坏情况
辅助空间
稳定性
冒泡排序
O(n²)
O(n)
O(n²)
O(1)
稳定
选择排序
O(n²)
O(n²)
O(n²)
O(1)
不稳定
直接插入排序
O(n²)
O(n)
O(n²)
O(1)
稳定
折半插入排序
O(n²)
O(n)
O(n²)
O(1)
稳定
希尔排序
O(n^1.3)
O(nlogn)
O(n²)
O(1)
不稳定
归并排序
O(nlog₂n)
O(nlog₂n)
O(nlog₂n)
O(n)
稳定
快速排序
O(nlog₂n)
O(nlog₂n)
O(n²)
O(nlog₂n)
不稳定
堆排序
O(nlog₂n)
O(nlog₂n)
O(nlog₂n)
O(1)
不稳定
计数排序
O(n+k)
O(n+k)
O(n+k)
O(k)
稳定
桶排序
O(n+k)
O(n+k)
O(n²)
O(n+k)
(不)稳定
基数排序
O(d(n+k))
O(d(n+k))
O(d(n+kd))
O(n+kd)
稳定
推荐文章:https://www.cnblogs.com ...
95%算法思想
算法思想是解决问题的核心,万丈高楼起于平地,在算法中也是如此,95% 的算法都是基于这 6 种算法思想,接下了介绍一下这 6 种算法思想,帮助你理解及解决各种算法问题。
1 递归算法1.1 算法策略递归算法是一种直接或者间接调用自身函数或者方法的算法。
递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。
优缺点:
优点:实现简单易上手
缺点:递归算法对常用的算法如普通循环等,运行效率较低;并且在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储,递归太深,容易发生栈溢出
1.2 适用场景递归算法一般用于解决三类问题:
数据的定义是按递归定义的。(斐波那契数列)
问题解法按递归算法实现。(回溯)
数据的结构形式是按递归定义的。(树的遍历,图的搜索)
递归的解题策略:
第一步:明确你这个函数的输入输出,先不管函数里面的代码什么,而是要先明白,你这个函数的输入是什么,输出为何什么,功能是什么,要完成什么样的一件事。
第二步:寻找递归结束条件,我们需要找出什么时候递归结束,之 ...
剑指 Offer 40. 最小的k个数
剑指 Offer 40. 最小的k个数题目输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
12输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]
示例 2:
12输入:arr = [0,1,2,1], k = 1输出:[0]
限制:
120 <= k <= arr.length <= 100000 <= arr[i] <= 10000
思路第一个就是排序,然后从0遍历k个数字
第二个,定义一个长度为k的数组,遍历一遍,如果这个值的大小小于数组最大(用一个值记录)的,则把数组加入,踢出最大的
实现
剑指 Offer II 099. 最小路径之和
剑指 Offer II 099. 最小路径之和题目
12345678910111213141516171819202122给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:一个机器人每次只能向下或者向右移动一步。示例 1:输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。示例 2:输入:grid = [[1,2,3],[4,5,6]]输出:12 提示:m == grid.lengthn == grid[i].length1 <= m, n <= 2000 <= grid[i][j] <= 100
思路这种肯定是通过动态规划实现的,但是我们可以通过递归到记忆化递归到动态规划的思路
实现递归之穷举本解法思路:从左上角开始,穷举每一个位置,找到每一个位置到1的各种可能的路径,我拿到最小的哪一个就可以啦。
123456789101112131415161718192021222324252627282930313233 ...
剑指 Offer 42. 连续子数组的最大和
剑指 Offer 42. 连续子数组的最大和题目输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
123输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
提示:
121 <= arr.length <= 10^5-100 <= arr[i] <= 100
思路第一种方法:遍历,找到所有可能的解
第二种方法就是动态规划:
实现暴力破解12345678910111213141516171819private static class Solution { public int maxSubArray(int[] nums) { int max = nums[0]; int curMax = 0; for (int i = 0; i < nums.length; i++) { curMax ...
剑指 Offer 55 - I. 二叉树的深度
剑指 Offer 55 - I. 二叉树的深度题目输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
提示:
节点总数 <= 10000
思路递归,选出左右子节点的最大深度,如果为null怎跳出递归
实现12345678private static class Solution { public int maxDepth(TreeNode root) { if (root == null) { return 0; } return Math.max(maxDepth(root.left) + 1, maxDepth(root.right) + 1); }}
剑指 Offer 32 - II. 从上到下打印二叉树 II
剑指 Offer 32 - II. 从上到下打印二叉树 II题目12345678910111213141516171819从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。 例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]
思路还是bfs,但是这个我们要知道这一层要打印的数量,因为我们是使用的队列存放的我们要打印的数据,而下一次也是在我们遍历这一层的时候才加入队列的,所以我们是不是可以在加入下一层的的节点的时候,直接把这一层的node全部都遍历
实现