自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis缓存雪崩、击穿、穿透、双写一致性、并发竞争、热点key重建优化、BigKey的优化 等解决方案

在Redis中,一个字符串最大512MB,一个二级数据结构(例如hash、list、set、zset)可以存储大约40亿个(2^32-1)个元素,但实际中如果下面两种情况,我就会认为它是bigkey。(1). 字符串类型:它的big体现在单个value值很大,一般认为超过10KB就是bigkey。(2). 非字符串类型:哈希、列表、集合、有序集合,它们的big体现在元素个数太多。一般来说,string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。

2022-12-08 14:50:31 2008 1

原创 Redis数据持久化机制(备份恢复)、缓存淘汰策略、主从同步原理、常见规范与优化详解

 Redis 提供了 RDB 和 AOF 两种持久化方式,默认开启的是RDB,如果需要AOF,需要手动修改配置文件进行开启。 RDB:是一种对Redis存在内存中的数据周期性的持久化机制,将内存中的数据以快照的形式硬盘,实质上是fork了一个子进程在执行数据存储,采用的是二进制压缩的存储模式。如图: AOF:是以文本日志的形式记录Redis的每一个写入、删除请求(查询请求不处理),它是以追加的方式(append-only)写入,没有磁盘寻址的开销,所以写入速度非常快(类似mysql的binlog)。如图:(

2022-12-07 15:08:07 637

原创 Redis事务、pub/sub、PipeLine-管道、benchmark性能测试详解

(1). 原子性一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 Redis的事务并不是我们传统意义上理解的事务,我们都知道 单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会

2022-12-06 14:55:27 687

原创 Linux之基于Centos系统安装Redis、MySQL、Nginx

(1). 宿主机:centos 8.0(2). Redis源码:【压缩包: redis-5.0.0.tar.gz】 需要自行编译。 (PS:这个压缩包可以直接Centos系统中在线下载 或者去Redis官网先下载,然后copy到Centos系统中)下载地址:  官网:https://redis.io/  中文版:http://www.redis.cn/注:Redis的安装需要下载源码,自行准备环境,进行编译安装。(3). gcc环境:redis是C语言开发的,安装redis需要先将官网下载的源码进行编译,编

2022-12-05 16:55:13 761

原创 Nginx动静分离、缓存配置、性能调优、集群配置

 1个web程序:部署在7061端口,启动 【dotnet NginxWeb.dll --urls="http://*:7061" --ip="127.0.0.1" --port=7061】Nginx程序:监听7000端口 比如单独启动部署在7061端口下的web程序,进行访问,我们会发现,除了请求的加载,还有很多静态 css、js、图片等资源的加载,这些资源的加载也是占服务器带宽的,假设带宽为1m,几个大图片直接就占满了。所以这里引入动静分离,将静态资源单独隔离出来,不占据主服务器的带宽,同时也有利于静态

2022-12-03 14:53:41 850

原创 Redis之String类型和Hash类型的介绍和案例应用

典型的Key-Value集合,如果要存实体,需要序列化成字符串,获取的时候需要反序列化一下。

2022-12-02 14:50:02 663

原创 MySQL索引底层数据结构原理剖析

我们平时所说的:聚集索引(主键索引),次要索引,覆盖索引,复合索引,前缀索引,唯一索引在MySQL5.7和 8.0版本默认都是使用索引,除此之外还有。至于MySQL5.7之前版本,这里就不过多探究了。

2022-12-01 15:25:56 227

原创 深究用户模式锁的使用场景(异变结构、互锁、旋转锁)

本章节,将结合多线程来介绍锁机制, 那么问题来了,什么是锁呢?为什么需要锁?为什么要结合多线程来介绍锁呢?锁的使用场景又是什么呢?DotNet中又有哪些锁呢?在接下来的几个章节中,将陆续解答这些问题。PS:多个线程对一个共享资源进行使用的时候,会出问题, 比如实际的业务场景,入库和出库操作同时进行,库存量就会存在并发问题。所以锁就是用来解决多线程资源竞用的问题。

2022-11-30 15:13:18 149

原创 从多个角度分析顺序表和链表区别和特点

顺序表和链表由于存储结构上的差异,导致他们有不同的特点,从而适用于不同的场景。虽然他们都属于线性表,但他们的存储结构有着本质的不同:1. 线性表存储数据,需要,然后将数据按照次序逐一存储,数据之间紧密贴合,不留一丝空隙, 如下图:2. 链表的存储方式与顺序表截然相反,

2022-11-29 14:55:33 195

原创 链表剖析及自己手撸“单链表“实现基本操作(初始化、增、删、改等)

存储数据元素时,除了存储数据元素本身的信息外,还有一个指针,指向他的后继节点,最后一个元素的指针不指向任何元素。:在单链表的基础上加一个前驱指针,指向前一个元素,是链表可以双向查找,这种结构成为双链表。:将链表最后一个节点的指针指向第一个节点,这样就形成了一个环,这种数据结构叫做单向循环列表.另外还有双向循环列表.

2022-11-28 16:36:13 187

原创 linux常用服务配置、网络配置 和 基于FTP的上传和下载的几种方式

hostname: 查看主机名hostname xxx: 修改主机名(重启后无效)

2022-11-26 14:43:15 176

原创 ThreadPool的线程开启、线程等待、线程池的设置、定时功能

ThreadPool简介:ThreadPool是一个线程池,当你需要开启n个线程时候,只需把这个指令抛给线程池,它将自动分配线程进行处理,它诞生于.Net 2.0时代。ThreadPool与Thread的区别:①:Thread每开启一个异步任务,就需要使用一个Thread,具有专一性,即使Thread已经死掉,仍然需要占用资源。②:ThreadPool能实现n个线程处理n+m个异步任务,且没有死线程,默认都是初始化的。

2022-11-25 14:03:41 411

原创 Nginx负载均衡配置、限流配置、Https配置详解

通过proxy_pass 可以把请求代理至后端服务,但是为了实现更高的负载及性能, 我们的后端服务通常是多个, 这个是时候可以通过upstream 模块实现负载均衡。

2022-11-24 15:17:37 759

原创 MySQL的存储引擎及常用数据类型介绍

MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。。。InnoDB 存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但,且会占用更多的磁盘空间以保留数据和索引。

2022-11-23 15:25:06 135

原创 栈简介、手撸顺序栈、手撸链栈和栈的应用

栈是一种只能从表的一端存取数据且遵循 "先进后出"("后进先出") 原则的线性存储结构。栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构。C#中提供顺序栈:Stack,它不是线程安全的;分析:(1). 栈只能从表的一端存取数据,另一端是封闭的(2). 在栈中,无论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。

2022-11-22 15:25:07 216

原创 数据库索引和EFCore的索引映射

索引用于快速找出在某个列中有某一特定值的行,不使用索引,数据库必须从第一条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间越多, 如果表中查询的列有一个索引,数据库能快速到达一个位置去搜索数据。

2022-11-21 15:50:08 236

原创 Redis分布式锁剖析和客户端的实现

 在传统的单体项目中,即部署到单个IIS上,针对并发问题,比如进销存中的出库和入库问题,多个人同时操作,属于一个IIS进程中多个线程并发操作的问题,这个时候可以引入线程锁lock/Monitor等,轻松解决这类问题。但是随着业务量的逐渐增大,比如"秒杀业务", 肯定是集群部署,这个时候线程锁已经没用了, 必须引入分布式锁。 常见的分布式锁有:数据库、zookeeper、redis. 本节重点介绍redis的分布式锁.如下图: (1).在分布式系统环境下,一个锁在同一时间只能被一个服务器获取;(这是所有分布式

2022-11-19 15:01:12 151

原创 Linux之用户管理、权限管理、程序安装卸载

Ubuntu 推荐使用 apt 进行下载、安装。会从 ubuntu 官网下载(中国区镜像),如果下载速度慢的话,可以设置从其他镜像下载,具体搜索“Ubuntu apt-get 镜像”,执行某些程序的时候,如果程序没安装,还会提示你,比如执行 vim、tree 等。​(2). 指定目录和组名:【sudo useradd -d /home/a a -g mygroup1 -m】,创建一个用户名字叫a,主目录在/home/a,如果主目录不存在,就自动创建主目录,同时用户属于mygroup1组。

2022-11-18 16:03:35 254

原创 深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)

我们发现一个现象,主线程等着这五个子线程执行完毕后才执行,但是我们并没有写线程等待的代码,所以我们可以总结: ①:并行计算,开启多个线程后,不需要再开辟线程等待,直接是主线程完成后续操作。这里也是介绍一个简单的重载:int数组中的个数代表需要进行并行任务的个数,但并不一定所有任务同时执行,也不一定每个任务都是一个新线程执行。我们发现,五个任务中的四个任务同时由不同线程开启,当其中一个任务结束时,第五个任务开启,并由刚结束的任务的线程来执行。①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行。

2022-11-17 15:26:02 305

原创 探究并发和并行、同步和异步、进程和线程、阻塞和非阻塞、响应和吞吐等

操作系统扫盲:1. 对于单核cpu而言(不管单核单线程也好,单核多线程也罢),同一时间只能干一件事!!为了看起像可以“同时干多件事”,windows操作系统把cpu的时间划分为长短基本相同的时间区间,即“时间片”,通过操作系统的管理,把这些时间片依次轮流分配给各个应用使用。2. 操作系统时间片的使用规则:某个作业在cpu分配给它的时间片结束时,整个任务并没完成,那么该作业只能被暂停下来,等待下一轮循环再继续做。

2022-11-16 15:00:22 174

原创 Redis新特性、剖析线程模型(单线程与多线程)

非阻塞 IO 在 Socket 对象上提供了一个选项Non_Blocking ,当这个选项打开时,读写方法不会阻塞,而是能读多少读多少,能写多少写多少。能读多少取决于内核为 Socket 分配的读缓冲区的大小,能写多少取决于内核为 Socket 分配的写缓冲区的剩余空间大小。读方法和写方法都会通过返回值来告知程序实际读写了多少字节数据。有了非阻塞 IO 意味着线程在读写 IO 时可以不必再阻塞了,读写可以瞬间完成然后线程可以继续干别的事了。补充阻塞IO概念:

2022-11-15 15:34:48 204

原创 分布式事务概念、理论、及(2PC、3PC)

在分布式系统中,不同服务之间需要通过网络协作来完成的事务,叫做分布式事务。比如下单业务:先创建订单→扣减库存。1. 访问订单表,创建订单2. 访问库存表:扣减库存 (以上两个表是同一个DB)B. 如果是分布式事务:存在订单微服务和库存微服务,我们请求订单微服务中POrder接口,该接口除了需要调用自身DB创建订单外,还需要调用库存微服务的接口,这就存在网络通信,传统的数据库事务无法满足。1. 订单微服务,创建订单 (本地DB)2. 通过网络调用库存微服务中接口,进行扣减库存。

2022-11-14 17:07:22 196

原创 程序员内功-设计模式篇

(1). 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例(不能new创建对象),其拓展是有限多例模式。(2). 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原对象相同或类似的新实例。(3). 工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。(4). 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。

2022-11-12 15:12:49 129

原创 MySQL锁、事务隔离级别、MVCC机制详解、间隙锁、死锁等

脏读是指一个事务读取到了其他事务没有提交的数据,不可重复读是指一个事务内多次根据同一个查询条件查询出来的“同一行记录的值不一样”,幻读是指一个事务内多次 根据同个条件查出来的记录行数不一样。为了解决事务并发带来的问题,才有了事务规范中的四个事务隔离级别,不同隔离级别对上面问题部分或者全部做了避免。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。

2022-11-11 15:31:47 136

原创 探究多线程和异步

在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并发问题,后面随着处理的系统业务越来越复杂,多线程再也回避不了了,也就借此机会深入研究了一下.Net中的多线程的处理方案。

2022-11-10 16:58:38 135

原创 内存数据库如何发挥内存优势?

内存数据库的计算体系,必须充分利用内存的特征才能获得极致性能。从数据计算的角度来看,内存主要优点有:支持指针引用、支持高速随机访问、并发读取能力强。内存的缺点是:成本高昂、扩容有上限。而 SQL 计算体系中缺乏一些必要的数据类型和运算,比如:缺少记录指针类型,不支持有序运算,JOIN 定义过于笼统,不区分 JOIN 类型等,从原理上就不能充分利用内存的上述特征实现某些高速算法。基于 SQL 的内存数据库,通常只是简单的照搬外存数据结构和运算,会出现各种问题。比如:记录式复制过多消耗 CPU 和内存;

2022-11-09 15:51:57 170

原创 抓包分析 TCP 握手和挥手

首先需要明确的是 TCP 是一个可靠传输协议,它的所有特点最终都是为了这个可靠传输服务。在网上看到过很多文章讲 TCP 连接的三次握手和断开连接的四次挥手,但是都太过于理论,看完感觉总是似懂非懂。反复思考过后,觉得我自己还是偏工程型的人,要学习这些理论性的知识,最好的方式还是要通过实际案例来理解,这样才会具象深刻。本文通过 Wireshark 抓包来分析 TCP 三次握手和四次挥手,如果你也对这些理论感觉似懂非懂,那么强烈建议你也结合抓包实践来强化理解这些理论性的知识。

2022-11-08 17:51:12 248

原创 深入理解Makefile

前面我们声明的BUILDDIR就是一个自定义变量,要注意的是,如果声明了一个和默认变量一样的变量就会覆盖默认变量,这也给我们提供了一个改变默认规则的入口。= 延迟赋值,在Makefile运行时才会被赋值:= 立即赋值,立即赋值是在真正运行前就会被赋值?= 空赋值,如果变量没有设置过才会被赋值+= 追加赋值,可以理解为字符串的加操作延迟赋值指的是在Makefile运行时再赋值。

2022-11-08 13:25:25 175

原创 并发编程中的锁、条件变量和信号量

并发是指多个事情,在同一时间段内同时发生了。和并发经常一起被提到的是并行。并行是指多个事情,在同一时间点上同时发生了。本质上来说,并发是为了程序运行的速度更快。在实际开发中,我们可能会遇到比较耗时的操作,例如I/O操作。在整个程序运行过程中,如果某个阶段因为一直等待I/O而阻塞整个程序,就会降低程序的运行速度。为了提升程序的运行速度,我们可以新开一个线程进行I/O操作,操作完成后通知主线程,从而提升程序的运行速度。锁本质上是一个变量,因此我们需要声明一个某种类型的锁变量才能使用。

2022-11-04 14:45:33 486

原创 详解linux多线程——互斥锁、条件变量、读写锁、自旋锁、信号量

如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。3. 非繁忙等待:如果一个线程已经锁定了一个互斥量,第二个线程又试图去锁定这个互斥量,则第二个线程将被挂起(不占用任何cpu资源),直到第一个线程解除对这个互斥量的锁定为止,第二个线程则被唤醒并继续执行,同时锁定这个互斥量。在线程里也有这么一把锁——互斥锁(mutex),互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只有两种状态,即上锁( lock )和解锁( unlock )。

2022-11-03 15:02:46 304

原创 【C++多线程那些事儿】多线程的执行顺序如你预期吗?

这样,当第一条指令在执行的时候,第二条指令可以进行译码,第三条指令可以进行取指...于是CPU被充分利用了,指令的执行效率也大大提高。那我们在编译的时候把-O3优化选项去掉,尽量让编译器不要进行优化,保持原来的指令执行顺序,应该就可以避免m和n同时为0的结果了吧?嗯...我们又仔细的回顾了一下自己的分析过程:在m和n被赋值的时候,x = 1和y = 1至少有一条语句被执行了...没有问题,那应该就不会出现m和n都是0的情况。​跟我们的预期一致,汇编代码保持了原来的执行顺序,这回肯定没有问题了。

2022-11-02 14:28:40 652

原创 学C++的以后都能从事哪些岗位?

说了这么多,有没有发现好像只会C++是找不到工作的。不管是哪个岗位,在对C++基础的要求上,还会有额外的东西。这其实很好理解,毕竟C++只是一门语言,只是一个工具。就好比你光有一把弓箭,是没办法射大雕的。你还需要许多额外的能力和知识储备,甚至还需要一点预判的意识,才能够在合适的时机以合适的力度射出那一箭。而C++,只是那支射出的箭罢了。你越熟悉它,箭头便愈发锃亮,破坏力也就越强。并且同时,空中盘旋的也不只有一只大雕,你还需要选择机会最大的那一只。

2022-10-31 16:41:57 362

原创 多线程、多进程同时操作MMAP,会怎么样?

信号量用于控制进程对共享资源的访问。计数信号量有一个正整数值,表示可以同时锁定信号量的进程数。多线程如何保持结果一致性,我们做了两种实现方式:Looper 实现mutex 互斥锁多进程如何保持结果一致性,我们做了三种:Semaphores 找了大量的示例,没有测试成功,抱歉mutext 实现了跨进程的互斥锁,但它无法保证robust,意思是在进程出现异常死掉时,无法释放锁,导致其他进程无法再次获取,从而产生不可预估的问题。

2022-10-28 14:58:25 1209

原创 深入理解什么是TCP 粘包?粘包警察是什么梗?

​本文围绕 TCP 协议展开,先来回顾下 TCP 协议的特点:TCP 是面向连接的传输层协议。每一条 TCP 连接只有两个端点,每一条 TCP 连接只能是点对点的(一对一)。TCP 提供可靠的交付服务,保证传输的数据无差错、不丢失、不重复且有序。TCP 提供全双工通信,TCP 允许通信双方的应用进程在任何时候都能发送数据,为此 TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。TCP 是面向字节流的。

2022-10-27 14:42:26 1214

原创 今天终于知道 Redis 为什么要用跳跃表了

先说一下单链表,是一种各性能比较优秀的动态数据结构,可以支持快速的插入、删除、查找操作。对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高,是O(n)。那怎么来提高查找效率呢?如果像上图中那样,对链表建立一级“索引”,查找起来是不是就会更快一些呢?每两个结点提取一个结点到上一级,我们把抽出来的那 一级叫作索引或索引层。你可以看我画的图。图中的down表示指针,指向下一级结点。

2022-10-26 14:13:00 366

原创 一文带你走进C++【内存泄漏】

(但是看过上篇文章的小伙伴都知道,我们还有个骨架屏的模式,可以跳过发起 CGI 请求的步骤,大大降低单次请求耗时,让这个结果几秒钟就出来了)拦截的 set 方法里判断了 store 里已经有存储了被引用的对象,同时当次操作的 key 值也已经被引用过了,因此判定在 vm 这样多次执行的环境里,可能存在内存泄漏,打印出告警信息;vm 里是没有 console 对象的,vm 里的 console 对象是宿主环境传递进去的,在 vm 里针对 console 的修改,也会反映在宿主环境的 console 对象上;

2022-10-25 15:26:13 277

原创 分布式事务Seata框架的AT模式

Try-Confirm-Cancel,本质也是业务服务化的两阶段提交协议,TCC一共有3个步骤,第一阶段需要由应用程序来进行对资源的预留,当所有参与者的try接口都成功了,那么事务管理器就会提交事务进行confirm,否则进行cancel回滚资源释放。Seata支持多种分布式事务模式,官方主推的是AT模式,AT模式是一种无侵入式的、类似于自动化的隐式TCC模式。2PC一共有2个阶段:预提交和commit。在分布式系统架构中,复杂的业务需要跨库操作,要保证全局的事务一致性问题就得需要解决分布式事务问题。

2022-10-24 16:04:11 279

原创 可靠消息最终一致性分布式事务

可靠消息最终一致性方案主要适用于消息数据能够独立存储:能够降低系统之间耦合度业务对数据一致性的时间敏感度高此方案需要实现的服务模式:可查询操作:提供查询自身事务状态的接口。幂等操作:只要参数相同,无论调用多少次接口,都应该和第一次调用产生的结果相同。

2022-10-22 15:11:36 792

原创 探究线程与进程的区别这一问题

看了下面的定义,可能会有点晕,但我还是要把他写下来(为了严谨)。进程是资源(CPU、内存等)分配的基本单位,具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是独立运行和独立调度的基本单位(CPU上真正运行的是线程)。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

2022-10-20 15:17:03 157

原创 深入RocketMQ-消息原理篇

SCHEDULE_TOPIC_XXXX 是 RocketMQ 一个系统类型的 Topic,用于标识延时消息。这个 Topic 有 18 个队列,分别唯一对应着 RocketMQ 的 18 个延时等级,对应关系为:queueId = delayTimeLevel – 1。这是 Broker 中的一个延时服务,专门消费 Topic 为 SCHEDULE_TOPIC_XXXX 的延时消息,并将其投递到目标 Topic 中。

2022-10-19 15:03:40 1660

空空如也

空空如也

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

TA关注的人

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