自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

lordky的博客

good good study ,day day up

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

原创 Redis之过期键删除策略

  我们知道,Redis数据库是基于内存的,但是如果一些不用的键在内存中一直存在,那么久而久之,就有可能会发生oom的情况。所以,redis数据库提供了常用的EXPIRE命令或者PEXPIRE命令,用户可以使用这两个命令以秒或者毫秒为精度为数据库中的某个键设置生存时间。在经过指定的时间后,redis服务器就会自动删除生存时间为0的键。  可以设置键的生存时间的命令如下:   虽然有四种不同的命令用于指定过期时间,但是实际上,无论使用哪一种命令,最终都会转换为PEXPIREAT命令来执行那么,redis是如

2022-06-12 10:40:42 1044

原创 详述常见的Redis对象_STRING、LIST、SET、ZSET、HASH

  前面我们详细探讨了Redis的部分数据结构,如SDS、链表、压缩列表、字典以及跳跃表的实现。Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、集合对象、有序集合对象等。而每一个对象都由一个RedisObject表示。如下。typedef struct redisObject { // 类型,STRING、LIST、HASH、SET、ZSET... unsigned type:4; // 编码方式,INT、

2022-05-21 11:25:56 284 2

原创 Redis数据结构(四)跳跃表—skiplist

  我们知道,跳跃表是一种有序的数据结构,查询平均复杂度为O(logN),最坏O(N)。其效率可以和平衡树相媲美,而且其实现更为简单.  Redis只在两个地方用到了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构,除此之外,跳跃表在Redis里面没有其他用途。所以我们可以看到关于skiplist的定义都是在server.h中(3.0及之前在redis。)我们先来...

2022-05-16 11:27:10 401

原创 Redis数据结构(三)字典

定义:  字典,又称为符号表,关联数组或者映射,是一种用于保存键值对的抽象数据结构。  我们在很多高级编程语言中都能找到字典的踪迹,比如说java中的Map数据结构。一个键(key)可以和一个值(value)进行关联,可以用过key来对value值进行修改删除。Redis采用C语言实现,然而C语言中并没有内置这种数据结构,但是这种数据结构又是非常必要的,所以Redis自己构建了这种数据结构。  字典对于Redis来说可以说是非常非常重要的数据结构了,我们常用的Redis数据库,创建一个键值对的时候,就

2022-05-08 16:21:17 608

原创 Redis数据结构(二)列表健底层实现—链表、压缩列表

列表健底层有两种实现,一种是链表,另一种为压缩列表(ziplist)。当列表对象可以同时满足以下两种情况的时候,列表对象将使用压缩列表实现列表对象保存的所有字符串元素的长度都小于64字节列表对象保存的元素数据库小雨512个当不能同时满足这两个条件时就会使用链表实现。 下面我们具体聊聊这两种数据结构(一)链表  链表做为常用的数据结构,很多高级的编程语言里面都内置了该数据结构比如说java、python等。但是由于Redis使用的C语言并没有内置这种数据结构,所以Redis构建了自己的链表实现。

2022-05-06 22:06:36 401

原创 Redis数据结构(一)SDS

一、关于SDS  Redis没有直接使用C语言传统的字符串表示(也就是以空字符结尾的字符数组),而是自己构建了一种名为简单字符串的抽象类型(Simple Dynamic String),并将SDS用作了Redis默认的字符串表示。在Redis3.0之前,对于sds的结构定义如下:struct sdshdr { // 记录buf数组中已使用字节的数量,等于SDS所保存字符串长度 unsigned int len; // 记录buf数组中未使用字节的数量 unsigned int

2022-05-02 17:56:40 1734

原创 详述NIO相关组件_Channel、Buffer、Selctor

(一)Channelchannel(通道)是Java NIO相关组件之一。Channel表示IO源与目标打开的连接,我们既可以从通道中读取数据,又可以写数据到通道中。以下是常见的几个ChannelFileChannel 从文件中读写数据DataGramChannel 通过UDP读写网络中的数据SocketChannel通过TCP读写网络中的数据ServerSocketChannel可以监听新进来的TCP链接,对每一个新进来的链接都会创建一个socketChannel(二)Buffer

2022-05-01 15:03:43 207

原创 详述JVM垃圾收集器(二)常见的垃圾收集器

一、Serial GC与Serial Old GC收集器Serial收集器  Serial垃圾收集器可以说是最基础的、历史最悠久的垃圾收集器。在JDK1.3.1之前可以说是虚拟机新生代唯一的选择。顾名思义,该收集器是一个单线程工作的垃圾收集器,它属于新生代的垃圾收集器,采用标记-复制算法。注意,这里的“单线程”并不仅仅是说它只会使用一个处理器或者一条收集线程去完成垃圾收集工作,更重重要的是强调它在进行垃圾收集的时候,必须暂停其他所有的工作线程,也就是我们说的"Stop The World"。  这种

2022-04-23 12:14:05 1527

原创 详述JVM垃圾收集器(一)垃圾收集算法

一、关于垃圾收集器我们在聊具体的垃圾收集器前,我们先来聊聊几个问题。1.哪些内存需要被回收?我们知道,Java内存运行时数据区的各个部分,如图。其中程序计数器、虚拟机栈、本地方法栈随着线程而生,线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊的执行着入栈和出栈的操作,所以这几个区域的内存分配和回收都具有确定性,在这几个区域内就不需要考虑如何回收的问题。因为当方法结束或者线程结束的时候,内存自然而然的就跟着回收了。Java堆和方法区这两个区域则有着很显著的不确定性,垃圾收集器所关注的正是这部分内存

2022-04-14 09:30:49 523

原创 Java虚拟机(JVM)运行时数据区与类加载过程

根据《Java虚拟机规范》规定,java虚拟机所管理的内存包含了以下几个部分,如图:1.程序计数器:咱们先来瞅瞅这个很有意思的一个区域,此内存区域时唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError情况的区域。程序计数器时一块较小的内存空间,可以将它看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,他是程序控制流的指示器,分支、循环、跳转、异常处理等基础功能都是需要依赖这个

2022-04-07 17:09:38 978 1

原创 java常见的排序算法(四)计数排序、基数排序

一、计数排序主要思想该排序运用的场景比较少,主要运用在数据量比较大,但是取值范围比较小的情况下。比如说年龄。采用一个新的数组来存储原数组值对应的下标,值为原数组值出现的次数,最后再从头开始读取这个新数组的值就能得到相应的排序结果如图,定义一个新数组(计数数组),数组长度为原数组的取值范围最大值。初始化每个位置的值为0,遍历原数组,在新数组(计数数组)下标值为原数组位置上的值+1。最终遍历计数数组,写入原数组,比如从a0的值为2,原数组的头2两就为0,0,a1值为2,就继续写两个1,以此类推,得

2022-04-02 09:44:11 235

原创 java常见的排序算法(三)快速排序

主要思想:其实就是在一个数组中找到一个轴,将大于这个轴的数放一边,小于这个轴的数放另一边,这样就把数组分成了两部份,然后递归分别将前后两部分再找一个轴,做相同操作,直至排列完全这里有一个轴的概念,这个轴其实就是数组中任意取一个值,一般取边界值。经典的快速排序中,采用的是单轴快排,而改进版的采用了双轴快排。咱们先瞅瞅单轴:如图,选取数组中边界9为轴,定义两个指针,i,j分别从两端往中间遍历,当i遇到比轴大的就与j比轴小的值进行交换这样最终将轴与i+1进行交换,得到一次的循环的结果,然后将轴排好的

2022-03-30 09:25:55 1118

原创 java常见的排序算法(二)归并排序,TimSort

主要就是采用递归的思想将数组切分为两个排好序的两个数组,然后将两个数组合并为一个。此排序算法稳定,对象的排序一般都采用此排序如图:将数组切分为两个排好序的数组,并定义两个指针,i与j,新开辟一个数组空间,比较i与j的大小,i<j则将i的值插入新数组的头部,并将i的指针+1,以此类推,就会得到一个排好序的数组。当然这种排序的时间复杂度较低,为nlog2n,但是由于会开辟新的数组空间,所以,在空间复杂度上会高一些,为n/** * @param needSort 需要排序的数组 * @para

2022-03-28 18:09:18 762 1

原创 java常见的排序算法(一)选择排序,冒泡排序,插入排序,希尔排序

1.选择排序所有排序中最简单也是最没有用的一种排序算法,主要的思想就是,多次循环,依次找出最大致最小的值。时间复杂度为n的平方private static int[] sortArray(int[] arr){ for (int i = 0; i < arr.length; i++) { int min=arr[i]; for (int j = i+1; j < arr.length; j++) { if (min>=ar

2022-03-26 19:18:32 896

原创 多线程高并发学习笔记之关于join()的胡思乱想

引子:在做一道题的时候引发的思考,这道题是这样的:实现一个容器,提供两个方法,add,size写两个线程,线程1添加10个元素到容器中,线程2实现监控元素得个数,当个数到5个时,线程2给出提示并结束答案有多种,比如说用wait()、notify()来实现,LockSupport的park()、unpark()来实现,其中有一种解题的思路是采用Semaphore来实现。但是Semaphore,re...

2020-04-22 15:24:07 289

原创 多线程高并发学习笔记之CAS

什么是CAS?Compare And Set/SwapCAS(乐观锁)是CPU的原语支持,中间是不会被打断的,不会出现指令重排序的问题。那么CAS是怎么保证线程安全的呢?看下图,也就是说,线程在读取数据时不会加锁,但是在写回数据之前会判断一下原来的数据是否已经被更改,如果被更改则重新读取数据,如果没有被更改就写回数据。其实在JUC的很多工具类的实现就是基于CAS的,我们可以简单的看一...

2020-04-11 18:54:23 151

原创 多线程高并发学习笔记之volatile

什么是volatile?volatile是一个特征修饰符(type specifier).volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile有什么作用?1.保证线程可见性2.禁止指令重排序由此引发的问题,什么叫线程的可见性?我们知道所有的线程共享主内存,而每一个线程都有自己的工作内存,当一个线程需要对一个变量进行操作的时候...

2020-04-11 18:13:58 173

原创 多线程高并发学习笔记之synchronized底层实现

初期:早期JDK,Synchronized的实现是重量级的,所谓重量级指的是,synchronized都是要去找操作系统申请锁(也就是JVM会阻塞未获得锁得线程,当锁被释放后,将会唤醒这些线程,而阻塞和唤醒是需要操作系统来完成的,所以需要从用户态切换至内核态),造成synchronized效率很低优化:后期(额…好像是JDK1.6后),Sybchronized在hotspot中的实现如下图所...

2020-04-07 16:06:26 162

原创 服务器搭建,centos(jenkins持续集成,nginx转发,supervisor管理进程)

共同学习,共同进步…1.安装jdkyum install java-1.8.0-openjdk* -y2.安装maven(依赖包)yum install -y maven3.安装git(代码仓库)①yum install -y git②在root目录下创建project以及packagesmkdir projectmkdir packages③下载代码git clone 你的...

2020-03-24 18:40:03 268

空空如也

空空如也

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

TA关注的人

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