- 博客(24)
- 收藏
- 关注
原创 Redis常见数据类型的理解和使用
ziplist:当哈希类型元素个数小于hash-max-ziplist-entries(默认512) && 所有值都小于hash-max-ziplist-value(默认64字节),会使用ziplist作为哈希的内部实现,使用更加紧凑的结构实现多个元素的连续存储,更加的节省内存。最多可以存储2的32次幂 - 1个元素,可以对两端进行push和pop,列表中的元素都是有序的可以获取指定范围的元素列表,获取指定索引下标的元素,列表中的元素可以重复。incr key 键不存在时按照值为0自增,返回结果为1。
2022-08-20 16:34:32
368
原创 Redis-客户端的常见异常
1.无法从连接池中获取连接JedisPool中的Jedis对象的个数是有限的,默认是8个,在超过maxWaitMills时间内仍然无法获取则会抛出异常JedisConnectionException:could not get a resource from the pool.....Timeout waiting for idle object。如果设置了blockWhenExhausted=false,则会立即抛出异常不会进行等待,Pool exhausted原因分析:1.客户端:高并发下连接池设置过小
2022-06-20 21:53:38
1769
原创 Redis-慢查询分析
在命令执行的前后计算每条命令的执行时间参数设置slowlog-log-slower-than 预设阀值,单位是微妙,=0记录所有的命令
2022-06-04 10:28:30
295
原创 Redis-数据库的管理
dbsize select切换数据库:select dbIndex关系型数据库中用字符来区分不同数据库,Redis使用数字进行区分,默认配置16个数据库。databases 16个数据库中没有关联,甚至可以存在相同的键,Redis cli -h ip -p port 链接Redis的时候默认链接的是0号库。3.0之后的版本分布式实现Redis cluster只允许使用0号库。flushdb/flushallflushdb只会清除当前数据库flushall清除所有数据库...
2022-06-04 09:42:05
296
原创 Redis-键遍历
1.全量遍历键keys pattern支持pattern匹配,使用的是glob风格的通配符*代表匹配任意字符?匹配一个字符[]代表匹配部分字符[1,3]代表匹配1,3,[1-10]代表匹配1到10的任意数字\x用来做转义,匹配星号和问号需要进行转义删除所有以video字符串开头的键,redis-cli keys video* | xargs redis-cli delRedis是单线程架构,执行keys很可能造成阻塞,生产环境可以执行如下操作:1.在一个不对外提供服务的Redis从节点上执行,这样不会阻塞客
2022-06-03 17:13:45
388
原创 Redis-键管理
Redis执行命令的速度非常快,10万/秒,当然这也取决于机器的性能,可以大致归纳为以下四点:1 Redis的所有数据都是存放在内存中的,2 Redis是用C语言实现的,一般来说C语言实现的程序“距离”操作系统更近,执行速度相对会更快。3 Redis使用了单线程架构,预防了多线程可能产生的竞争问题。·......
2022-06-03 16:37:21
189
原创 Bean的初始化过程
1.生成BeanDefinition扫描某个包路径,并得到BeanDefinition的Set集合2. 合并BeanDefinitionSpring中支持父子BeanDefinition。根据child来生成Bean对象之前,需要进行BeanDefinition的合并,得到完整的child的 BeanDefinition。3.加载类BeanDefinition合并之后,就可以去创建Bean对象了,而创建Bean就必须实例化对象,而实例化就 必须先加载当前BeanDefinition所对应.
2022-02-17 20:29:41
4097
原创 RocketMQ一些细节执行流程
NameServer功能一 是维护Broker的服务地址并进行及时的更新。二 是给Producer和Consumer提供服务获取Broker列表启动流程整个NameServer的核心就是一个NamesrvController对象。响应客户端请求的。在创建NamesrvController对象时,有两个关键的配置NamesrvConfig 这个是NameServer自己运行需要的配置信息。 NettyServerConfig 包含Netty服务端的配置参数,默认占用了9876端口。
2022-02-09 21:32:53
1532
原创 Netty设计精髓
主从Reactor线程模型NIO多路复用非阻塞无锁串行化设计思想支持高性能序列化协议零拷贝(直接内存的使用)ByteBuf内存池设计灵活的TCP参数配置能力并发优化无锁串行化设计思想在大多数场景下,并行多线程处理可以提升系统的并发性能。但是,如果对于共享资源的并发访问处理不当,会带来严重的锁竞争,这最 终会导致性能的下降。为了尽可能的避免锁竞争带来的性能损耗,可以通过串行化设计,即消息的处理尽可能在同一个线程内完成,期间 不进行线程切换,这样就避免了多线程竞争和同步锁.
2022-02-08 20:30:07
592
原创 RocketMQ如何保证消息不丢失+消息顺序+处理积压消息+消息轨迹
使用RocketMQ如何保证消息不丢失?1、哪些环节会有丢消息的可能?其中,1,2,4三个场景都是跨网络的,而跨网络就肯定会有丢消息的可能。然后关于3这个环节,通常MQ存盘时都会先写入操作系统的缓存page cache中,然后再由操作系统异步的将消息写入硬盘。这个中间有个时间差,就可能会造成消息丢失。如果服务挂了,缓存中还没有来 得及写入硬盘的消息就会丢失。2、RocketMQ消息零丢失方案1》 生产者使用事务消息机制保证消息零丢失1、为什么要发送个half消息?有什...
2022-01-24 22:00:19
6200
1
原创 InnoDB 引擎底层事务的原理
MySQL 中事务的原子性是通过 undo log 来实现的,事务的持久性是通过 redo log 来实现的,事务的隔离性是通过读写锁+MVCC 来实现的。在事务的具体实现机制上,MySQL 采用的是 WAL(Write-ahead logging,预写 式日志)机制来实现的。在使用 WAL 的系统中,所有的修改都先被写入到日志中,然后再被应用到系 统中。通常包含 redo 和 undo 两部分信息。使用了 WAL, 在重启之后系统可以通过比较日志和系统状态来决定是继续完成操作还是 撤销操作。r
2022-01-23 20:53:23
924
原创 InnoDB的内存结构
InnoDB 数据字典 (Data Dictionary Header)InnoDB 存储引擎特意定义了一些列的内部系统表(internal system table)来 记录这些这些元数据:某个表属于哪个表空间,表里边有多少列,表对应的每一个列的类型是什么, 该表有多少索引,每个索引对应哪几个字段,该索引对应的根页面在哪个表空间 的哪个页面,该表有哪些外键,外键对应哪个表的哪些列,某个表空间对应文件 系统上文件路径是什么InnoDB 的 Buffer Pool缓存的重要性对于使用 I...
2022-01-22 14:54:55
1416
原创 InnoDB 的磁盘存储结构
表空间是一个抽象的概念,对于系统表空间来说,对应着文件系统中一个或 多个实际文件,一般是(ibdata1);对于每个独立表空间(也就是上图的 File-Per-Table Tablespaces)来说,对应着文件系统中一个名为表名.ibd 的实际文 件。可以把表空间想象成被切分为许许多多个页的池子,当我们想为某个表 插入一条记录的时候,就从池子中捞出一个对应的页来把数据写进去。 InnoDB 是以页为单位管理存储空间的,我们的聚簇索引(也就 是完整的表数据)和其他的二级索引都是以 B+树的形式保存到
2022-01-22 09:44:53
565
原创 InnoDB 页结构
InnoDB 记录存储结构和索引页结构InnoDB 是一个将表中的数据存储到磁盘上的存储引擎,真正处理数据的过程是发生在内存中的,所以需要把 磁盘中的数据加载到内存中,如果是处理写入或修改请求的话,还需要把内存中 的内容刷新到磁盘上。InnoDB 采取的方式是:将数据划分为若干个页,以页作为磁盘和内存之间交 互的基本单位,InnoDB 中页的大小一般为 16 KB。也就是在一般情况下,一次最 少从磁盘中读取 16KB 的内容到内存中,一次最少把内存中的 16KB 内容刷新到 磁盘中。我们平时是.
2022-01-22 09:14:28
537
原创 Spring 是如何解决循环依赖的
哪三级缓存DefaultSingletonBeanRegistry类的三个成员变量命名如下: 一级缓存这个就是我们大名鼎鼎的单例缓存池用于保存我们所有的单实例bean privatefinalMap<String,Object>singletonObjects=newConcurrentHashMap<>(256); 二级缓存 ,用户缓存我们的key为beanName value是我们的早期对象(对象属性还没有来得及进行赋值)private f...
2022-01-17 22:11:15
325
原创 MYSQL-一条SQL是如何执行的
组件结构连接器 数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次 查询就断开连接,下次查询再重新建立一个。 开发当中我们大多数时候用的都是长连接,把连接放在Pool内进行管理,但是长连接有些时候会导致 MySQL 占用内存涨得特别 快,这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。所以如 果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是 ...
2022-01-16 10:42:00
128
原创 MYSQL-explain
模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是 执行这条SQL 注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中 在查询中的每个表会输出一行,如果有两个表通过join连接查询,那么会输出两行 explain extended:会在 explain 的基础上额外提供一些查询优化的信息。...
2022-01-16 09:32:01
327
原创 垃圾收集器
一个Tomcat就是一个进程,配置一个jvm参数。安全点:当线程执行到安全点的时候会校验GC标记,如果标记为1的话,操作系统会将当前线程挂起,当所有用户线程挂起的时候开始GC。
2022-01-13 21:50:09
134
原创 内存泄漏怎么分析
1.使用top命令,首先分析CPU占用比较高的线程的代码场景中分页查询大数据量的时候,一页数据过多时,User对象中变量定义大的话,会占用很大内存。
2022-01-13 20:57:53
757
原创 Class常量池、字符串常量池与运行时常量池 对象池
一 、Class常量池:是Class文件中的资源仓库,Class文件中除了包含类的版本 字段 方法 接口等描述信息外,还有一项信息就是常量池:用于存放编译期生成的各种字面量和符号引用。二 、常量池:用于存放编译期生成的各种字面量和符号引用。使用 javap -v 类.class 将16进制的字节码文件,生成可读的的JVM字节码指令文件。加载到内存的时候变成运行时常量池。三、字符串常量池...
2022-01-10 21:49:06
265
原创 JVM调优工具,GC日志分析确定Full GC原因
Java VisualVM:查看各个分区的变化情况Arthas:下载一个jar包,arthas-boot.jar,通过命令运行 java -jar arthas-boot.jar回车之后查看系统中运行的Java进程。命令使用:1.dashboard:查看Java进程下的各个线程的运行情况 state cpu,以及内存各个区域的使用情况2,Thread tid:查看有问题代码的位置3.Thread -b:查看死锁的线程4.jad 类全路径.类名查看类的内
2022-01-09 16:16:34
1829
原创 JVM的内存模型(运行时数据区 )
JDK结构:Java程序最终运行的是二进制的机器码,JVM结构:利用命令查看编译的字节码文件Javap -c name.class字节码执行引擎:修改程序计数器和执行class文件。开启一个线程执行垃圾回收。动态链接:把符号引用转换成直接引用,符号:方法名 变量名。直接引用:方法 变量对应的内存地址,在一个方法内调用另一个方法的时候会去动态链接中获取这个方法的地址。方法出口:在main中调用一个方法,该方法执行完之后,需要知道返回到main中的哪一行。以及处理调用
2022-01-09 15:53:00
238
原创 通过常用命令Jstat Jinfo 分析新生代的对象移动到老年代
jinfo 查看jvm参数 :jinfo -flags pid查看Java系统参数:jinfo -sysprops pidJstat可以查看堆内存各部分的使用量,以及加载类的数量。jstat 【-命令选项】【vmid】【间隔时间(毫秒)】【查询次数】 1秒=1000毫秒垃圾回收统计jstat -gc pid 查看程序内存使用及GC压力整体情况查看新生代内存统计 jstat -gcnewcapacity老年代垃圾回收统计 jstat -gcold pid堆内..
2022-01-04 22:00:30
971
原创 排查内存orJVM内存飙高
首先用top命令查看各个进程占用的CPU大小1.用jps查看进程id2.jmap 查看内存的信息,实例个数及占用内存的大小1.使用top -p <pid> 显示Java进程的内存情况2.按H 获取每个线程的内存情况33.找到CPU占用过高的线程id4.转为十六进制的线程id,也就是操作系统锁对应的线程id nid5.执行 jstack tid|grep -A 10 nid, 通过管道操作,打印10行Jstack Thread-0 线程名 prio=5 优先级.
2022-01-04 21:18:32
493
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅