- 博客(64)
- 收藏
- 关注
原创 网络必知必会
网络模型与网络收发流程我们经常说七层负载均衡、四层负载均衡,或者三层设备、二层设备等等,这里说的二层、三层、四层、七层都来自国际标准化组织制定的开放式系统互联通信参考模型(Open System Interconnection Reference Model),简称为 OSI 网络模型。OSI模型把网络互联的框架分为应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层等七层,每个层负责不同的功能:1、应用层,负责为应用程序提供统一的接口。2、表示层,负责把数据转换成兼容接收系统的格式。3、会
2021-03-10 08:51:20
265
1
原创 面向对象与封装、抽象、继承、多态
面向对象现如今大部分程序员都在使用面向对象编程语言,进行面向对象开发。本文就来谈谈面向对象编程及其4大特性(封装、抽象、继承、多态)什么是面向对象编程与面向对象编程语言面向对象编程(OOP,Object Oriented Programming),是一种编程范式,以类和对象作为代码组织的基本单元,将封装、抽象、继承、多态作为代码设计与实现的方法论。面向对象编程语言(OOPL,Object Oriented Programming Language),是一种能够提供语法机制以支持类与对象的编程语言,并
2021-02-21 23:45:20
574
原创 如何评价代码的好坏?
我们一般从可维护性、可读性、可扩展性、可测试性、可复用性、简洁性来评价代码的质量。可维护性所谓维护无外乎就是修改bug、修改老的代码、添加新的代码之类的工作。代码易维护指的是在不破坏原有代码设计、不引入新的bug的前提下,能够快速的修改或者添加代码。那么代码不易维护就指的是修改或者添加代码,有极大的风险会引入新的bug或者需要花费很长时间才能完成。我们知道代码的维护时间,要远远高于代码的编写时间。工程师的大部分时间可能都是花费在修修bug、改改老的功能逻辑、添加一些新的功能逻辑之类的工作。为此如何编写
2021-02-07 00:08:07
1999
3
原创 MySQL一条SQL语句是如何执行的
查询语句的执行流程1、连接阶段:客户端发起数据库的连接请求,首先与MySQL的连接器完成TCP的3次握手,然后客户端发送用户名与密码给到连接器,连接器进行用户名、密码与权限校验,如果校验不通过,返回错误,否则继续。可以看出连接的建立是一个非常耗时的操作,为此我们一般使用长连接,使用长连接一般会使用连接池。但是长连接也会导致MySQL的内存占用高,因为MySQL的很多数据都保存在连接的线程空间里面的,为此我们一般需要定期的断开连接或者经过一个大事务后断开连接,然后在重新连接。但是连接器不可能一直保留一个没有
2021-01-20 00:07:27
181
原创 MySQL的锁与锁机制----锁分类
根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁全局锁指的是对整个数据库实例加锁,MySQL提供了FLUSH TABLE WITH READ LOCK,用于给全整个数据库实例加读锁。这个命令执行后,整个实例就变成只读了,增删改的DML语句与建表增加索引等DDL语句都会被堵塞。可以使用UNLOCK TABLES解锁。整个数据库实例都变成自读了,想想就多么可怕,但是在MyISAM时代,由于MyISAM不支持事务当我们需要做全库备份的时候,只能使用这个语句,使得备份期间整个库
2021-01-19 19:32:12
140
原创 Redis的一些小功能大用处
慢查询日志像很多数据库一样,redis也提供慢查询日志。一条redis命令执行的执行过程包括:1、发送命令2、排队3、执行4、发送结果慢查询命令只统计了命令的执行时间。Redis内部将慢查询日志保存到一个队列中,受2个参数控制:slowlog-max-len=1000 //表示队列的长度slowlog-log-slower-than=1000 //执行时间超过设置的值,则记录到慢查询队列中,以微秒为单位slowlog-slower-than默认为10ms,在高并发的场景,这个值太大了,
2021-01-10 23:17:03
124
原创 堵塞--redis的噩耗
由于redis的单线程模型,如果在主线程中执行了耗时的操作,那么之后的所有命令将会被堵塞,响应时间将会增加,整个系统的吞吐量会降低。为此我们需要避免导致redis堵塞的操作,那么redis都有哪些堵塞操作呢?我将redis的堵塞分为内在原因与外在原因。内在原因1、时间复杂度高的操作,如keys、集合的一些聚合操作等。我们可以通过redis的慢查询日志,找到执行慢的日志。2、bigkey的删除操作,如下表所示可以看出删除一个百万级别的bigkey都达到秒级别了。为此删除bigkey需要使用异步删除的
2021-01-10 23:07:00
460
原创 Redis集群都有哪些坑
集群完整性检查默认情况下,如果redis的虚拟slot没有全部分配完,那么集群不可提供服务。那么在集群故障转移期间,redis集群没法提供服务,这在有些业务场景下是没法接受的。为此我们一般将参数cluster-require-full-coverage设置为no。这样只有故障的节点负责的slot不可用。pubsub广播Redis集群为了实现所有的订阅的客户端都可以接收到发布的消息,但是不同的客户端可能连接的是不同的主节点,为此redis会广播所有的发布的消息到所有的节点,如果发布的消息较大,网络开销将
2021-01-10 17:57:53
792
原创 Redis集群--水平扩展redis的读写性能
当服务出现性能瓶颈时,我们一般有2种方式扩展服务的性能:1、垂直方向,就是通过升级硬件的配置,如内存出现瓶颈了,就使用更大的内存,CPU出现瓶颈了使用更好的CPU,但是硬件的升级总是有上限的,而且更高的硬件配置,往往意味着更高的成本,因为随着硬件成本的提升,对性能的提升并不是线性的。2、水平方向,就是通过将服务部署到更多的机器,让更多的机器提供服务,提升服务的整体性能。理论上水平扩展可以无限的扩展服务的性能,垂直扩展只能是一个临时的方案。Redis原生提供了集群方案redis cluster,用于水平
2021-01-10 16:29:15
1124
原创 Redis哨兵机制--redis主从集群的高可用保证
Redis通过主从集群扩充主节点的读能力,同时又一定程度上保证数据的不丢失,但是主从集群由如下的问题:1、如果主节点故障了,需要手动执行主从切换,没法保证高可用;2、主从集群只能扩充读能力,并不能扩充主节点的写能力。本篇博文将介绍redis如果保证主从集群的高可用。哨兵机制的作用Redis通过哨兵机制来保证redis集群的高可用,它主要有如下的作用:监控、故障转移、通知。监控监控指的是监控主从节点的状态,检测他们是否出现故障。它通过每隔1秒给redis节点与哨兵节点周期性的发送PING消息,同
2021-01-09 18:37:34
201
原创 Redis主从集群都有哪些坑
主从不一致主从不一致主要有如下的原因主从延迟Redis的主节点收到写命令成功后,会通过网络同步给从节点,但是主节点并不等待同步到从节点完成,而是一旦写入主节点成功就返回给客户端。这主异步模式必然导致主从节点的数据不一致。那么什么原因会影响主从同步的延迟程度呢?主要有如下的原因1、网络环境,如果主从之间的网络环境不是很好,如主从节点部署在不同城异地机房。但是即使主从节点部署在有良好专线连接的同城异地机房或者同机房,但是他们与其他占用大量带宽的服务共享同网络资源,那么还是可能会导致主从延迟过大。为此我
2021-01-08 00:07:23
788
原创 Redis 多核CPU与NUMA架构优化
多核CPU架构当今的CPU一般会有多颗核心(我们称为物理核心),每颗核心都有自己的一级缓存(简称L1 Cache)与二级缓存(简称L2 Cache),这两集缓存都比较小,一般都是KB级别,CPU核心访问它们一般只有几纳秒,非常快。一级缓存又可以进一步分为指令缓存与数据缓存。但是一级缓存与二级缓存都比较小,可以保存的指令与数据比较少,如果指令或者数据没有在L1与L2 Cache命中,那么就要访问内存,内存的访问速度就比较慢了,一般是100纳秒左右,为此引入了共所有CPU核心共享的三级缓存,它的大小从几MB到
2021-01-06 08:43:47
1022
原创 Redis数据结构及内存优化
内存优化对内存优化前,我们需要知道redis都有哪些类型,都使用了哪些数据结构,每种数据结构的使用场景。下面就分别介绍每种数据类型redisObject对象Redis内部所有存储的数据都使用redisObject 来封装。struct redisObject {unsigned type:4; // 对象类型如 zset/set/hash 等等unsigned encoding:4; // 对象编码如 ziplist/intset/skiplist 等等unsigned lru:24; //
2021-01-05 00:36:08
996
原创 Redis内存及内存管理
虽然现今内存都很便宜了,但是相对廉价的硬盘来说,还是贵了非常多。而且redis使用的很多场景下,往往数据是TB级别甚至PB级别,而我们的服务器的内存容量只有GB级别。为此我们需要优化redis内存的使用,但是优化内存的使用的前提是知道内存都消耗再哪里了。为此本篇博客先从内存消耗入手分析。内存消耗理解内存,首先要知道内存都消耗再哪里了。内存监控Redis提供了命令info memory命令,统计内存消耗分布。其输出如下的内容指标意义used_memoryredis实际使用的内存
2020-12-31 00:28:55
630
原创 分布式共识算法之Raft算法
Raft算法是一切以领导者为主,在分布式系统中,就一系列值达成共识与日志的一致。是一种强领导者模型,领导者的性能决定了整个集群的性能。它是现今最常用的一种分布式共识算法。领导者选举Raft算法使用如下的三个角色,描述每个节点的状态。1、领导者(Leader):集群中的霸道总裁,其主要职能是处理写请求、同步日志给其余节点与发送心跳信息。领导者通过心跳信息,告诉其他节点我还活着,别进行领导者选举。在正常情况下,选举出来的领导者会一直是领导者。2、跟随者(Follower):默默的接受领导者节点的日志复制
2020-12-23 22:17:48
501
原创 Redis 持久化----AOF增量日志与RDB快照
AOF增量日志AOF(append only file),是redis的增加日志,其记录的是一条条redis执行的命令。比如执行命令set testkey testvalue,则记录的日志是:*3$3 set$7testkey$9testvalue其中,“*3”表示当前命令有三个部分,每部分都是由“$+数字”开头,后面紧跟着具体的命令、键或值。这里,“数字”表示这部分中的命令、键或值一共有多少字节。例如,“$3 set”表示这部分有 3 个字节,也就是“set”命令。AOF写盘策略A
2020-12-16 23:43:25
1348
原创 redis真的是单线程的么
redis单线程模型我们经常说redis是单线程的,这个单线程指的是redis的网络IO的读写与数据库数据的除操作都在一个线程中完成,从而避免多线程编程的一些数据竞争的问题。但是redis的网络IO的读取与数据库操作都在同一个线程中完成,为什么还能够达到如此的高效呢?这就要归功于IO多路复用技术、redis的高效的数据结构、没有数据竞争问题以及所有数据操作都是内存操作。关于redis的高效的数据结构,将在我的其他博客介绍。Redis IO多路复用技术模型,使用的是单reactor模式,其模型图如下:
2020-12-09 08:47:05
1299
原创 初识动态规划
动态规划理论什么样的问题适合使用动态规划求解呢?其需要满足“一个模型三个特征”。一个模型指的是多阶段决策最优解模型。我们一般使用动态规划来解决最优解问题,解决问题的过程需要经过多个决策阶段,每个决策阶段包含一组状态,然后选择一组最优的决策序列,以得到我们期望的最优解。三个特种主要包括:最优子结构,无后效性,重复子问题。1、最优子结构指的是,一个问题的最优解,可以分解为多个子问题的最优解,通过子问题的最优解,可以求解出问题的最优解。对应到动态规划的问题模型上,就是后面阶段的状态,可以通过前面阶段的状态
2020-12-02 00:05:38
158
原创 谈谈分治算法思想
分治算法思想分治算法其核心思想是“分而治之”,其是将一个大问题分解成多个相同模式的小问题,然后递归的求解各个小问题,再将小问题的解合并成大问题的解。我们一般可以按如下的思路实现:1、将一个大问题分解成多个相同模式的小问题。2、递归的求解各个小问题。3、小问题的解合并成大问题的解。使用分治算法需要满足如下的条件:1、一个大问题能够分解成多个相同模式的小问题。2、这个分解过程存在终止条件,也就是当问题的规模足够小的时候,应该能够直接求解。3、各个子问题直接不存在相关性,也就是某个子问题的求解过程
2020-11-17 22:38:13
1310
原创 递归与递归时间复杂度分析
使用递归需要满足的条件1、大问题可以分解成多个规模较小的子问题。2、这些子问题的求解思路与原问题一致。3、子问题的分解不能无限循环下去,存在终止条件。为此写递归代码的思路为:根据问题的分解过程,找到问题的递归公式与终止条件,将公式与终止条件翻译成代码。比如有n个台阶,每次下台阶有2种走法:一次一个台阶或者一次两个台阶,那么总共有多少种走法。第一步的走法,可以先走一个台阶或者先走两个台阶。n个台阶的走法(记为f(n))其中为:第一次走一个台阶后剩余n-1个台阶的走法(记为f(n-1))+第一次走两
2020-11-12 22:51:35
3115
3
原创 MySQL读写分离的过期读解决方法
很多业务场景一般是读多写少,但是MySQL的单机处理能力一般有限,为此一般通过水平扩展出多个从机用于提供读服务,以分担写库的压力。但是读写分离后,写库执行完事务后,同步到备机,备机执行完同样的事务,往往有一个时间差,这个时间差叫主备延迟。从而导致客户端去从机读取,读取不到最新的数据,这就是过期读问题。主备延迟监控主备延迟可以通过在备机执行命令SHOW SLAVE STATUS;这个命令的输出中有一个seconds_behind_master字段,这个字段的值就是主备延迟的时间,以秒为单位。它是这
2020-11-04 22:50:27
429
原创 关系数据库的范式与反范式设计
范式种类范式主要包括:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)及第五范式(5NF,又叫做完美范式)。数据库的设计范式越高,冗余度就越低,高级别的范式总是包含低级别的范式。数据库设计我们一般至少做到3NF,但是也不是绝对的,有时我们也需要反范式化,引入冗余。基本概念1、超键:一组能够唯一标识元组的属性集。2、候选键:如果超键不包括多余的属性,也能唯一标识元组,那这个超键就是候选键。3、主键:用户可以选择候选键集合中的一个候选键,作为主
2020-10-27 22:37:36
207
原创 MySQL的日志与缓存
要搞清楚MySQL的日志与缓存那么首先必须知道语句的执行流程。查询语句的执行流程1、连接阶段:客户端发起数据库的连接请求,首先与MySQL的连接器完成TCP的3次握手,然后客户端发送用户名与密码给到连接器,连接器进行用户名、密码与权限校验,如果校验不通过,返回错误,否则继续。可以看出连接的建立是一个非常耗时的操作,为此我们一般使用长连接,使用长连接一般会使用连接池。但是长连接也会导致MySQL的内存占用高,因为MySQL的很多数据都保存在连接的线程空间里面的,为此我们一般需要定期的断开连接或者经过一个大
2020-10-20 23:16:47
873
原创 MySQL InnoDB buffer_pool缓存
InnoDB缓存机制InnoDB缓存的是以页为基本单位的,一页的大小是16KB。其有如下的作用:1、加速读就是当需要访问一个数据页的时候,如果这个页已经在缓存池中,那么就不再需要访问磁盘,直接从缓冲池中就能获取这个页面的内容。2、加速写就是当需要修改一个数据页的时候,先将这个页在缓冲池中进行修改,记下相关的 redo log,这个页的修改就算已经完成了。至于这个被修改的页什么时候真正刷新到磁盘,这个是 buffer pool 后台刷新线程来完成的。由于物理服务器的内存大小是有限的,buffer po
2020-10-13 23:22:41
333
原创 MySQL的锁与锁机制----InnoDB加锁规则
online-ddl-index-operations《限流–高并发系统中的流量控制》gh-ost方案
2020-09-28 23:27:11
369
原创 MySQL的B+树与索引设计优化
B+树结构对于表:create table T(id int primary key, k varchar(64) not null, name varchar(64) not null,index (k))engine=InnoDB default charset=utf8mb4;B+树结构如下图所示:从图中可以看出:1、非叶子节点保存的都是索引值,对于主键索引,叶子节点保存了所有数据;对于二级索引,叶子节点保存的是key与key对应的主键值;2、每个节点包含m个元素,m+1个孩
2020-09-25 22:54:32
296
原创 分布式事务及二阶段提交与TCC
什么是分布式事务分布式事务就是在分布式系统中运行的事务,它是由多个本地事务组成的。也需要满足事务的ACID特性。关于ACID见我的博文《事务的ACID特性与隔离性分析》二阶段提交二阶段提交协议(The two-phase commit protocol, 2PC),是用于保证分布式事务的原子性与一致性,其分为投票(vote)与提交(commit)2个阶段。为了实现二阶段提交,需要引入协调者(coordinator,即事务的管理器),来保证事务的原子性与一致性。1、投票(vote)为第一阶段,协调者(
2020-09-23 22:19:07
1312
原创 CAP定理与BASE理论
CAP定理CAP定理指的是在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。注意这里是互相连接并且共享数据的集群并且涉及到数据的读写,比如MySQL集群。一致性(Consistency)指对某个指定的客户端来说,读操作保证能够返回最新的写操作结果;可用性(Availability)指非故障的节点在合理的时间内返回
2020-09-22 19:13:28
117
原创 事务的ACID特性与隔离性分析
事务事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全部成功,要么全部失败。而ACID 是数据库管理系统为了保证事务的正确性而提出来的一个理论,ACID 包含四个约束:原子性(atomicity)、一致性(consistency)、隔离性(isolation)与持久性(durability)。原子性(atomicity)一个事务中的所有操作,要么全部完成,要么全部不完成,不会在中间某个环节结束。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。也就是说事务中的
2020-09-18 00:09:48
667
原创 全局唯一ID生成器
当数据规模达到一定量级的时候会影响到数据库的性能,那么这个时候我们一般会沿着AKF的Z轴使用分库分表的策略,以降低单表的数据量,从而提高数据库的性能。但是分库分表后,我们怎么保证ID的全局唯一性呢?这个时候ID生成器就登场了。ID应该遵循的原则1、ID应该是按时间有序的,因为在某些场景上可能会用到,比如获取商品的评论,一般需要按照评论的倒叙显示,如果评论ID是无序的那边就需要添加额外的字段排序。另外ID如果是有序,可以提升数据库的性能,因为有序的ID,对于关系型数据库来说可以有效的实现插入数据的顺序写磁
2020-09-10 22:58:40
781
原创 池化技术--如何减少不断创建数据库连接的性能损耗
如果每次查询数据库都重新创建一个数据库连接,而创建一个新的数据库连接需要走TCP的三次握手与数据库权限认证,这个耗时可能比查询数据库还要耗时,这样就会严重影响服务的性能。为此我们一般引入数据库连接池,事先创建好数据库的连接,每次需要查询数据库的时候从池子里面获取一个空闲的连接。数据库连接池注意事项1、连接池应该有是有上下界的,当如果有比较多的空闲连接且总的连接数大于连接池连接数的下界,那么可以关闭部分空闲连接,空闲连接数的阈值可以根据场景配置;2、当从连接池里面获取连接时,如果有空闲连接则返回空闲连接
2020-09-09 22:56:57
315
原创 限流--高并发系统中的流量控制
限流指的是限制系统的并发访问策略,保证系统能够接受部分用户的请求,而对于超过流量控制的请求,系统会拒绝请求。限流是为了保护系统不会被过载的流量打垮,其通常做在服务入口层如网关,它可以对整个系统,某个服务,某个接口,某个IP或者某个用户做限制。常用的限流算法有固定窗口,滑动窗口,漏桶算法与令牌桶算法。固定窗口固定窗口指的是在固定的时间窗口内限制请求的数量,超过数量的请求直接拒绝。比如限制1分钟内只能接收1W笔请求,超过1W笔的请求直接拒绝请求,等到下一个一分钟重新开始计数。从固定窗口的算法中可以看出,在
2020-09-08 22:20:12
2904
原创 降级熔断--屏蔽非核心系统故障的影响
假设我们有如下倚赖关系的3个服务,其中A与B是系统的核心服务,C是非核心服务。如果系统某天需要做活动,预估流量可能是平时的3倍,那么我们可能会扩容服务A与B,由于C不是非核心服务,而选择不扩容服务。那么当活动开始时,请求蜂拥而至,服务C达到了系统的瓶颈,从而出现了大量的慢查询,继而导致服务B的大量请求一直在等待C的返回,久而久之服务B的大量资源耗在等待服务C的调用,最终导致服务B出现问题,紧接着服务A也出现了问题。导致了系统的雪崩。一个非核心服务C的慢请求最终演变成了怎个系统的雪崩。所以在分布式环境下
2020-09-07 23:10:23
177
原创 微服务化改造原则
在我的《高并发系统设计目标之可扩展性》博文中提到,随着业务的发展,我们会沿着AKF的Y轴进行微服务化的改造。本文就介绍一下微服务化改造的基本原则微服务化改造原则1、单个服务内部应该是高内聚低耦合的,也就是单一服务内部应该只做自己相关的事情,不是自己职责的功能交由其他服务完成,服务之间应该有明显的边界;2、微服务化改造应该是边改造边支持业务的发展的,不能为了改造而停止业务的迭代。因为要是停止了业务的迭代,那么等你改造完,可能已经被竞品超越了,从而丧失了市场的机会,最终可能是竹篮打水一场空;3、微服务提
2020-09-03 23:09:47
1101
原创 数据迁移方法
在我的《高并发系统设计目标之可扩展性》博文中提到,随着业务的发展,我们会沿着AKF的Y轴进行微服务化的改造。但是沿着Y轴的重构过程中往往涉及到分库分表。那么这时就需要进行数据库的迁移了。那么迁移有什么原则呢?数据迁移原则1、迁移的过程应该是在线的,线上的服务应该能够正常的提供服务;2、迁移完成后,数据应该是完整的,也就是迁移后新库与旧库的数据应该要保持一致;3、迁移过程中如果出现问题,应该是可以回滚。数据迁移之双写方案其流程如下图:1、设置新库同步旧库(快照+binlog),如果新库的库表有
2020-09-03 19:47:53
2773
原创 高并发系统设计目标之可扩展性
可扩展性我们的系统一般分为平时流量与高峰流量,为了节约成本一般都是预留1到2倍的容量,以应对突发的流量。但是如果突然来了一个大事件,一下来了很多请求,那么此时我们的系统可能承受不了那么多的流量。如果我们的系统的可扩展性非常好,那么我们可以快速的扩展我们的系统,以应对峰值流量。为此我们的系统需要具有良好的可扩展性。如何设计可扩展性的系统那么我们有什么依据来设置我们的系统,以实现良好的可扩展性呢?我们可以基于AKF立方体来拆分我们的系统,以实现高可扩展性。AKF 立方体也叫做scala cube,旨在提
2020-09-01 23:42:59
1009
原创 高并发系统设计目标之高可用
高可用(High Availability,HA)可用性指的是软件系统在投入使用时可正常提供服务的程度,或能实现其指定系统功能的概率,是衡量系统可以无故障的运行的能力。同样是一个每秒可以接受1万次请求的购物系统中,一个隔三岔五的就出现故障,而另外一个可以长时间工作,显然可以长时间工作的系统的体验更好。通常来讲对于一个高并发大流量的系统,系统的可用性通常比系统性能低下的影响更大,一个日活百万的系统,1分钟的故障影响的客户可能有成百上千,想想是多么的可拍。而随着系统的日活的增加,对于可用性的要求就越高。那么可
2020-08-31 23:46:22
488
原创 高并发系统设计目标之高性能
在高并发分布式系统设计中,我们经常提及三大目标,那么什么是三大目标呢?他们就是高性能、高可用、可扩展性。那么他们有什么衡量标准呢?高性能性能反应了系统的使用体验,性能越高系统的体验越好,比如在一个每秒可以接受1万次请求的购物系统中,一个浏览商品详情页面的响应时间是1秒,而另一个是200ms,显然200ms的系统体验更好。那么性能优化有什么指导原则呢?1、性能优化一定要以问题为导向,不能麻木的优化。麻木的提早优化可能使系统过度设计,进而导致系统过于复杂,进而增加了开发与维护成本,而且还可能影响到将来的
2020-08-28 13:02:34
481
原创 散列表如何高效的管理亿级数据
什么是散列表散列表又称hash table、哈希表,它是通过计算key而得到一个散列值,然后通过这个数值与数组的随机访问特性直接访问key对应的value。通过计算key而得到散列值的方法我们称之为散列函数或者哈希函数。为此如何设计这个散列函数非常关键,他直接关系到散列表的性能。那么如何设计散列函数呢?1、计算量不能太复杂2、散列函数计算得到的散列值必须为一个非负整数3、如果key1 == key2,那么hash(key1) == hash(key2)4、如果key1 != key2,那么hash
2020-08-27 19:29:10
444
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人