自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 MVCC实现

1 介绍MVCC(Multi Version Concurrency Control的简称),代表多版本并发控制,读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能1.1 当前读与快照读在MVCC并发控制中,读操作可以分成两类,快照读与当前读 快照读 读取的是记录数据的可见版本(可能是过期的数据),不用加锁 简单select使用该读取方式 当前读 读取的是记录数据的最新版本,并且当前读..

2021-07-21 17:39:15 96

原创 六 Redis主从复制

1 配置参与复制的Redis实例划分为主节点(master)和从节点(slave)。默认情况下,Redis都是主节点。每个从节点只能有一个主节点,而主节点可以同时具有多个从节点。复制的数据流是单向的,只能由主节点复制到从节点。1.1 建立复制配置复制的方式有以下三种: 在配置文件中加入slaveof{masterHost}{masterPort}随Redis启动生效。 在redis-server启动命令后加入--slaveof{masterHost}{masterPor...

2021-07-21 16:29:54 190

原创 二 Redis数据结构

1 底层数据结构1.1 简单动态字符串简单动态字符串的数据结构如下:struct sdshdr{ // 字节数组,用于保存字符串 char buf[]; // 记录buf数组中已使用的字节数量,也是字符串的长度 int len; // 记录buf数组未使用的字节数量 int free;}其结构图如下所示:其与C语言的字符串不同点在于: 常数复杂度获取字符串的长度,因为采用了len字段保存了字符串长度 使用空间分配策略

2021-07-21 15:35:40 92

原创 八 Redis集群模式

1 数据分区分布式数据库首先要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整体数据的一个子集。1.1 分区方案常见的分区规则有哈希分区和顺序分区两种【哈希分区】 节点取余:根据节点数量N使用公式:hash(key)%N计算出哈希值,用来决定数据映射到哪一个节点上。 缺点:当节点数量变化时,如扩容或收缩节点,数据节点映射关系需要重新计算,会导致数据的重新迁移。 优点:这种方式的突出优点是简单性,常用于数据库的分库分表规则,..

2021-07-21 13:23:13 113

原创 十一 Redis缓存设计

1 缓存收益与成本下图左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构。【收益】 加速读写:因为缓存通常都是全内存的(例如Redis、Memcache),而存储层通常读写性能不够强悍(例如MySQL) 降低后端负载:帮助后端减少访问量和复杂计算(例如很复杂的SQL语句),在很大程度降低了后端的负载。 【成本】 数据不一致性:缓存层和存储层的数据存在不一致可能。 代码维护成本:加入缓存后,需要同时处理缓存层和存储层的逻辑,增大了开发者维.

2021-07-21 11:02:58 525

原创 五 Redis过期策略与淘汰机制

1 缓存过期策略果我们设置了Redis的key-value的过期时间,当缓存中的数据过期之后,Redis就需要将这些数据进行清除,释放占用的内存空间。Redis中主要使用 定期删除 + 惰性删除 两种数据过期清除策略。1.1 定期删除redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果有过期就删除。注意这里是随机抽取的。 为什么要随机呢?你想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 C..

2021-07-21 10:43:00 108

原创 九 Redis持久化

1 整体介绍Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。 持久化机制 执行线程 日志内容 恢复效率 持久化 应用场景 RDB 子线程 记录变更后的数据 高 非实时 ..

2021-07-20 15:12:04 69

原创 四 Redis6.0多线程支持

支持多线程的 Redis 6.0 版本于 2020-05-02 终于发布了,为什么 Redis 忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有线程安全问题?多线程的实现原理是怎样的?1 6.0 之前真的是单线程吗Redis 在处理客户端的请求时,包括获取(Socket 读)、解析、执行、内容返回(Socket 写)等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。但如果严格来讲从 Redis 4.0 之后并不是单线程,除了主线程外.

2021-07-20 15:06:40 177

原创 三 Redis多路复用(epoll)

1 疑问解答 为什么redis官方只支持Linux版本? 因为只有Linux支持epoll网络模型,window下的select模型在高并发下性能不如epoll。 epoll相比selete、poll优势点? epoll监听的连接数基本没有限制,select所能打开的最大连接数有FD_SETSIZE宏定义限制(当然可以自己配置,但会影响性能),poll使用链表存储的没有最大连接数的限制; 高并发下IO效率问题:epoll的时间复杂度是O(1),select和poll都是O(n)

2021-07-20 14:58:13 250

原创 一 Redis初步介绍

1 redis介绍Redis是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是 Redis中的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此Redis可以满足很多的应用场景 Redis会将所有数据都存放在内存中,所以它的读写性能非常惊人 Redis还可以将内存的数据利用快照和日志的..

2021-07-16 14:00:12 59

原创 Mysql-核心知识

1 常用引擎1.1 引擎对比 myisam:不支持事物、表级锁、不支持外键、非聚集索引(B+树)、可以没有主键 innodb:支持事物(ACID)、支持行锁、支持外键、聚集索引(B+树)、必须有主键 1.2 B树与B+树【B-树】B-树是一种平衡M叉搜索树 键值分布在整颗树中,搜索有可能在非叶子结点结束 所有叶子节点都在同一层 根节点至少有两个子节点,(除了第一次插入的时候,此时只有一个节点,根节点同时是叶子节点) 每个节点最多拥有..

2021-07-16 13:45:27 106

原创 JVM-内存结构

运行时数据区是 JVM 内存结构最重要的部分,接下来我们详细讲解运行时数据区的各个组成部分。1 虚拟机栈介绍:Java执行方法的内存模型。每个方法被执行的时候,都会创建一个栈帧,把栈帧压入栈,当方法正常返回或者抛出的异常时,栈帧就会出栈。栈帧包含内容:局部变量表、操作数栈、动态链接、方法出口和一些额外的附加信息。结构图:栈帧内容: 局部变量表:局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。 局部变量表的容量以变量槽(Slot)为最小..

2021-07-15 12:20:48 33

原创 JVM-类加载器

https://www.toutiao.com/a6852280188907029000/1 类加载流程 类的生命周期一共分为5个阶段,加载、连接(包括验证、准备和解析)、初始化、使用(类得实例化)、卸载(垃圾回收),最终形成可以被JVM直接使用的Java类型,这就是JVM的类加载机制。 Java语言里面,类的加载、连接和初始化过程都是在程序运行期间完成的。 类的加载:最常见的一种情况是将已存在的类的Class文件(也就是字节码文件)从磁盘上面加载到内存里面,在内存中创...

2021-07-14 22:45:06 56

原创 JVM-垃圾回收

JVM很重要。尤其是GC算法。程序计数器、虚拟机栈、本地方法栈。这几个区域完全不用管回收问题,因为方法结束或者线程结束的时候他们所占用的内存就自然跟着一起释放了,3个区域随线程而生,随线程而灭。所以我们只需要管堆和方法区。1 如何判断垃圾在 JVM 中,垃圾就是指的死亡对象所占据的堆空间( GC 是发生在堆空间中),那么我们如果辨别一个对象是否死亡呢?1.1 引用记数法介绍:给对象中添加一个引用计数器,每当有一个地方引用他时,计数器值就+1;当引用失效时,计数器值就-1;任...

2021-07-14 22:36:56 57

原创 JVM-堆外内存泄漏

0 实战参考 groupapi 堆外内存泄漏(non-heap memory leak)问题排查过程与相关工具介绍 FastJson内存泄漏 1 现象及原因堆外内存java 8下是指除了Xmx设置的java堆(java 8以下版本还包括MaxPermSize设定的持久代大小)外,java进程使用的其他内存。主要包括:DirectByteBuffer分配的内存,JNI里分配的内存,线程栈分配占用的系统内存,jvm本身运行过程分配的内存,codeCache,java 8里还包括m

2021-07-14 22:25:32 1394

原创 Kafka-高性能实现

1 消息批处理在Kafka内部,其实从Producer发送到Consumer接收,消息都是以“批”为单位处理的。 Producer:在Kafka的客户端SDK中,Kafka的Producer只提供了单条发送的send()方法,但实际上Kafka的客户端SDK在实现消息发送逻辑的时候,采用了异步批量发送的机制。当你调用send()方法发送一条消息之后,无论你是同步发送还是异步发送,Kafka都不会立即就把这条消息发送出去。它会先把这条消息,存放在内存中缓存起来,然后选择合适的时机把缓存中的所有消息组

2021-07-09 16:58:58 51

原创 Kafka核心知识

目录1 kafka介绍1.1 kafka是什么1.2 术语介绍1.3 拓扑结构1 kafka介绍1.1 kafka是什么Kafka是一个分布式的,支持多分区、多副本,基于发布订阅模式的消息引擎系统。1.2 术语介绍 名词 描述 消息(Record) Kafka 中的数据单元被称为消息,也被称为记录,可以把它看作数据库表中某一行的记录。 主题(Topic)

2021-07-09 16:54:37 173

原创 java-AQS

​目录1 AQS介绍1.1 AQS介绍1.2 status关键字1.3 核心方法2 ReentrantLock2.1 Sync同步器3 ReentrantReadWriteLock3.1 简单介绍3.2 锁降级1 AQS介绍1.1 AQS介绍 AQS:是一个抽象类,类名为AbstractQueuedSynchronizer 等待队列:AQS维护了一个FIFO的队列,双向链表实现,且该队列不支持基于优先级的同步策略; 两种同步方式:

2021-07-08 21:43:27 51

原创 java核心知识

​1 java中的锁1.1 分类【乐观锁 VS 悲观锁】 悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。 乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断有没有别的线程更新了这个数据,没有则完成更新操作。乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就

2021-07-08 21:38:35 68

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除