自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis(13)----浅谈Redis的主从复制

在Redis中,用户可以通过SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器,我们称呼被复制的服务器为主服务器,而对主服务器进行复制的服务器则被称为从服务器假设有两个服务器那么服务器A就会成为服务器B的从服务器,服务器B也就是服务器A的主服务器进行复制的主从服务器双方的数据库将保存相同的数据,概念上将这种现象称作”数据库状态一致“,或者简称”一致“Redis2.8Redis2.8。......

2022-07-23 10:25:02 575 1

原创 Redis(12)----Redis服务器

Redis服务器负责与多个客户端建立网络连接,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据。并通过资源管理来维持服务器自身的运转。

2022-07-17 15:57:32 1168

原创 Redis(11)----Redis客户端

服务器是典型的一对多服务器:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复通过使用由I/O多路复用技术实现的文件事件处理器,服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信。每个与服务器建立连接的客户端,服务器都为其建立了相应的结构,这个结构保存了客户端当前的状态信息,以及执行相关功能时需要用到的数据结构。服务器状态结构的属性是一个链表,这个链表保存了所有与连接的客户端的状态结构,批量操作客户

2022-07-10 14:48:31 3538 3

原创 Java多线程(8)----Executor框架

本文中涉及一些与线程池相关的概念,可以先看这个在中,使用线程来异步执行任务。如果为每一个任务都分配一个新线程来执行,这些线程的创建与销毁都将会消耗大量的计算资源。这种策略可能会使处于高负荷状态的应用最终崩溃的线程既是工作单元,也是执行机制。从JDK5开始,把工作单元与工作机制分离开来:工作单元分为和,执行机制则由框架提供。在虚拟机的线程模型中,线程会被一对一映射为本地操作系统线程。线程启动时会创建一个本地操作线程;线程终止时,这个操作系统线程也会被回收,通常操作系统会调度所有线程并将它们分配给可用的。而在上

2022-07-07 20:36:37 614 1

原创 Redis(10)----AOF持久化

有关RDB持久化的可以看这个除了持久化功能之外,还提供了持久化功能。与持久化通过保存数据库中的键值对来记录数据库状态不同,持久化是通过保存服务器所执行的写命令来记录数据库状态的。例如执行下面的几条命令:持久化的话,就会将三个键的键值对保存到文件中;而则会将这三个命令保存到文件中,还原数据库时,再执行这三条命令进行数据还原被写入到文件中的命令是按照的命令请求协议格式保存的,因为的命令请求格式是纯文本格式,所以可以直接打开文件,例如上面的命令,在文件中会是这样保存的:的一行的命令是服务器自动添加的,其他均是客

2022-07-05 13:46:05 249

原创 Redis(9)----RDB文件结构

有关文件生成相关的可以看:RDB持久化本文涉及到的各种对象:Redis对象与数据结构一个完整的文件的示意图如下:【为了方便区分变量、数据、常量,全文中用全大写单词标示常量,用全小写单词标示变量和数据】示例:一个文件的部分可以保存任意多个非空数据库,假设有一个服务器,其0号与3号数据库非空,那么其RDB文件为:而每个非空数据库在中又是按以下结构进行保存的:文件中的每个部分都保存了一个或以上数量的键值对,如果键值对带有过期时间的话,那么键值对的过期时间也会被保存在内如果不带有过期时间的话,结构会是这样的:带

2022-07-04 15:43:30 1084

原创 Redis(8)----RDB持久化

是内存数据库,数据库状态存储在内存中,为了进行数据持久化,需要将这些数据保存在磁盘中。因此提供了持久化功能。持久化既可以手动执行,也可以根据服务器配置选项定期执行,该功能可以将某个时间点上的数据库状态保存到一个文件中。持久化所生成的文件是一个二进制文件,通过该文件还可以还原生成文件时的数据库状态有两个命令可以用于生成文件,一个是,另一个是两者的区别在于:和命令如下:和命令是负责创建文件的,至于载入文件,并没有提供命令,只要服务器在启动时检测到文件存在,就会自动载入值得一提的是,由于文件的更新频率会比文件的

2022-07-03 14:32:24 423

原创 Redis(7)----数据库与过期键

Redis服务器将所有数据库都保存在服务器状态:redisServer结构的db数组中,db数组中每个元素都是一个redisDb结构,每个结构代表一个数据库

2022-06-30 12:44:21 226

原创 Redis(6)----对象与数据结构

Redis基于这些数据结构创建了一个对象系统。这个系统包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象。使用对象的好处之一就是可以根据使用场景的不同,选择相应的数据结构以优化使用效率。...

2022-06-27 18:19:07 537

原创 Java多线程(7)----浅谈线程池

Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或者并发执行任务的程序都可以使用线程池。线程池能带来的好处:当提交一个新的任务到线程池后,线程池的处理流程如下:值得注意的是,当线程池中的线程数大于等于,线程池也就完成了预热,之后再进来新任务,几乎所有的任务都是执行步骤3【大致流程可以理解为:优先让核心线程池的线程数达到充盈,借助新起的其他工作线程来辅助完成额外的任务】流程示意图如下:工作线程:线程池创建线程时,会将线程封装成工作线程, 在执行完 任务后,还会循环获取工作队列里的任务来执行。线程

2022-06-26 15:32:38 500

原创 Java多线程(6)----浅谈13个原子操作类

Java从JDK5开始提供了包,包中的原子操作类提供一种用法简单、性能高效、线程安全地更新一个变量的方式。因为变量的类型有很多种,所以在包一共提供了13个类,属于4种类型的原子更新方式,分别是:包里的类基本都是使用实现的包装类值得一提的是,以其内部用于存储目标整数值的变量是用进行修饰的2,原子操作类2.1,原子更新基本类型:原子更新布尔类型:原子更新整形:原子更新长整型三个类提供的方法几乎一模一样,所以以为例包提供了3种基本类型的原子更新,以源码为例:可以发现它是先把转为整型,在使用进行C

2022-06-25 17:00:08 441 4

原创 Java多线程(5)----浅谈读写锁

是一个排他锁,这种锁在同一时刻只允许一个线程进行访问。在实际生产中,多个线程同时读一个资源是不会产生并发问题的读写锁在同一时刻可以允许多个线程访问,但是在写线程访问时,所有的读线程和其他写线程均会被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁来提高性能。读写锁是通过分离读锁与写锁,以实现共享读和独占写那么同步状态的设计是一个问题。读写锁使用整型变量来维护多个读线程和一个写线程的状态读写锁将变量切分成了两个部分,用高16为表示读,低16位表示写因为读写锁是一个可重入锁,所以这里的读状态统计

2022-06-24 17:22:45 300

原创 Java多线程(4)----浅谈重入锁

重入锁,顾名思义就是支持重进入的锁:它表示该锁能够支持一个线程对资源的重复加锁。初次之外,该锁还支持获取锁时的公平和非公平选择重进入是指任意线程在获取锁之后能够再次获取该锁而不会被锁阻塞,该特性的实现需要解决以下两个问题:是通过AQS实现自定义同步器来实现锁的获取和释放,以非公平性实现为例,其源代码如下:该方法增加了再次获取同步获取同步状态的逻辑:即当判断如果该锁已经被获取之后,在下一个分支中,判断试图获取的线程是否是持有锁的线程!同样的,每当线程重复获取该锁,就会有相应的释放锁的动作,下面是的如果该

2022-06-23 18:04:11 134

原创 Redis(5)----浅谈压缩列表

压缩列表(ziplist)是列表键和哈希键的底层实现之一。当列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么是短字符串,Redis就会用压缩列表作为列表键的底层实现Redis的其他数据结构相关如下:简单动态字符串链表字典整数集合压缩列表是Redis为了节约内存开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表可以包含任意多个节点(),每个节点可以保存一个字节数组或者一个整数值。下面是各个部分的详细说明:以下面的压缩列表为例每个压缩列表节点都可以保存一个字节数组或

2022-06-22 11:03:58 280

原创 Redis(4)----浅谈整数集合

整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现Redis的其他数据结构相关如下:简单动态字符串链表字典如果一个集合键中,其存储的元素都是整数值时,那么这个整数键的底层实现就会是整数集合2.1,结构这个整数集合的相关结构如下:2.1.1,contents数组是整数集合的底层实现:整数集合的每个元素都是数组的每一个元素项,每个元素项在数组中按值的的大小从小到大有序地排列,并且数组中不存在重复项

2022-06-19 16:11:12 330

原创 Redis(3)-----浅谈字典

前言Redis的五大数据类型之一的hash,当一个哈希键存储的键值对满足一定条件时,Redis会转用字典进行键值对的存储。字典Redis中的字典的结构如下:typedef struct dict{}dict;

2022-05-30 15:55:21 151

原创 Redis(2)----浅谈list(链表)

1,前言读《Redis设计与实现》所做笔记作为一种常用的数据结构,链表内置在很多高级的编程语言里面。因为Redis使用的C语言并没有内置这种数据结构,所以Redis构建了自己的链表实现。2,链表2.1,链表节点链表中的每个节点的结构如下所示:typedef struct listNode{ //前置节点 struct listNode *prev; //后置节点 struct listNode *next; //节点的值 void *value;}listNode这些节点

2022-05-28 18:39:04 180

原创 Java多线程(3)----浅谈队列同步器(AQS)

浅谈队列同步器AQS

2022-05-24 15:41:48 264

原创 MySQL----浅谈InnoDB存储引擎的文件(1)

前言MySQL数据库和InnoDB存储引擎有这样几种文件:参数文件日志文件错误日志文件二进制日志文件慢查询日志文件查询文件socket文件pid文件MySQL表结构文件存储引擎文件文件参数文件参数文件的读取当MySQL启动时,会去读取配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数。MySQL实例启动的时候也可以不需要参数文件,这时所有的参数值取决于编译MySQL时指定的默认值和源代码中指定参数的默认值。但是如果MySQL在默认的数据库目录中没有找

2022-05-15 15:23:11 423

原创 Redis(1)----浅谈SDS(简单动态字符串)

1,前言读黄健宏老师的《Redis设计与实现》所作笔记2,概述Redis并没有直接使用C语言传统的字符串,而是自己构建了一种名为简单动态字符串的抽象类型,并将SDS用作Redis的默认字符串表示。Redis只有在不需要对字符串值进行修改的场景下,才会使用C的字符串,例如在打印日志时。SET msg "hello world" 执行上面的命令后,Redis将在数据库中创建一个新的键值对,其中:键值对的键是一个字符串对象,其底层实现是一个保存着字符串“msg”的SDS键值对的值也是一个字符串

2022-05-12 20:12:58 357

原创 Vue3实现简易的音乐播放器组件

前言用Vue3实现一个简易的音乐播放器组件其效果图如下所示:实现这个组件需要提前做的准备:引入ElementUI引入字节跳动图标库一张唱见图片将要播放的音乐上传到文件服务器上,并提供一个能在线访问的链接【这里使用的是阿里云的OSS服务】准备ElementUIElementUI的引入可以参照其官网的引入方式;字节跳动图标库组件的【上一首】【播放】【下一首】【音量】等图标都是来源自这个图标库,这是其安装文档在main.js中,我是这样引入的://引入字节跳动图标库im

2022-05-06 10:55:31 8719

原创 【LeetCode 2】两数相加

题目给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-two-numbers著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。思路题目提供两条链表,将每条链表的对应位置上的值相加,

2022-05-05 17:23:28 76

原创 Java多线程(2)-----浅谈volatile关键字

1,前言volatile常被提及的便是其内存可见性以及禁止指令重排序在计算机中,软件技术和硬件技术有一个共同的目标:在不改变程序执行结果的前提下,尽可能提高并行度。2,volatile2.1,内存模型既然是多线程,那么就离不开一个点:消息传递线程之间的通信机制有两种:共享内存消息传递Java内存模型(JMM)使用的正是共享内存的方式。共享内存在共享内存的模型中,多个线程之间共享程序的公共状态,通过读-写内存中的公共状态进行隐式通信正因为这是一种隐式的通信,才会给程序员进行

2022-04-05 22:18:59 588

原创 Java多线程(1)----浅谈锁升级

1,锁升级1.1,前言我们都知道在Java多线程编程中,synchronized一直是一个重量级的角色。而Java中每一个对象都可以作为锁,具体的使用方式:用于修饰普通同步方法时,锁是当前实例对象用于修饰静态同步方法时,锁是当前的Class对象用于修饰代码块的时候,锁是synchronized括号中配置的对象tips:记住锁是哪些对象!!!当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。那么锁到底存在哪里呢?锁里面会存储什么信息呢?对于方法同步和代码

2022-04-04 22:48:39 444

原创 Unity--Floyd画出最短的路径

1,前言给定一个场景:有两个点:A和B若干个辅助点一些障碍物(层级为WallLayer,标签为Wall)在辅助点的帮助下,将A和B用线连起来,同时画出来的线不能穿过墙壁。求怎么画才能画出最短的路线2,脚本实现person代表A点target代表B点secondaryParent代表所有辅助点的父物体所有的障碍物,其层级为WallLayer,且障碍物的标签为Wallusing System;using System.Collections;using System.Coll

2022-01-20 21:09:47 2791

原创 MySQL----表存储引擎

1,前言存储引擎是MySQL区分于其他数据库的一个最重要特性。存储引擎的好处是:每个存储引擎都有各自的特点,能够根据具体应用建立不同的存储引擎表。MySQL的核心:存储引擎MySQL本身也提供了预定义的存储引擎接口,用户可以根据存储引擎接口来编写自己的存储引擎由于MySQL的开源特性,存储引擎可以分为MySQL官方引擎和第三方存储引擎有些第三方存储引擎非常强大,如大名鼎鼎的InnoDB存储引擎(已经被Oracle收购了)2,存储引擎2.1,InnoDB存储引擎InnoDB引擎支持事务,主要面向

2022-01-19 22:40:32 1541

原创 MySQL----高性能索引策略(1)

前言读《高性能MySQL》所做笔记高性能索引策略正确地创建和使用索引是实现高性能查询的基础,接下来要做的是如何真正发挥这些索引的优势。独立的列如果查询中的列不是独立的,那么MySQL就不会使用索引。“独立的列”是指索引列不能是表达式的一部分,也不能是函数的参数。示例:SELECT actor_id FROM sakila.actor WHERE actor_id+1=5;SELECT ... WHERE TO_DAYS(CURRENT_DATE) -TO_DAYS(date_col) &l

2022-01-18 22:51:30 609

原创 MySQL----创建高性能的索引(1)

1,前言读《高性能MySQL》所做笔记2,索引类型在MySQL中,索引是在存储引擎层而不是在服务器层实现的【MySQL的存储引擎是插拔式的】,所以并没有统一的索引标准:不同存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引。即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同。2.1,B-Tree树索引概述当讨论索引的时候,如果没有特别指明类型,多半说的是B-Tree索引,它使用B-Tree数据结构进行数据存储【实际上很多存储引擎使用的是B+Tree】B+T

2022-01-15 17:16:55 405

原创 MySQL----Schema与数据类型优化(2)

1,前言读《高性能MySQL》所做笔记,若有不当之处,敬请指出2,选择优化的数据类型2.1,使用枚举(ENUM)类型代替字符串类型枚举列可以将一些不重复的字符串存储到一个预定义的集合中。MySQL存储枚举的时候非常紧凑,会根据列表值的数量压缩到一个或者两个字节中。MySQL在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存数字-字符串的映射关系的查找表。示例:绕过这种限制的方式有两种:按照需要的顺序定义枚举列在查询中使用FIELD()函数显式地制定排序顺序,但这会导致

2022-01-11 22:05:58 341

原创 MySQL----Schema与数据类型优化(1)

1,前言读《高性能MySQL》所作笔记2,选择优化的数据类型选择正确的数据类型对于获得高性能至关重要下列是几个简单的原则,有助于做出更好的选择更小的通常更好值得注意的是,选择小数据类型的同时,要注意数据的范围。因为在schema的多个地方增加数据类型是一个非常耗时和痛苦的操作。若无法确定那个数据类型是最好的,那就选择不会超出范围的最小的数据类型简单就好例如证书相比字符操作代价会更低【例如排序】例子应该使用MySQL内建的类型而不是字符串来存储日期和时间应该用整形存储IP地址【

2022-01-09 17:01:53 630

原创 intern()的使用

1,前言关于在JDK6和7/8下使用intern()若有不当之处,请您指出,您的指点是我的荣幸……2,正文在JDK6之中,将这个字符串对象尝试放入字符串常量池。如果串池中有,则并不会放入字符串常量池中,并返回已有的字符串常量池中的对象的地址;如果没有,会把此对象复制一份,放入字符串常量池中,并返回字符串常量池中的对象地址JDK7开始,将这个字符串对象尝试放入串池中。如果串池中有,则并不会放入。返回已有的字符串常量池中的对象的地址;如果没有,则会把对象的引用地址复制一份,放入字符串常量池中,并返回

2021-11-02 23:45:23 154

原创 JVM(2)类加载器

前言学习康师傅的JVM视频所作记录,不当之处,请您指出……正文概述类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识【模数】ClassLoader只负责class文件的加载,至于它是否可以运行,则有Execution Engine决定加载的类信息存放于一块称为方法区的内存空间,除了类的信息之外,方法区还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)【这里值得一提的是,存放在方法区

2021-10-31 20:08:37 114

原创 JVM(1)初识

1,前言学习康师傅的JVM视频所作记录,不当之处,请您指出……2,正文2.1,整体架构2.2,Java代码执行过程虚拟机的启动Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的(这个类不同的虚拟机指定的是不同的类)虚拟机的执行一个运行中的java虚拟机有着一个清晰的任务:执行java程序程序开始执行时他才运行,程序结束他就停止了执行一个所谓的java程序的

2021-10-26 22:52:58 85

原创 LRU页面置换算法--基于栈

前言使用栈实现LRU页面置换算法的代码LRU页面置换算法可以使用基于计数器,或者基于栈两种方式进行实现基于计数器若有不当之处,请您指出,您的指点是我的荣幸代码实现import java.util.Scanner;/** * LRU页面置换算法--基于栈 */public class LRUStack { public static void main(String[] args) { //当链表未达到指定长度时,用来表示链表的长度 in

2020-09-13 17:21:27 1957

原创 LRU页面置换算法--基于计数器

1,前言有关LRU页面置换的学习记录若有不当之处,请您指出,您的指点是我的荣幸2,LRULRU页面置换,也称为最近最少使用算法每个进程运行时会被分配一定数量的帧,这是进程所占有的空间。程序的代码一般是存于外存(一般理解为磁盘)中执行代码的时候,只有当代码所在的页被操作系统从外存调入内存,并放置在进程所占有的空间中,代码才能执行而进程逻辑上占有的页数是远远大于分配到的帧数的(页是逻辑概念上的,帧是物理概念上的)就比如:进程A逻辑上占有的页数为20页,但执行的时候分配到的帧数只有3帧(对应

2020-09-08 21:13:33 1743

原创 死锁避免----银行家算法实现

前言有关银行家算法的记录因为这篇博客写的很棒,所以就不班门弄斧了,就不介绍基础概念了。直接放码过来!若有不当之处,请您指出,您的指点是我的荣幸实现给定4个进程,每个进程3个资源类型,每种资源的数量也是给定的/** * 银行家算法 */public class Banker { //统计有多少个进程执行完成了 public static int count=0; //每次用Available跟Need比较的时候,记录是否还有能执行的进程 public

2020-09-06 14:24:24 265

原创 同步问题----优先级反转

1,同步问题1.2,优先级的反转当一个高优先级的进程通过信号量机制访问共享资源时,发现这个资源正在被低优先级的进程所持有。而且因为内核数据通常是用锁保护起来的,所以高优先级的进程不得不等待低优先级的进程用完资源。这也就造成了高优先级进程被低优先级进程阻塞。1.3,示例假如有这么三个进程:A,B,C它们的优先级顺序:A<B<CC进程需要使用一个共享资源:X,但此时A进程正持有X资源,C进程不得不等待A进程完成任务释放资源;但此时,B进程到达了,抢占了A进程;间接的,B进程影响了

2020-09-04 13:38:40 249

原创 Peterson解答

前言有关Peterson解答的记录;若有不当之处,请您指出,你的指点是我的荣幸!Peterson解答Peterson解答是一个经典的基于软件的临界区问题的解决方案Peterson算法适用于两个进程交错执行临界区与剩余区在本文中,这两个进程分别是P0和P1Peterson解答要求两个进程共享两个数据项int turn;boolean flag[2];变量turn表示哪个进程可以进入临界区;即如果turn==i,那么进程Pi允许在临界区内执行。数组flag表示哪个进程准备进入临界区。例

2020-09-04 09:57:07 395

原创 进程调度----FCFS,SJF,优先级调度,RR

1,FCFS先服务先调度FCFS策略可以通过FIFO队列容易的实现。当一个进程进入就绪队列时,它的PCB会被连接到队列尾部。当CPU空闲时,它会分配给位于队列头部的进程,并且这个运行进程从队列中移去。缺点:平均等待时间往往很长。假设有这么三个进程P1,P2,P3按顺序到达,并且按FCFS顺序进行处理进程执行时间P124P26P36[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6fa29zs7-1599115297171)(

2020-09-03 14:42:56 3383

原创 小白的汇编之路(八)----数据处理的两个基本问题

1,前言学习王爽老师的《汇编语言》一书所做的记录2,数据处理的两个基本问题涉及到数据处理、运算,就不可避免的需要解决两个问题:处理的数据在什么地方要处理的数据有多长2.1,bx,si,di,bp在8086CPU中,只有这4个寄存器能用在[……]中进行内存单元的寻址。但要注意它们之间的搭配# 正确的搭配mov ax,[bx]mov ax,[bx+si]mov ax,[bx+di]mov ax,[bp]mov ax,[bp+si]mov ax,[bp+di]# 错误的搭配

2020-09-03 10:02:14 194

空空如也

空空如也

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

TA关注的人

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