12 2021 档案
摘要:在 Redis Cluster 必须至少有 6 台服务器 在 Redis Cluster 每一台分片服务器都必须是一个 主从结构 在 Redis Cluster 中每一台主分片服务器都是可读可写的 由于每个分片都是主从复制结构, 所以就保证了数据的 '安全性' 和 '可分流性' 但是 Redis C
阅读全文
摘要:通过 搭建Hexo博客通过GithubPages部署 之后博主发现太丑了,不太喜欢,于是,博主就找了几款主题 next inside butterfly 关于 next 这里不介绍,度娘烂大街,主要介绍的是 inside。 inside inside 官方地址:https://github.com/
阅读全文
摘要:虚拟槽哈希 Redis Cluster 采用的是 '虚拟槽哈希' 的方式来分片 在 Redis Cluster 中一共有 0~16383 个虚拟槽, 我们可以把这些槽分配给对应的分片服务器 在存储数据的时候通过 slot = CRC16(key) & 16383 计算出对应数据键的槽值 然后将该值保
阅读全文
摘要:一致性哈希 一致性 Hash 算法将整个哈希值的空间组织成一个 0~2(32) 次方的虚拟的圆环 然后再求出分片服务器的 Hash 值, 根据分片服务器的 Hash 值将服务器配置到虚拟的圆环对应的位置 然后再求出需要保存数据键的 Hash 值, 根据求出的值在虚拟的圆环 顺时针 方向上存入对应的分
阅读全文
摘要:三种常见的哈希分片 节点取余 一致性哈希 虚拟槽哈希 节点取余 主要采取的手段就是:hash(key) % N | | | 1~100 | | | hash(key)%3 | | | | | | | 3,6,9...99 | | 1,4,7...100 | | 2,5,8...98 | | | |
阅读全文
摘要:分布式存储中常见的分片规则 顺序分片 | | | 1~100 | | | | | | | | | | 1~33 | | 34~66 | | 67~100 | | | | | | | 特点: 支持顺序访问 键值和业务相关 可能会出现数据 倾斜 第一点,支持顺序访问 因为数据是有序的,可以按照顺序依次的
阅读全文
摘要:已经解决的问题 主从复制 + Redis-Sentinel 解决了 '高可用性'、'数据安全性'、'数据分流' 的问题 但是由于在主从复制中每台服务器保存的都是相同的内容, 所以还没有解决服务器的 容量 问题 如何解决服务器容量问题,通过 Redis Cluster 来解决 Redis Cluste
阅读全文
摘要:NodeJS 访问 Redis-Sentinel 使用 Redis-Sentinel 之后,由于主节点可能会发生变化,所以我们不能直接操作主节点 只有 Redis-Sentinel 最清楚当前的主节点是谁, 所以我们应该通过 Redis-Sentinel 来操作主节点 官方地址:https://ww
阅读全文
摘要:在本文开始之前首先我要声明一下,因为博主之前通过Hexo搭建的内容在我之前笔记本上面,而那台笔记本我重装过系统,所以Hexo的源文件找不到了,这里博主就当是一个回顾吧,重新来搭建一波,记录一下搭建过程 搭建Hexo需要有NodeJS的环境,所以没有NodeJS环境的可参考NodeJS环境搭建,好了然
阅读全文
摘要:废话不多说,直奔主题,要想通过 NodeJS 操作 Redis 需要借助一个第三方 npm 的 Redis 库 npm 官方地址:https://www.npmjs.com/package/redis/v/3.0.2 初始 NodeJS 工程 npm init -y 安装依赖 npm install
阅读全文
摘要:Spring 通过配置文件加载 Bean 开始本文的内容之前你得要搭建好 Spring 源码的环境,不会搭建的可以去查阅查阅我之前写的 Spring源码编译: 在 resources 当中创建配置文件 spring-config.xml: <?xml version="1.0" encoding="
阅读全文
摘要:经过上一篇 ShardingSphere实现读写分离 博主已经实现了读写分离的一个架构结构了,本文主要介绍的是在读写分离的情况下进行分片,就是分表存储操作,那么该如何实现呢,当然了,要实现读写分离加分片前提条件就是你需要上一篇当中所搭建好的读写分离结构,然后就是把博主之前讲解的分片操作相关配置拿进来
阅读全文
摘要:在进行阅读本文当中的内容之前首先你得要有主从复制的 MySQL 环境,可参考4.MySQL主从复制与分库分表与读取分离进行搭建 官方文档:https://shardingsphere.apache.org/document/5.0.0-beta/cn/user-manual/shardingsphe
阅读全文
摘要:广播表概述 指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致 适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字典表 使用广播表 在两个数据库中同时创建广播表: CREATE TABLE `order_status` ( `tstates` bigint(25
阅读全文
摘要:概述 分片策略无需配置分片健 分片健值也不再从 SQL 中解析,而是由外部指定分片信息,让 SQL 在指定的分库、分表中执行 通过 Hint API 在外部手动指定分片健或分片库 使用步骤 修改 application.properties,移除分片健,与分片库信息: 然后就是配置 hint 分片
阅读全文
摘要:经过上一篇 通过SPI实现range查询策略 实现了范围查询之后,那么在本文的开始之前,我在范围查询测试方法当中在加一个条件,来看看查询的结果如何,添加一个 goods_id 查询条件: @Test void getOrderBetween() { QueryWrapper<Order> qw =
阅读全文
摘要:废话不多说,直奔主题 添加配置 关于配置已经在 自定义分片算法实现range查询 当中已经添加过了,没有添加的自行参考进行添加好。 添加 SPI 扩展 创建 META-INF/services: 在该目录当中创建文件 org.apache.shardingsphere.sharding.spi.Sh
阅读全文
摘要:SPI 概述 SPI 全称为 Service Provider Interface,是一种服务发现机制 用来给第三方实现或扩展的 API,它可以用于实现框架扩展或组件替换 SPI 机制本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载文件中的实现类,这样运行时可以动态的为接口
阅读全文
摘要:经过 ShardingSphere分库分表查询 当中所介绍的 range 查询发现是报错的是不支持的,所以在本文当中主要就是介绍该问题的解决方案,就是自定义分片算法实现 range 查询,首先修改 application.properties 修改 db 与 table 的策略为我们自定义的策略如下
阅读全文
摘要:默认情况下服务器对上传文件的大小是有限制的, 如果想修改上传文件的限制可以修改 php.ini 文件 VID_20211210_160743.mp4 大小为 125 MB: 发现报错了,这个时候就需要按照我如上所说的需要修改 php.ini 文件了更改限制: file_uploads = On:是否
阅读全文
摘要:通过 移动端常用适配方案一 的介绍之后,也说明了为什么不推荐该方案的原因之后,紧接着就是要介绍第二种适配编写方式如下: 如何实现 PC 端一套代码, 移动端一套代码 在 PC 端打开,自动打开 PC 端界面 在移动端打开自动打开移动端界面 实现步骤 默认打开 PC 端界面 在 PC 端界面中通过 B
阅读全文
摘要:视口概述 视口简单理解就是可视区域的大小我们称之为视口 在 PC 端,视口大小就是浏览器窗口可视区域的大小 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模板文件</title> <style> </sty
阅读全文
摘要:通过媒体查询 媒体查询的方式可以说是我早期采用的布局方式, 它主要是通过查询设备的宽度来执行不同的 css 代码,最终达到界面的适配。 媒体查询优势 简单, 哪里不对改哪里 调整屏幕宽度的时候不用刷新页面, 即可响应式的进行展示 特别适合对移动端和 PC 维护同一套代码的时候 媒体查询劣势 由于移动
阅读全文
摘要:vw(Viewport Width) 和 vh(Viewport Height) 概述 vw 和 vh 是前端开发中的一个 动态单位, 是一个相对于 网页视口 的单位 系统会将视口的宽度和高度分为 100 份, 1vw 就占用视口 宽度 的 百分之一, 1vh 就占用视口 高度 的 百分之一 vw
阅读全文
摘要:vmin 和 vmax 概述 vmin: 的取值为 vw 和 vh 中较小的那个 vmax: 的取值为 vw 和 vh 中较大的那个 使用场景: 保证移动开发中屏幕 旋转 之后的尺寸不变 例如我现在利用 vw 和 vh 单位设置一个 div 元素的宽高,然后我们来看看在移动开发中旋转和不旋转的展示效
阅读全文
摘要:Code-Splitting (代码分割) 概述 默认情况下 webpack 会将所有引入的模块都打包到一个文件中例如 JS 最终都会打包成一个 bundle.js, 这样就导致了打包后的文件比较大, 以及修改文件后用户又需要重新下载所有打包内容问题,例如: 在 a.js 中引入了 b.js, 那么
阅读全文
摘要:在经过 ShardingSphere分表与分库分表 实现了分库分表之后紧接着本文博主将要测试的就是在这种环境下如果我们写查询语句 ShardingSphere 发送的 SQL 是怎样的是如何查询的,规则是什么,让我们拭目以待吧。 全查询 首先来看看不带任何条件的查询结果测试代码如下: @Test v
阅读全文
摘要:CSS 模块 Tree-Shaking 不光 JS 模块可以进行 Tree-Shaking, CSS 模块也可以进行 Tree-Shaking 开启 CSS 模块 Tree-Shaking 官方文档地址:https://github.com/webpack-contrib/purifycss-web
阅读全文
摘要:Tree-Shaking 概述 过滤掉无用的 JS 代码和 CSS 代码, 我们称之为 Tree-Shaking 例如: 在 a.js 中引入了 b 模块, b 模块中有 2 个方法, 但是我只用到了 1 个方法 默认情况下会将 b 模块中所有代码都打包到 a.js 中 为了提升网页性能降低打包体积
阅读全文
摘要:原生 NodeJS 搭建 Web 服务器 搭建的过程主要由以下几步: 导入 http 模块 通过 http 模块创建服务对象 通过服务对象监听用户请求 指定监听的端口号 然后就按照如上的方式博主进行搭建一遍,首先需要初始化一个 Node.js 的项目: npm init -y 下面的操作就是如上的步
阅读全文
摘要:经过上一篇 TypeScript-声明安装 的介绍之后,就可以轻易的安装第三方库的声明文件了,然后到此为止 TS 的基础内容博主就已经介绍的差不多了,本文主要的内容就是在额外补充一下命名空间的一个小小知识点和内容,不管三七二十一,先来编写一下命名空间的代码: 创建一个 test.ts 也就是命名空间
阅读全文
摘要:在经过介绍了 TypeScript-声明文件 之后,本篇文章主要介绍的内容就是声明的安装,其实在编写声明文件的时候又分为好几种,如果你导入的第三方的某个库是一个全局的库的话,那么什么叫全局的库呢,就是这个库当中的所有功能都是绑定到一个全局对象上的这种就称之为全局的库,这种时候就可以参照 TS 官方提
阅读全文
摘要:在经过 TypeScript-声明 的介绍了之后我们知道可以通过 declare 来进行声明,那么在 TS 当中呢它是不推荐我们将声明的定义和使用放在同一个文件当中的,它推荐的是将声明的定义单独写到一个文件当中里面去,好了介绍了这些内容之后我们先来看看我们把声明的定义单独写到一个文件当中去,然后在使
阅读全文
摘要:声明概述 在企业开发中我们不可避免的就是需要引用第三方的 JS 的库 但是默认情况下 TS 是不认识我们引入的这些 JS 库的 所以在使用这些 JS 库的时候, 我们就要告诉 TS 它是什么, 它怎么用 那么该如何告诉 TS 呢,那就是通过 声明 来告诉 TS。假如我在 index.html 当中导
阅读全文
摘要:对象混入 通过 Object.assign 方法进行混入 let obj1 = {name: 'BNTang'}; let obj2 = {age: 34}; Object.assign(obj1, obj2); console.log(obj1); console.log(obj2); 类混入 博
阅读全文
摘要:参数装饰器 参数装饰器写在一个参数声明之前(紧靠着参数声明) 参数装饰器表达式会在运行时当作函数被调用,会自动传入下列 3 个参数: 对于静态成员来说是当前的类,对于实例成员是当前实例 参数所在的方法名称 参数在参数列表中的索引 实例成员: function test(target: any, pr
阅读全文
摘要:属性装饰器概述 属性装饰器写在一个属性声明之前(紧靠着属性声明) 属性装饰器表达式会在运行时当作函数被调用,会自动传入下列 2 个参数: 对于静态属性来说就是当前的类, 对于实例属性来说就是当前实例 成员的名字 实例属性: function test(target: any, proptyName:
阅读全文
摘要:访问器装饰器概述 访问器装饰器声明在一个访问器的声明之前(紧靠着访问器声明) 访问器装饰器应用于访问器的属性描述符并且可以用来监视,修改或替换一个访问器的定义 访问器装饰器表达式会在运行时当作函数被调用,会自动传入下列 3 个参数: 对于静态方法而言就是当前的类, 对于实例方法而言就是当前的实例 成
阅读全文
摘要:方法装饰器 方法装饰器写在,在一个方法的声明之前(紧靠着方法声明) 方法装饰器可以用来监视,修改或者替换方法定义 方法装饰器表达式会在运行时当中函数会被调用,会自动传入下列 3 个参数给方法装饰器: 对于静态方法而言就是当前的类, 对于实例方法而言就是当前的实例 实例方法: function tes
阅读全文
摘要:Object.defineProperty() MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty 可以直接在一个对象上定义一个新属性 或
阅读全文
摘要:类装饰器 类装饰器在类声明之前绑定(紧靠着类声明) 类装饰器可以用来监视,修改或替换类的定义 在执行类装饰器函数的时候, 会把绑定的类作为其唯一的参数传递给装饰器 function test(target: any) { console.log(target); target.prototype.p
阅读全文
摘要:装饰器概述 Decorator 是 ES7 的一个新语法,目前仍处于 提案中 装饰器是一种特殊类型的声明,它能够被附加到类,方法, 访问器,属性或参数上 被添加到不同地方的装饰器有不同的名称和特点: 附加到类上, 类装饰器 附加到方法上, 方法装饰器 附加到访问器上, 访问器装饰器 附加到属性上,
阅读全文
摘要:在 ts 当中接口和命名空间是可以重名的, ts 会将多个同名的合并为一个 接口 interface TestInterface { name: string; } interface TestInterface { age: number; } class Person implements Te
阅读全文
摘要:命名空间概述 命名空间可以看做是一个微型模块 当我们想把相关的业务代码写在一起, 又不想污染全局空间的时候, 我们就可以使用 命名空间 本质就是定义一个大对象, 把变量/方法/类/接口 ... 等,都放里面 命名空间和模块区别 在程序内部使用的代码, 可以使用命名空间封装和防止全局污染 在程序内部外
阅读全文
摘要:TS 中的模块几乎和 ES6 和 Node 中的模块一致 Node 模块化请查看 NodeJS: 06-Node-Node模块 07-Node-Node模块导出数据的几种方式 08-Node-exports和module.exports的区别 09-Node-require的注意点 webpack
阅读全文
摘要:和 ES6 迭代器一样 for...of 可以查看: ECMAScript 当中的 76-JavaScript-数组高级API JS新特性 + 流行框架 当中的 Iterator 接口、Iterator 接口应用场景 let someArray = [1, "string", false]; for
阅读全文
摘要:和 ES6 中的 Symbol 一样 TODO JS新特性 + 流行框架 32-Symbol类型 33-Symbol注意点
阅读全文
摘要:unknown 类型 unknown 类型是 TS3.0 中新增的一个顶级类型, 被称作安全的 any 任何类型都可以赋值给 unknown 类型: let value: unknown; value = 123; value = "abc"; value = false; 如果没有类型断言或基于控
阅读全文
摘要:infer 关键字 条件类型提供了一个 infer 关键字, 可以让我们在条件类型中定义新的类型 博主假设有这么一个需求: 定义一个类型, 如果传入的是数组, 就返回数组的元素类型, 如果传入的是普通类型, 则直接返回这个类型。 传入的是数组: type MyType<T> = T extends
阅读全文
摘要:条件类型(三目运算) 判断前面一个类型是否是后面一个类型或者继承于后面一个类型 如果是就返回第一个结果, 如果不是就返回第二个结果 语法: T extends U ? X : Y; type MyType<T> = T extends string ? string : any; type res
阅读全文
摘要:由映射类型进行推断 对于 Readonly,Partial 和 Pick 的映射类型, 我们可以对映射之后的类型进行拆包 还原映射之前的类型, 这种操作我们称之为 拆包 interface MyInterface { name: string; age: number; } type MyType<
阅读全文
摘要:映射类型概述 根据 旧 的类型创建出 新 的类型, 我们称之为映射类型 假如如下的 TestInterface1 是旧的类型: interface TestInterface1 { name: string, age: number } 那么这个时候根据 TestInterface1 创建出来的新的
阅读全文
摘要:通过 [] 索引类型访问操作符, 我们就能得到某个索引的类型 class Person { name: string; age: number; } type MyType = Person['name']; 验证方式为,按住键盘的 ctrl 键 + 鼠标左键然后放到 MyType 上方即可。 应用
阅读全文
摘要:在企业开发中, 如果想对可辨识联合的完整性进行检查, 主要有两种实现方式分别如下 方式一 给函数添加返回值 + 开启 strictNullChecks 如果实现的不完整在编译器当中是会进行报错的: // 正方形 interface Square { // 共同的可辨识特征 kind: "square
阅读全文
摘要:可辨识联合概述 具有共同的 可辨识特征 一个类型别名, 包含了具有共同的 可辨识特征 的类型的 联合 关于什么是共同的可辨识特征如下: // 正方形 interface Square { // 共同的可辨识特征 kind: "square"; size: number; } // 长方形 inter
阅读全文
摘要:字面量概述 字面量就是源代码中一个 固定的值 例如数值字面量: 1, 2, 3, ... 例如字符串字面量: 'a', 'abc', ... 在 TS 中我们可以把字面量作为具体的类型来使用: 当使用字面量作为具体类型时, 该类型的取值就必须是该字面量的值 type MyNum = 1; let v
阅读全文
摘要:接口和类型别名的异同 都可以描述 属性 或 方法 type MyType = { name: string; say(): void; } interface MyInterface { name: string; say(): void; } 都允许 扩展 interface: interface
阅读全文
摘要:类型别名概述 类型别名就是给一个类型起个 新名字, 但是它们都代表 同一个类型 例如: 你的本名叫张三, 你的外号叫小三, 小三就是张三的别名, 张三和小三都表示同一个人 type MyString = string; let value: MyString; value = 'abc'; valu
阅读全文
摘要:先不管三七二十一,首先来看一个函数的定义,该函数的内部返回了一个函数的回调,主要作用就是获取一个字符串的长度,可是呢函数的入参是一个联合类型,如下: function getLength(value: (string | null | undefined)) { value = 'abc'; ret
阅读全文
摘要:null 和 undefined TypeScript 具有两种特殊的类型,null 和 undefined,它们分别具有值 null 和 undefined 默认情况下我们可以将 null 和 undefined 赋值给任意类型 let value1: null; let value2: unde
阅读全文
摘要:类型保护 对于联合类型的变量,在使用时如何确切告诉编译器它是哪一种类型 通过 类型断言 或者 类型保护 如下我写了一个示例代码,就是一个 getRandomValue 函数,通过生成的随机数,来决定返回的是 string 还是 number 类型,那么我想如果是 string 类型则调用 .leng
阅读全文
摘要:交叉类型 格式: type1 & type2 & ... 交叉类型是将多个类型合并为一个类型 let mergeFn = <T, U>(arg1: T, arg2: U): (T & U) => { let res: T & U; res = Object.assign(arg1, arg2); r
阅读全文
摘要:泛型只影响 使用 的部分, 不会影响 声明 的部分 不管三七二十一先来看代码即可: interface TestInterface<T> { age: T; } // age:number let t1: TestInterface<number>; // age:string let t2: Te
阅读全文
摘要:只会比较 实例成员 class Person { public name: string; } class Animal { public name: string; } let p: Person; let a: Animal; p = a; a = p; 只能将 多 的属性赋值给 少 的,不可将
阅读全文
摘要:数字枚举与数值兼容 enum Gender { Male, Female } let value: Gender; value = Gender.Male; value = 1; console.log(value); 数字枚举与数字枚举不兼容 enum Gender { Male, Female
阅读全文
摘要:参数个数 可以将参数少的函数赋值给参数多的函数 let fn1 = (x: number, y: number) => { }; let fn2 = (x: number) => { }; fn1 = fn2; 不可以 将参数多的函数赋值给参数少的函数 let fn1 = (x: number, y
阅读全文
摘要:基本兼容性 可多不可少 正确示例: interface TestInterface { name: string; } let p1 = {name: 'BNTang'}; let p2 = {age: 18}; let p3 = {name: 'BNTang', age: 18}; let t:
阅读全文
摘要:自动类型推断概述 不用明确告诉编译器具体是什么类型, 编译器就知道是什么类型 根据初始化值自动推断: 如果是先定义在初始化, 那么是无法自动推断的 let value; value = 123; value = false; value = 'abc'; 如果是定义的同时初始化, 那么 TS 就会自
阅读全文