自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 问答 (2)
  • 收藏
  • 关注

原创 Reference源码分析

强引用指的是,程序中有直接可达的引用,而不需要通过任何引用对象,如Object obj = new Object();中,obj为强引用。

2023-04-05 21:19:58 148

原创 数据结构之字典树 Java实现

数据结构之字典树 Java实现

2022-09-24 12:01:46 348

原创 MySql Innodb change buffer

MySql Innodb change buffer更改缓冲区当数据库记录发生增删改时,如果表中创建非唯一的普通索引,那么对应的索引也需要更改如果对应的索引页不在内存中 则需要从磁盘读取 而且都是随机IO 性能开销较大所以设计了更改缓冲区 暂时记录下更改操作 待下次从磁盘读取对应的页时从更改缓冲区查出与对应页相关的更改记录 合并得到最新的数据页状态这样减少了磁盘IO的次数 同时后台也会有线程定期进行merge操作数据库正常关闭时 也会进程merge操作 同时更改缓冲区也会持久化操作到磁盘中下

2021-08-24 22:46:52 101

原创 Redis---ACID

Redis—ACIDA 原子性redis能够提供部分原子性MULTI 开启事务命令 1命令 2EXEC直到服务器收到EXEC命令才真正执行命令,此前命令1、2都被暂时存放在队列1:如果命令1或2发送到服务器 就检测出命令异常 那么所有命令都不会执行 保证了原子性2:接受命令时没有检查出错误 具体执行时发现错误 此时正常执行的命令还是能成功执行 此时出现了同一事务部分操作成功 部分失败 没有保证原子性3:执行事务时实例宕机,那么重启时 实例会保存部分事务操作 如果开启了AOF日志 则可以

2021-08-05 22:14:56 120

原创 Redis---并发访问控制

Redis—并发访问控制假如有这么一个场景,redis缓存了一个购物网站的商品库存,同时有两个用户对A商品下单购买了,分别都从redis读取了库存量,然后减一,又分别存回了数据库,此时商品库存应该减2,但是只减少了 1。对此,多个客户端并发访问redis时,需要进行一定的访问控制不需要加锁实现并发访问控制1:像是简单的数值加减操作,可以调用redis提供的一些原子操作INCR/DECR进行增值减值操作2:将多个不是原子操作的的操作合并在一起中写入LUA脚本执行,redis能保证lua脚本执行时是原

2021-08-05 21:50:46 1189

原创 Redis--缓存淘汰之LRU和LFU

Redis–缓存淘汰之LRU和LFULRULeast Recently Used 最近最少使用 强调时效性像是一个链表,元素再次被访问或者刚刚插入链表都会放入头部,当需要淘汰时,则先从尾部开始淘汰。越靠前面的是越最近被访问的 越靠后面是越久未被访问的由于LRU算法需要维护一个包含所有元素的链表,且每次数据被访问都要移动元素的位置,如果有大量数据被访问 就会有大量的数据需要在链表内移动对于redis来说 额外的性能开销太大 redis希望尽可能更少的占用内存 尽可能快所以redis对LRU进行了

2021-08-03 22:44:34 209

原创 Redis--主从数据同步

1:从库刚刚加入,这是需要执行一次全量复制,首先需要与主库进行协商,向主库发送psync ? -1 命令,主库收到命令后回复 FULLPSYNC {自己的id} {自己的偏移量}然后开始执行BGSAVE命令 保存当前数据库状态 生成RDB文件 并传输给从库从库收到文件后 首先清空自身的数据库 然后加载RDB文件由于在此过程中 主库还是可以接收到用户的写请求 主库会暂时将这些命令记录到replaciton buufer 最后发送到从库 从库再重新执行这些命令 保持与主库数据一致性2:全量复制完毕之后

2021-08-03 21:50:42 82

原创 Redis内部数据结构----压缩列表

Redis内部数据结构----压缩列表一:内存模型结合源码来看比较清晰首先是一个压缩列表的辅助性元素,除存储元素之外额外共需要十一个字节,分别能够帮助我们知道压缩列表总共占用了多少个字节,压缩列表元素个数,快速定位到最后一个元素,以及压缩列表结束的位置。// 返回占用的总字节数#define ZIPLIST_BYTES(zl) (*((uint32_t*)(zl)))// 返回到最后一个元素的偏移量#define ZIPLIST_TAIL_OFFSET(zl) (*((uint3

2021-07-29 21:29:23 113

原创 Linux 系统上调试Redis

Linux 系统上调试Redis1:在电脑上安装ubuntu系统,可以通过虚拟机,当然你有先成的服务器也是很方便。2:在ubuntu系统上安装Clion,官网上有对应的版本,直接下载个三十天的试用的就行3: 打开Clion,进入https://github.com/vawoftd/redis-5.0.8 拉取源码到本地4:调试过程中出现了两个错误 一是缺失release.h这个文件 找一个已经编译好的linux版的Redis 在src文件下会有这个文件 移动到第三步拉取到源码的src目录下二是&

2021-07-21 22:35:37 169

原创 Python爬虫 基于代理IP 获取爬取豆瓣[爱旅行爱摄影]小组前50页帖子中的所有图片

Python爬虫 基于代理IP 获取爬取豆瓣[爱旅行爱摄影]小组前50页帖子中的所有图片import datetimeimport osimport randomimport reimport requestsfrom bs4 import BeautifulSoup# 爬取前十页左右不需要登录 后续页面需要先登录 然后获取到的服务器传回来的cookiecookies = { 'bid': 'IugKbNlTOO4', '__gads': 'ID=17955457aba8

2021-06-21 13:01:48 489

原创 操作系统--内存管理之页替换策略

操作系统–内存管理之页替换策略内存管理使用分页机制时,将逻辑地址分成若干固定大小的页,并不是所有逻辑页对应的物理页都存在与内存中,有些可能会存放在硬盘中,这样做的好处是超越了实际物理内存大小限制,对于暂时不需要用到的页块不加载进内存也减缓了内存的压力。页替换策略希望做到的是尽然较少页快被访问时是出于硬盘当中,需要临时加载进内存,因为访问硬盘性能开销太大只有当某个存在硬盘的页快需要加载进入内存,且此时内存已满时才考虑相应的页替换策略最优假设做优的策略是将最晚才会用到的页块换出,这样能保证换出的页块

2021-05-08 22:10:40 541

原创 操作系统--内存管理之分页

操作系统–内存管理之分页进程创建时,操作系统会为其分配地址空间,进程看到的地址空间并不是实际内存的物理地址,而是逻辑地址,这样做的优点是用户程序方便使用以及安全。操作系统以及相关的硬件维护逻辑地址到实际物理地址的映射分页将逻辑地址空间按照固定大小分成若干页将物理地址按照与逻辑地址相同大小分成若干物理页这样做的好处是提高了内存的利用率进程看到的地址空间是连续的 但是每一个逻辑页对应的物理页可能是非连续的 这样便解决了连续内存分配过程中产生的外部碎片问题 当然还会存在一些小的内部碎片,即分配给进程的

2021-05-08 11:35:40 483

原创 操作系统

操作系统从进程手中获取CPU控制权三种方式进程调用系统调用进程执行出现异常某件事件发生产生的中断

2021-05-06 13:56:11 47

原创 JVM虚拟机--Garbage FIrst收集器

JVM虚拟机–Garbage FIrst收集器JDK9 发布时确认其为服务器端默认的垃圾收集器与旧垃圾收集器理念差异过去的垃圾收集器都是有确定的目标范围,要么是在新生代(Mior GC),要么老年代(Major GC),或者整个Java堆(Full GC)G1可以面向堆内存任何部分来组成回收集,衡量标准不是基于分代,而是那块内存中垃圾数量,Mixed GC模式设计目标是 在用户线程停顿时间可控的情况下 尽量获得更高的吞吐量Region将连续的堆划分为多个大小相等的独立区域,每一个区域都可以根据

2021-04-23 14:17:06 50

原创 JVM虚拟机--CMS垃圾回收器

CMS垃圾回收器第一个并发收集器 基于标记-清除 老年代收集器1:初始标记将于GC Roots直接关联的对象标记,用户线程需要阻塞2:并发标记与用户线程并发执行3:重新标记对并发标记过程中存活但被标记未垃圾的对象再次扫描,用户线程需要阻塞4:并发清除将标记为垃圾的对象清除,与用户线程并发执行优点:由于在整个过程中耗时最长的并发标记和并发清除都是和用户线程并发执行,所以总体来说整个GC过程都是和用户线程并发执行的。减少了用户在GC过程中的停顿时间缺点:1:由于CMS采用增量更新解决可

2021-04-23 11:26:51 77

原创 Java 对象如何为其分配内存

Java 对象如何为其分配内存new一个对象时,一般会将其分配在运行时数据区域的堆内存当中,具体又是如何分配呢?这个与采用的垃圾收集器有关,如果垃圾收集器在GC时会进行对象移动,即压缩,那么内存空间就是连续的,可以用一个指针指向空闲内存和已用内存的界限,那么新分配一个对象,只需要移动指针即可。这种方法存在问题时有可能出现线程安全问题时,多线程同时创建对象时,可能会出现指针碰撞,即两个对象只移动了一个对象所占内存空间的距离。解决指针碰撞的一个方法是,为每个线程在堆内维护一个线程缓冲区(TLAB) 即每

2021-04-22 21:31:39 84

原创 IO模型

同步与异步标志:请求发起方对消息的结果是主动去询问还是接受被动通知主动询问就是同步被动接受通知异步(大多采用回调函数)阻塞与非阻塞通常指的IO操作调用函数之后线程处于什么状态来判定阻塞状态:阻塞运行状态:非阻塞...

2021-04-22 12:42:51 58

原创 设计模式--原型模式

设计模式–原型模型原型模式即根据一个实例对象获取这个对象所对应类的一个实例对象。Java中的clone()方法就是一种原型模式clone方法是object类中的方法,所以所有对象都可以调用这个方法复制一个实例对象,前提是实现Cloneable接口浅拷贝浅拷贝指的是只拷贝对象成员的值,基本数据类型就是直接复制值,引用数据类型就是复制引用地址,所以前后两个对象中的引用数据类型变量指向的都是同一块内存地址。对象的clone方法就是浅拷贝,想要实现深拷贝就得重写Cloneable接口的clone方法。

2021-04-21 15:28:50 45

原创 设计模式--单例模式

设计模式–单例模式某个类的实例对象全局只需要使用一个,使用单例模式优点:避免对象被重复创建,节省空间,提升效率避免对同一类的不同实例操作产生逻辑错误饿汉式变量在声明时便初始化public class HugerSingleton { private static HugerSingleton hugerSingleton=new HugerSingleton(); public HugerSingleton() { } public HugerSingleton getIns

2021-04-21 14:58:17 186

原创 JVM 垃圾回收

JVM 垃圾回收参考文章链接:https://zhuanlan.zhihu.com/p/363224802在C/C++中我们创建一个对象,为其分配内存空间之后,是需要程序员手动释放内存,清理不需要的对象(垃圾)。而在java中JVM虚拟机是会有后台的GC线程帮我们自动清理的。一、什么是垃圾Java程序中每new一个对象,都会在堆或者栈上分配对应的内存空间。A a = new A()那么如何确定这个对象什么时候变为垃圾呢?垃圾:程序中的一块内存没有被任何变量持有引用,导致这块内存无法被这

2021-04-20 21:58:34 76

原创 一次IO读取文件的流程

首先某个线程需要读取文件时需要告知操作系统 进行系统调用因为CPU执行速度远大于IO速度线程会被阻塞 放入阻塞队列这时CPU当然不会闲着会从就绪队列 选一个线程占有CPU执行此时文件也正在被拷贝到内存现在硬盘拷贝文件到内存 是不需要CPU操作可以看出此时 谁也没闲着 这就是操作系统设计精妙的地方单文件拷贝完毕 会向CPU发出中断而后将之前阻塞的线程重新放入就绪队列等待调度运行这就是传统的阻塞IO...

2021-04-19 23:45:33 360

原创 2021-04-12

HashMap学习笔记1:JDK1.7与JDK1.8区别1.7底层的数据结构是数组+链表1.8底层的数组结构是数组+链表+红黑数1.7 插入元素时 如果出现哈希冲突采用的是头插法1.8 插入元素时 如果出现哈希冲突采用的尾插法1.7在多线程情况下进行扩容操作时,有可能会出现链表循环。从而造成程序死循环。2:为什么数组大小要设置位2的n次幂底层数组之所以设置成为2的n次幂,是因为我们再利用key的hash值(HashMap重写了hash方法)与数组长度减一进行&运算时,只有数组长度为2

2021-04-12 16:21:01 39

原创 排序算法之堆排序

数据结构之堆1 堆的特性它是完全二叉树通常用数组来实现 将二叉树的结点按照层序遍历放入数组 如果一个结点的位置为k 则父节点为k/2 左右子节点分别为2k,2k+1每个结点都大于等于它的两个子节点 或者每个结点都小于等于它的两个子节点2 堆的API设计3 堆的实现3.1 上浮算法private void swim(int k){ //通过循环比较插入元素与其父元素大小...

2020-04-27 10:14:16 116

原创 欢迎使用CSDN-markdown编辑器无敌

这无敌里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用...

2019-05-31 16:02:42 56

空空如也

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

TA关注的人

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