- 博客(22)
- 收藏
- 关注
原创 Redis 数据结构之【快速列表】
含义:Redis 早期版本存储 list 列表数据结构使用的是压缩列表 ziplist 和普通的双向链表linkedlist,也就是元素少时用 ziplist,元素多时用 linkedlist。// 链表的节点struct listNode<T> {listNode* prev; listNode* next;T value;}// 链表struct list {listNode *head;listNode...
2020-09-07 13:50:30 224
原创 Redis 数据结构之【压缩列表】
含义:压缩列表是一块连续的内存空间,元素之间紧挨着存储,没有任何冗余空隙。内部结构: struct ziplist<T> { int32 zlbytes; // 整个压缩列表占用字节数 int32 zltail_offset; // 最后一个元素距离压缩列表起始位置的偏移量,用于快速定位到最后一个节点 int16 zllength; // 元素个数 T[] entries; // 元素内容列表,挨个挨个紧凑存储 int8 ...
2020-07-16 14:33:09 219
原创 Redis 数据结构之【字典】
含义: dict 是 Redis 服务器中出现最为频繁的复合型数据结构,除了 hash 结构的数据会用到字典外,整个 Redis 数据库的所有 key 和 value 也组成了一个全局字典,还有带过期时间的 key 集合也是一个字典。zset 集合中存储 value 和 score 值的映射关系也是通过 dict 结构实现的。struct RedisDb { dict* dict; // all keys key=>value dict* expires...
2020-07-16 10:55:03 226
原创 运行时数据区
1.程序计数器:一块很小的内存区域,是线程私有的,看作当前线程所执行的字节码的行号指示器;2.java虚拟机栈:和程序计数器相同,都是每个线程私有的,每个方法运行是都会创建一个帧栈,里面包含: 局部变量表、 操作数栈、 动态链表、 方法出口等信息。一个方法的调用直至结束,就是一个入栈和出栈的过程;3.本地方法栈:和虚拟机栈类似,不同的是虚拟机栈服务java方法(字节码),本地方法栈服务于native 方法修饰的方法;4.堆:虚拟机中管理最大的一块内存,是所有线程共...
2020-07-16 10:43:00 133
原创 Redis 数据结构之【SDS】
含义: Redis 中的字符串是可以修改的字符串,在内存中它是以字节数组的形式存在的。我们知道 C 语言里面的字符串标准形式是以 NULL 作为结束符,但是在 Redis 里面字符串不是这么表示的。因为要获取 NULL 结尾的字符串的长度使用的是 strlen 标准库函数,这个函数的算法复杂度是 O(n),它需要对字节数组进行遍历扫描,作为单线程的 Redis 表示承受不起。Redis 的字符串叫着「SDS」,也就是 Simple Dynamic String。它的结构是一个带长度信息...
2020-07-15 14:37:29 295
原创 Redis 淘汰算法
当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换 (swap)。交换会让 Redis 的性能急剧下降,对于访问量比较频繁的 Redis 来说,这样龟速的存取效率基本上等于不可用。 在生产环境中我们是不允许 Redis 出现交换行为的,为了限制最大使用内存,Redis 提供了配置参数 maxmemory 来限制内存超出期望大小。 当实际内存超出 maxmemory 时,Redis 提供了几种可选策略 (maxmemory-policy)...
2020-07-14 13:43:21 741
原创 Redis Info 指令
在使用 Redis 时,时常会遇到很多问题需要诊断,在诊断之前需要了解 Redis 的运行状态,通过强大的 Info 指令,你可以清晰地知道 Redis 内部一系列运行参数。 Info 指令显示的信息非常繁多,分为 9 大块,每个块都有非常多的参数,这 9 个块分别是: 1、Server 服务器运行的环境参数 2、Clients 客户端相关信息 3、Memory 服务器运行内存统计数据 4、P...
2020-07-14 11:35:06 134
原创 BitSet的原理介绍
原理众所周知,Java的BitSet使用一个Long(一共64位)的数组中的每一位(bit)是否为1来表示当前Index的数存在不。但是BitSet又是如何实现的呢?其实只需要理解其中的两个方法:set get就能够理解BitSet的实现原理是什么了。set先看源代码:public void set(int bitIndex) { if (bitIndex < 0) throw new IndexOutOfBoundsException("bi...
2020-07-09 15:40:10 570
原创 Nginx 你不得不知道的底层
Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文从底层原理分析Nginx 的进程模型Nginx 服务器,正常运行过程中: 多进程:一个 Master 进程、多个 Worker 进程。 Master 进程:管理 Worker 进程。对外接口:接收外部的操作(信号);对内转发:根据外部的操作的不同,通过信号管理 Worker;监控:监控 Worker 进程的运行状态,Worker 进程异常终止后,自动重启 Worker 进程。 Worke...
2020-06-26 16:21:42 509
原创 Redis 性能优化
Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了优化(大部分命令操作时间复杂度都是 O(1)),但由于 Redis 是单线程执行的特点,因此它对性能的要求更加苛刻,本文将通过一些优化手段,让 Redis 更加高效的运行本文将使用以下手段,来提升 Redis 的运行速度:缩短键值对的存储长度; 设置键值的过期时间; 禁用长耗时的查询命令; 使用 slowlog 优化耗时命令; 使用.
2020-06-22 15:40:12 1016
原创 多线程之AbstractQueuedSynchronizer(AQS)
AQS 是java.util.concurrent.locks包下一个抽象的队列式同步器类;一、简介:为JUC(java.util.concurrent)包下的很多锁和同步器提供了基础(通俗的讲把 JUC下依赖与AQS 的同步器和锁比作车,AQS 就是车的动力系统,具体有哪些车的动力系统依赖AQS呢 ?别急慢慢往下看);大家先简单看完 javadoc 文档:大概能定位到几个重点:1.子类必须定义改变此状态的受保护的方法: 子类必须定义改变次状态的受保护方法,aqs 内部定义了单...
2020-06-03 17:36:30 155
原创 jvm 调优参数
参考链接: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html功能开关: 参数 限制 默认值 说明 示例 -XX:-AllowUserSignalHandlers linux、Solaris 不启用 允许为java进程安装信号处理器,信.
2020-05-22 23:36:56 192
原创 垃圾回收器
并行收集:指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态。并发收集:指用户线程与垃圾收集线程同时工作(不一定是并行的可能会交替执行)。用户程序在继续运行,而垃圾收集程序运行在另一个CPU上。吞吐量:即CPU用于运行用户代码的时间与CPU总消耗时间的比值(吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾收集时间 ))。例如:虚拟机共运行100分钟,垃圾收集器花掉1分钟,那么吞吐量就是99%;新生代收集器: Serial: 最基...
2020-05-22 23:35:15 133
原创 垃圾收集算法
一. 标记 - 清除算法:分为“标记”和 “清除”两个阶段;方案: 1.标记所有需要回收的对象; 2.统一回收被标记的对象;缺点: 1.效率问题,“标记”和“清除”效率都不高; 2.空间问题,被“清除”后会产生大量的不连续的内存碎片(当大对象找不到足够的连续空间,就得提前GC );二. 复制算法:方案: 将内存分为两块,每次只使用一块。当一块用完时,就将还存活的对象复制到另外一块,继续使用另外一块;优化: 1.无需考虑...
2020-05-22 23:32:18 122
原创 java对象的创建过程
1.首先在常量池查找是否有该对象的应用符号;2.然后判断该类是否加载、编译、初始化;3.没有则加载、编译、初始化;4.给对象分配堆内存(指针碰撞和空闲列表);5.把对象分配到的内存初始化设置为0(不包含 Object header),目的为了保证对象的实例字段在java中可以不赋值就可以使用;6.对对象进行必要设置,设置对象头(所属类的实例,如何找到元数据信息,对象的哈希码,对象的GC分代年龄等和根据当前的运行状态的不同,是否启用偏向锁等);7.以上虚拟机层面已经创建完成,等java
2020-05-22 23:31:32 158
原创 io流实现读取文件
这是一个io流读文件的实例,fileName是需要读取的文件,我这里是用来读日志的public static void readerLog(String fileName) { StringBuffer sb = new StringBuffer(); FileInputStream fis; InputStreamReader
2017-11-08 13:33:52 411
原创 static关键字
1:静态语句块,加载的时候先加载;2:修饰类,该类是内部类;3:修饰反法,该反法是静态反法,可以通过类名直调用;4:修饰变量,该变量是静态变量,类变量在类加载的时候初始化,而且只被初始化一次;
2017-10-23 09:34:39 157
原创 oracle数据库基础操作
oracle 基本操作变量 between “”1“”and “”5“”变量值在1-5,之间的;group by 变量 haring 条件;用变量分组,条件限制;count(变量) 统计变量的值;left join /right left 左右连接,左边的全查,右边的条件查;case when 条件 then 值 else 值 end 别名 ,符合条
2017-10-13 16:19:55 208
原创 java项目实现简单的oracle存储过程
java项目实现简单的存储过程,这里dao,service,控制层,代码不用变,配置也不用变(新手上路,就简单的实现了一个添加操作)存储过程 源码附上:(最简单的那种,没有返回类型),表格前提是要有的,create or replace procedure setemp(v_empno emp.empno%type,v_ename emp.ename%type,v_job em
2017-10-11 16:21:11 400
原创 apache下mail 邮件工具类
我采用的qq邮件的发送的,需要导入 apache.commons.mail 这个jar包,其他种类的邮件大同小异,得换服务器名字和端口号,话不多说,直接上代码,(新手上路,请指教,勿喷)public class MailUtil { public boolean send(Mail mail) { //发送email对象 H
2017-10-10 16:33:54 1882
原创 easyui 中edatagrid 时间类型的修改
从oracle中获取的时间类型不做处理,一般是带有时分秒的,而我们只需要年月日的时候就可以才用下面的反法来执行一:比较简便formatter:function(value,row,index){var unixTimestamp = new Date(value); return unixTimestamp.toLocaleDateString();}, 这样就可以了。
2017-10-10 08:41:29 244
原创 easyui中datagrid的destroyUrl方法源码的修改从而使传送的数据是对象
打开jquery.edatagrid.js,搜索(Ctrl+f) opts.poster.call(dg[0], opts.destroyUrl, {id:idValue}, function(data) 将里面的{id:idValue}替换为row 就可以了。原因:原来的值var idValue = row[opts.idField||'id']; 赋给了固定的id, 我这样可以是直接传送一
2017-10-09 18:06:38 1217
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人