自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis底层数据结构之ziplist(压缩列表)

ziplist是Redis中的某些数据类型底层所使用的数据结构Redis中的hash,List,Sorted List这几种类型的数据在某些情况下会使用ziplist来存储。Hash类型当hash类型的数据满足以下条件时,底层使用ziplist存储。当hash键值对个数小于等于 hash-max-ziplist-entries 配置的值,默认512当键值对中值的长度小于等于 hash-max-ziplist-value 配置的值,默认64当hash类型的数据同时满足以上两个条件时,会将val

2021-08-12 21:53:36 3639

原创 缓存穿透,缓存击穿,缓存雪崩及缓存双写一致性解决方案

缓存穿透缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。解决方案:接口层增加校验,过滤掉参数不合法的请求可以将查询结果为不存在的key同样保存到缓存中,value为null,并且设置自动过期时间,这种方式可以避免短时间集中的暴力攻击可以使用布隆过滤器,可以过滤掉绝大部分不存在的key。布隆过滤器及实现方式总结缓存击穿缓存击穿是指大量的请求绕过Redis打到了D

2021-08-09 23:11:15 379

原创 Redis的持久化方式及对比

文章目录三种持久化方式RDB快照(snapshot)手动触发RDB快照保存bgsave命令的执行原理save与bgsave命令的区别AOF(append-only file)AOF文件的内容AOF重写RDB 和 AOF 对比混合持久化机制Redis数据备份策略三种持久化方式Redis总体支持3种持久化方式RDB:以快照的方式保存redis中的数据,是redis默认的持久化方式AOF:以命令的方式记录redis的写操作,需要在配置文件中开启混合持久化:在Redis 4.0以后,redis新增了一

2021-08-08 17:02:03 429

原创 Redis的内存淘汰策略及LRU算法

Redis过期的数据是怎么删除的?Redis对过期key的删除方式有两种。惰性删除。当key过期时先不删除,到下次获取该key的时候,再进行判断,如果发现已经过期,则将该key删除。并且返回NULL。定期删除。Redis后台会有一个定时任务,定时增量的迭代数据,找到过期的key进行删除。每次删除一部分。Redis目前使用的方式是 惰性删除 + 定期删除 混合使用。为什么Redis要定时增量的删除过期的key?​ 很简单,因为Redis是单线程的,所以当Redis在扫描过期数据进行删除的时候

2021-08-05 00:10:55 320

原创 Redis之String类型底层的存储形式

Redis中String类型的三种编码String类型在底层对应的有三种编码int: 当value为long类型的整数值时raw:当value为大于44字节的字符串时embstr:当value为小于44字节的字符串时为什么embstr 形式,可以存储最大字符串长度是44字节?首先我们需要看一下如果存储一个String类型的value,至少需要占用多少的内存空间。在之前的一篇文章中,我们提到,redis中的value其实是以RedisObject的方式存储的。再来看一下RedisObj

2021-07-31 18:38:44 734

原创 Redis常用命令整理

来源:redis官方网站redis中文版网站String通用命令命令描述SET key value设置一个key对应的字符串值GET key获取key的值MSET key value key value …批量设置多个key对应的字符串值MGET key1 key2 …批量获取多个key的值STRLEN key获取key对应的字符串值的长度SETEX key seconds value设置一个key对应的过期时间(秒)和字符串值P

2021-07-27 23:27:17 302

原创 布隆过滤器及实现方式总结

目录布隆过滤器是啥?bitmap布隆过滤器的实现方式降低布隆过滤器误判率的方式总结布隆过滤器的实现方式谷歌Guava实现的布隆过滤器基于Redisson的布隆过滤器基于rebloom的布隆过滤器布隆过滤器的使用场景布隆过滤器是啥?布隆过滤器是一种判断某个元素是否存在于某个大量集合的算法。比如:比如现在有一个集合,保存了10亿个手机号码,现在我要判断某个手机号码是否存在于这个集合中。要怎么判断呢?最简单的方法,就是遍历集合,挨个判断。这种方式对于少量数据可行,但是对于这种海量数据,首先要保存10亿个

2021-07-25 23:23:55 1282 2

原创 Redis中字典dict的rehash和渐进式rehash

字典的作用redis的字典是一个用于维护key和value映射关系的数据结构,与Java中的Map类似。在字典中维护了两个存放数据指针的hash表。同时字典中维护了对hash表的扩容,缩容,key的hash算法等操作。typedef struct dict { dictType *type; void *privdata; //私有数据指针(privdata)由调用者在创建dict的时候传进来,在dictType的某些操作被调用时会传回给调用者, dictht ht[2

2021-07-24 15:10:21 285 4

原创 Redis底层是怎样保存一个key和value的?

在了解这个之前,首先要了解一下redis中定义的几种数据结构。sds(简单动态字符串)SDS以Redis中定义的一种用于存储字符串的数据结构。redis中保存的key都是以sds的形式存储的。sds在redis源码中的定义如下:typedef char *sds;//sdshdr5 is never usedstruct __attribute__ ((__packed__)) sdshdr5 { unsigned char flags; /* 3 lsb of type, and 5

2021-07-23 22:59:07 3220 6

原创 详谈JVM类加载机制

当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM。JVM执行JAVA代码的流程通过Java命令执行代码的大体流程如下:类加载过程在上图中,其中loadClass的类加载过程有如下几步:加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载加载:在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用类的main()方法,new对象等等,在

2021-06-10 23:24:09 682

原创 CentOS7 搭建 MySQL5.7 + Mycat + HAProxy + Keepalived 高可用架构

准备虚拟机CentOS7 虚拟机4台:mysql01(安装Mysql01 和 Mycat01)mysql02(安装Mysql02 和 Mycat02)ha01 (安装HAProxy01 和 Keepalived01)ha02 (安装HAProxy01 和 Keepalived01)其中, Mysql01 和mysql02 互为主备, ha01和ha02互为主备mysql01 和 mysql02 分别安装MySQL:CentOS7安装MySQL5.7进入mysql01, 创建测试库

2021-06-10 15:32:52 787

原创 CentOS7安装Mycat过程

关闭防火墙systemctl stop firewalld systemctl disable firewalld先安装JDK(因为Mycat依赖JDK)yum install java-1.8.0-openjdk* -yjava -versioncd /usr/lib/jvm ll #查看jdk1.8.*_***.x86_64 文件名配置环境变量vi /etc/profile在文件最后添加:export JAVA_HOME=/usr/lib/jvm/java-1.8.0-op

2021-06-10 15:20:55 825

原创 CentOS7安装MySQL5.7

关闭防火墙systemctl stop firewalld systemctl disable firewalld安装MySQLyum install -y wgetwget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpmyum -y install mysql57-community-release-el7-10.noarch.rpmyum -y install mysql-communi

2021-06-10 15:01:38 620

原创 MySQL基本的主从复制搭建过程及原理

虚拟机和安装准备首先准备三台虚拟机,搭建一主两从架构。我这里以CentOS7为例。服务器名分别为mysql01, mysql02, mysql03。 其中,mysql01 作为Master节点,两外两个作为Slave节点,从主节点同步数据。首先要在三台虚拟机上安装mysql,安装过程见:CentOS7安装Mysql8全过程配置主节点安装完成后, 进入mysql01, 编辑配置文件 my.cnfvi /etc/my.cnf在配置文件中加入以下配置:#server-id唯一,必须要配置, 而

2021-05-23 21:21:24 1976 4

原创 CentOS7安装Mysql8全过程

为了保证安装顺利,首先关闭防火墙systemctl stop firewalld systemctl disable firewalld查看是否有安装过MySQLrpm -qa | grep -i mysql如果安装过,那么先删除MySQLyum -y remove MySQL-*安装MySQLsudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm sudo yum --en

2021-05-23 16:13:39 1928

原创 在Springboot中手写一个简单的本地缓存并在启动时加载数据到缓存中

闲来无事,琢磨了一下,如果需要用到缓存,但是又刚好在没网络, 本地仓库又没有对应依赖的情况下,要怎么办。这种情况下,就只能手动定义一个集合或Map,将要缓存的数据保存在里面。但是会有不支持过期时间的问题。所以就考虑了一下如何自定义一个缓存的工具类,可以实现类似单机版Redis的功能。首先该类需要有保存数据和获取数据两个供用户使用的方法。我的定义如下:/** * 向缓存中保存数据 * @param key * @param value */public void set(String

2021-05-15 21:45:08 3173

原创 Redis主从复制及工作原理

主从复制解决的问题Redis虽然读写速度很快,但是也会产生读压力过大的情况,为了分担读的压力,可以搭建Redis主从架构。主节点可以进行读写,从节点只对外提供读的功能。从节点的数据是从主节点同步过来。主从复制搭建过程这里以CentOS7 + Redis6为例。首先在虚拟机上安装3个Redis实例,安装过程见CentOS7 安装 Redis6全过程这三个Redis的端口分别为: 6379, 6380, 6381安装完成后,虚拟机上则运行了三个Redis实例:现在我们要将运行在6379端口的R

2021-05-12 23:47:57 1977

原创 CentOS7 安装 Redis6全过程

准备安装包第一种方式: redis.io 官网下载 redis-6.0.9 上传到/opt 目录下第二种方式:cd /optyum intall -y wgetwget https://download.redis.io/releases/redis-6.0.9.tar.gz准备安装前系统环境(安装和升级GCC环境)yum install gccgcc -vyum -y install centos-release-scl # 升级到9.1版本yum -y install devto

2021-05-09 14:43:16 2107

原创 数据库事务的ACID和事务的隔离级别

事务的四大特性事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性。原子性(Atomicity) :事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。一致性(Consistent) :在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性。隔离性(Isolation) :数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对

2021-04-01 20:52:52 1896

原创 JVM之虚拟机栈

虚拟机栈的作用虚拟机栈是线程JVM中线程私有的区域。虚拟机栈是一个先进后出的队列,当一个线程开始执行一个方法,会为该方法创建一个栈帧,压入栈中,当该方法执行完毕,再将该栈帧出栈。每一个方法被调用直至执行完毕的过程, 就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。public class TestStack { public static void main(String[] args) { m1(); } public static void m1() {

2021-03-20 00:15:10 2023 2

原创 进程、线程、纤程的区别

进程通俗的说,进程就是一个程序运行起来的状态。一般情况下,一个程序运行起来之后,都会在操作系统中对应一个进程。从操作系统的角度来说,进程是操作系统进行资源分配的基本单位。线程线程是CPU进行任务调度和执行的基本单位。一个进程往往包含多个线程。在Linux系统下是没有线程的概念的,它是用进程模拟的线程, 一般是某个主进程的子进程,因此把线程叫做轻量级进程。线程的状态(Java)NEW: 新创建了一个线程对象,但还没有调用start()方法。 Thread t = new Thread(

2021-03-05 22:28:45 2034

原创 CPU的乱序执行和内存屏障,JVM指令重排及Java中volatile的底层实现

CPU的乱序执行一般来说,CPU在执行指令时,是按照指令的先后顺序执行的。但是在某些时候,为了提高CPU的执行效率,这些指令的执行顺序可能会被打乱(前提是指令之间不相互依赖)。在单线程的情况下,CPU的乱序执行, 不会影响最终的执行结果。(as-if-serial)但是在多线程情况下,如果多个线程涉及到对共享数据的操作,那么就可能会导致错误的结果。CPU的内存屏障 (禁止乱序执行)如果不想让CPU在执行某些指令时乱序执行,就到用到内存屏障。在CPU对内存做操作时添加一个屏障,这个屏障前后的指令

2021-03-01 22:21:59 2532 3

原创 搞懂计算机内存模型,Cache, Cache Line, MESI协议,伪共享问题,缓存行对齐等问题。

在了解本文内容之前,首先需要对计算机的基本组成和CPU有一个了解。计算机的三大核心部件:1. CPU(中央处理器): 主要负责运算和执行系统的指令,是计算机的运算核心和控制核心。2. Memory(内部存储器):内存,又称主存,临时存放CPU的运算数据,以及与硬盘等外部存储器交换的数据,它是CPU能直接寻址的存储空间,由半导体器件制成。特点是存取速率快。3. IO(输入/输出)设备:比如显示器,鼠标,键盘,耳机等设备。CPU的主要组成部分一个CPU,一般来说,应当包含以下几个主要部分:PC:

2021-02-21 23:24:52 2361

原创 Hystrix实现服务降级的三种方式

在Controller接口上使用@HystrixCommand(fallbackMethod = "timeoutHandler", commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000") }) 在Controller类上使用@DefaultProperties(defaultFal.

2021-01-24 19:29:51 453

原创 浅谈类加载器和类加载过程

类加载器的作用是将类的字节码文件加载到内存中,将类的元数据保存在方法区。类加载过程类的加载过程分三步:加载 -> 链接(验证 -> 准备 -> 解析) -> 初始化加载阶段(Loading):链接阶段(Linking):初始化阶段(Linking):...

2021-01-16 22:00:06 1973

原创 结合Hotspot源码谈谈:为什么CAS的比较和替换操作是原子性的?

系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例

2021-01-12 21:34:00 2399 4

原创 ThreadLocal原理分析及内存泄漏问题

ThreadLocal 的定义及使用:ThreadLocal, 翻译成中文,应该叫 线程局部变量。意思是说,在ThreadLocal中保存的变量,都归当前线程所有,不同线程之间相互隔离,互不影响。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。先看一下使用效果:public class TestThreadLocal { private static Thread

2020-12-28 22:03:20 1959

原创 CAS算法原理及ABA问题

CAS 即Compare And Swap 或Compare And Set , 比较并替换。是乐观锁的一种具体实现方式,通过自旋的方式来实现共享变量的同步机制。了解JMM的话应该知道,当线程在对某个共享变量进行操作时,包括下面几个步骤:1. 首先将主内存的变量值读到 当前线程的工作内存中。(读)2. 然后在工作内存中对变量值进行修改。(改)3. 最后将修改后的值再写入主内存。(写)如下图所示:。。。。到这里不难发现,在上面所说的3个步骤(读-> 改 -> 写), 并不是原子性的

2020-12-28 21:24:54 2065

原创 剑指Offer系列 - 03:数组中重复的数字

找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3限制:2 <= n <= 100000class Solution { public int findRepeatNumber(int[] nums) { Set<Inte

2020-11-30 13:50:29 61

原创 一次完整的HTTP请求流程(浏览器地址栏输入URL,按下回车之后的流程)

1、解析URL。    浏览器会检测这个url是否正确存在,如果不合法,返回一个默认的页面。(比如,如果输入的不是合法的网址,浏览器将调用默认搜索引擎比如百度,对输入的内容进行搜索,返回搜索结果页)。2、DNS解析。    浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址。解析优先级依次为:浏览器缓存 => 系统缓存 => 路由器缓存 => 本地域名服务器(LDNS) =&gt

2020-11-30 13:39:19 3542

原创 TCP/IP协议及TCP的三次握手和四次挥手

TCP/IP协议的分层:    应用层:向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接口。TELNET会话提供了基于字符的虚拟终端。文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能。    传输层:提供应用程序间的通信。其功能包括:一、格式化信息流;二、提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假

2020-11-29 13:56:55 1960

原创 OSI七层模型和TCP/IP协议模型

关于计算机网络相关的基础知识是在大学时期学到过的,不过当时一门心思放在排位上(你懂的),也没有总结的习惯。工作后发现这些东西还是挺重要的。很多大厂的面试也会涉及到这块的内容,所以在这里把相关的知识点做一个梳理。OSI七层模型(协议)    OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。OSI定义了网络互连的七层框架,每一层实现各自的功能和协议,

2020-11-28 22:44:23 2181

原创 InnoDB和MyISAM存储引擎的区别有哪些?

MySQL 在版本5.5之前,默认存储引擎为MyISAM,5.5之后默认为InnoDB-MyISAMInnoDB支持锁类型表锁,不适合高并发操作行锁表锁都支持,默认行锁,适合高并发操作表空间小大事物不支持支持外建不支持支持缓存项只缓存索引不仅缓存索引,还缓存真实数据索引类型非聚簇索引聚簇索引表的行数用一个变量保存了整个表的行数不保存表的具体行数...

2020-06-07 22:06:17 1896

原创 蚂蚁金服:输入两个Node的集合,计算两个集合里,Node的最大重复次数的差

首先给出一个Node类:class Node { int id; }// 输入两个Node的集合,计算两个集合里,Node的最大重复次数的差// 举例:// left = [1, 2, 1, 2, 3], 重复最多的是 1 或 2, 都是出现了[2次]// right = [2, 3, 4, 3, 3, 3],重复最多的是 3,出现了[4次]// diff = 2次 - 4次 = -2int diff(List<Node> left, List<Node&g

2020-06-07 13:34:13 114

原创 (一)JVM整体内存结构及简单介绍

内存结构图类装载器(Class Loader)类加载器的作用是负责将类的字节代码加载到 Java 虚拟机中方法区(Method Area)方法区是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。堆(Heap)堆内存也是被线程共享的区域。用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。虚拟机栈(JVM Stack)栈的内存要远远小于堆内存,栈实际上是一个队列, 遵

2020-06-06 22:10:57 240

原创 final 关键字 在Java中可以用来修饰什么?有什么作用?

类,该类不能被继承。变量,如果是基本类型,则值不可变。如果是引用类型,则变量的引用不能变。方法,该方法不能被重写。

2020-06-05 16:05:55 2192

原创 Spring之AOP介绍 及 使用AOP实现登录日志

文章目录什么是AOP?实现AOP思想的核心角色Spring的通知使用Spring AOP思想实现登录日志什么是AOP?AOP: Aspect Oriented Programming 面向切面编程。是一种编程思想。通过切面织入的方式,对目标业务做功能上的增强。主要目的是将独立的业务或通用的业务行为(比如事物、日志、异常处理等),与核心业务区分开,从代码中抽离出来,以另一种方式,动态织入到目标业务方法的前后。优点:降低代码的耦合度,提高可重用性。实现AOP思想的核心角色关注点: 要对哪些业务方法

2020-06-05 15:37:09 1238

原创 HashMap在JDK1.7和JDK1.8的区别,都在这里了~

详见下图:-JDK1.7JDK1.8数据结构数组+链表数组+链表+红黑树数组元素EntryNode容量初始化时间创建时首次put时hash冲突元素添加位置链首链尾链表死循环情况存在不存在注:HashMap源码分析入口:HashMap 源码及扩容机制分析...

2020-06-05 12:24:00 107

原创 设计模式系列(四):工厂模式,看这篇就够了~

什么是工厂模式?工厂模式(Factory Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。简单工厂:简单工厂又称为静态工厂,定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类或接口简单工厂模式需要有三种角色一个接口或抽象类 。 比如Animal接口多个实体类,接口或抽象类的具体实现产品,实现了接口或继承了抽象类。比如Dog类一个工厂类,

2020-06-03 16:28:25 2039

原创 设计模式系列(一):设计模式的 三大类型 及 六大原则

什么是设计模式?设计模式(Design pattern)是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式代表了最佳的实践,是软件开发人员在软件开发过程中面临的一般问题的解决方案,这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。项目中合理地运用设计模式可以完美地解决很多问题,设计模式通常被有经验的面向对象的软件开发人员所采用。设计模式的三大类别设计模式目前一共有23种。这23种设计模式又可以分为3大类。创建型模式创建型模式提供了一种在创建对

2020-06-02 14:58:51 312

空空如也

空空如也

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

TA关注的人

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