自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

凌桓丶的博客

沙漠尽头必是绿洲

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

原创 Redis 缓存常见问题:缓存一致性的解决方案

文章目录先删除缓存,再更新数据库延时双删先更新数据库,再删除缓存修改缓存过期时间消息队列Redis 缓存常见问题 :缓存雪崩,缓存击穿,缓存穿透,缓存预热在之前的博客中,我介绍了Redis缓存的一些常见问题,如:缓存雪崩、缓存击穿、缓存穿透等。这次就来介绍一下Redis的缓存一致性的问题。对于缓存和数据库的更新操作,主要分为以下两种先删除缓存,再更新数据库先更新数据库,再删除缓存首先可能会带来疑惑的点是,为什么这里是删除缓存而不是更新缓存?按照常理来说,更新的效率通常都会比删除高,因

2021-01-10 17:47:26 27

原创 Linux 内存管理 | 地址映射:分段、分页、段页

文章目录分页分段段页Linux内存管理分页分段段页Linux内存管理

2020-12-16 21:57:51 90 1

原创 Linux 内存管理 | 虚拟内存管理:虚拟内存空间、虚拟内存分配

文章目录虚拟内存空间空户空间内核空间用户空间内存分配malloc内核空间内存分配kmallocvmalloc虚拟内存空间空户空间内核空间用户空间内存分配malloc内核空间内存分配kmallocvmalloc

2020-12-15 21:03:41 54

原创 趣谈设计模式 | 桥接模式(Bridge):将抽象与实现分离

文章目录案例:跨平台程序设计桥接模式总结完整代码与文档案例:跨平台程序设计小明所在的公司正在研发一个智能遥控APP,可以通过将家电的命令配对到APP上,通过APP我们就能够远程的启动家中的家电,并让其执行任务。如果我们直接让遥控器来要求家电做出某些命令,由于家电的品牌、种类不同,其功能的接口以及实现也各不相同,为我们的设计带来了巨大的挑战。由于不同的产品的命令不一样,接口也不一样,如果让控制器全权负责家电命令的请求、下达、执行,这就要求控制器必须要清楚家电的所有细节,并且需要针对对象编程,一旦我

2020-12-13 17:09:41 51

原创 趣谈设计模式 | 职责链模式(ChainOfResposibility):请求的转发处理

文章目录案例:自动驾驶飞机外观模式总结完整代码与文档案例:自动驾驶飞机随着自动驾驶汽车的大卖,特X拉开始把目标转向飞行领域,打算开发出一款能够完全自动行驶的飞机,系统初步的设计如下我们将所有系统的控制封装为方法提供给客户客户只需要按照上面的步骤启动即可但是,这样的设计存在着严重的问题存在着大量的方法,用户存在学习成本各个系统之间存在强耦合关系,例如我们不可能在没有能源的情况下启动导航和发动引擎当需要关闭系统时,又要按照另一种关闭顺序进行关闭当系统更新换代时,用户又需要学习另一套操

2020-12-08 16:26:28 32

原创 Linux 内存管理 | 物理内存管理:物理内存、内存碎片、伙伴系统、slab分配器

文章目录内存碎片外部碎片内部碎片伙伴系统(buddy system)slab分配器内存碎片在Linux中,通过分段和分页的机制,将物理内存划分为4k大小的内存页(page),并且将页作为物理内存分配与回收的基本单位。通过分页机制我们可以灵活的对内存进行管理。如果用户申请了小块内存,我们可以直接分配一页给它,就可以避免因为频繁的申请、释放小块内存而发起的系统调用带来的消耗。如果用户申请了大块内存,我们可以将多个页框组合成一大块内存后再进行分配,非常的灵活。但是,这种直接的内存分配存在着大量的问

2020-11-29 16:11:15 167

原创 高级数据结构与算法 | LFU缓存机制(Least Frequently Used)

文章目录LFUCache的原理结构设计LFUCache的实现LFUCache的原理结构设计LFUCache的实现class LFUNode{public: LFUNode(int key, int value, int freq) : _key(key) , _value(value) , _freq(freq) {} int _key; int _value; int _freq; //访问次数

2020-11-20 10:11:34 336 1

原创 Redis 过期键删除策略、内存淘汰机制

文章目录过期键删除策略内存淘汰策略过期键删除策略内存淘汰策略

2020-11-17 20:23:57 300 1

原创 Redis 事务:事务的实现原理、ACID、WATCH乐观锁

文章目录

2020-11-14 19:41:53 111 1

原创 Redis 特殊数据类型 :Geospatial、Hyperloglog、Bitmap

文章目录Geospatial(地理空间)介绍用法Hyperloglog(基数统计)介绍用法Bitmap(位图)介绍用法Geospatial(地理空间)在使用一些小程序的时候,里面通常都会通过定位使用者的位置,来显示附近的人、外卖距离、剩余路径等功能,在Redis3.2中也引入了推算地理信息的数据结构,即Geospatial介绍把某个具体的位置信息(经度,纬度,名称)添加到指定的key中,数据将会用一个sorted set存储,以便稍后能使用 GEORADIUS和 GEORADIUSBYMEMBER

2020-11-13 21:05:07 148 1

原创 Nginx 反向代理、动静分离、负载均衡及配置实例

文章目录什么是Nginx正向代理反向代理配置方法什么是Nginx正向代理反向代理配置方法

2020-11-11 23:29:02 72

原创 趣谈设计模式 | 模板方法模式(Template Method):封装不变部分,扩展可变部分

文章目录案例:房屋建造模板方法模式模板方法模式与策略模式总结完整代码与文档这个设计模式过于简单,所以不是很好举例…案例:房屋建造假设我们是建筑公司中的规划者,负责设定建筑方案,在初期我们主要承接两种装修方案,分别是下图的中式装修与西式装修代码表示如下class WesternStyle{public: void Foundation() { std::cout << "打地基" << std::endl; } vo

2020-11-10 21:58:55 141

原创 趣谈设计模式 | 适配器模式(Adapter):如何让现存对象适用于新的环境?

文章目录案例:插头转换器适配器模式对象适配器类适配器总结完整代码与文档案例:插头转换器适配器模式对象适配器类适配器总结完整代码与文档

2020-11-07 18:52:13 337

原创 趣谈设计模式 | 外观模式(Facade):为子系统提供高粒度接口

文章目录由于外观模式思路很简单,所以博客的篇幅也会相对之间的短很多。

2020-11-06 14:30:03 344

原创 趣谈设计模式 | 命令模式(Command):将命令封装为对象

文章目录案例:智能遥控命令模式应用场景队列请求日志系统总结完整代码与文档命令模式的应用场景较少,且不易理解,因此我也不好举例,所以下面的描述可能会存在一些问题,请见谅案例:智能遥控小明所在的公司正在研发一个智能遥控APP,可以通过将家电的命令配对到APP上,通过APP我们就能够远程的启动家中的家电,并让其执行任务。如果我们直接让遥控器来要求家电做出某些命令,由于家电的品牌、种类不同,其功能的接口以及实现也各不相同,为我们的设计带来了巨大的挑战。由于不同的产品的命令不一样,接口也不一样,如果让控

2020-11-05 22:10:08 243

原创 趣谈设计模式 | 代理模式(Proxy):利用代理来控制对象的访问

文章目录案例:房屋中介代理模式代理模式的应用远程代理虚拟代理反向代理智能引用代理写时拷贝代理代理模式与装饰器模式总结完整代码与文档由于代理模式相较于前面的其他设计模式来说更加简单,容易理解,所以为了保证内容不会太少,我除了介绍代理模式外还会重点介绍远程代理和虚拟代理,以及简单提及其他的一些代理模式的应用案例:房屋中介假设小明准备去外地实习,于是他需要租一间房来居住。但是由于身在外地,人生地不熟的他根本没办法和正在出租房屋的房东联系,于是他想到了一个好办法,找到具有人脉的房产中介来代替他租房有

2020-11-03 16:59:58 807

原创 趣谈设计模式 | 状态模式(State):如何实现游戏中的状态切换?

文章目录案例:马里奥积分竞赛有限状态机分支逻辑法查表法状态模式孪生兄弟:状态模式与策略模式总结完整代码与文档案例:马里奥积分竞赛喜欢马里奥的小伙伴们都应该知道,前不久马里奥为了庆祝35周年,推出了一款以多人对抗大逃杀为核心的超级马里奥兄弟35此处仅为举例,并无此开发计划由于新颖的游戏模式带来了巨大的热度,于是任天堂决定趁热打铁,推出一款马里奥竞技游戏,在一定时间内获得积分最多的玩家将获得胜利。考虑到游戏并非正传,于是任天堂将游戏的开发工作外包给了小明所在的游戏公司来进行制作。游戏的核心玩法就是

2020-11-02 13:17:14 1207 4

原创 趣谈设计模式 | 装饰器模式(Decorator):用装饰来动态扩展功能

文章目录案例:奶茶店装饰器模式总结完整代码与文档案例:奶茶店小明经营着一家奶茶店,由于疫情导致线下销量不佳,于是他准备拓展网上订餐业务,针对下面的菜单设计了一套订餐系统小明初步的设计如下,使用一个抽象类饮料,并让所有类型的饮品继承于它,并且里面包含返回描述信息与价钱的方法,代码如下class Beverage{public: virtual ~Beverage() = default; virtual double cost() = 0; virtual std:

2020-11-01 14:23:23 873

原创 趣谈设计模式 | 策略模式(Strategy):你还在使用冗长的if-else吗?

文章目录案例:指挥官AI策略模式配合工厂模式总结完整代码与文档案例:指挥官AI案例可能不符合实际逻辑,仅用于表述设计模式的思想,勿介意假设我们开发了一款类似全面战争的即时战略游戏,为了能够增加玩家的对抗体验,我们决定设计一个指挥官AI,与以往的无脑人机不同,指挥官会根据战况以及玩家的操作,来指定克制玩家的计策。例如当玩家派出骑兵时,指挥官就会派出枪兵,当玩家退回城中防守时,指挥官就会派出破城槌来攻城。于是我们初步的设计如下,我们使用If-else这样的条件判断,根据玩家的不同行为来做出不同的操作

2020-10-31 15:06:59 718

原创 趣谈设计模式 | 工厂模式(Factory):利用工厂来创建对象

文章目录案例:外设店铺简单工厂工厂方法抽象工厂总结要点三类工厂模式的特点三种工厂模式的适用场景完整代码与文档工厂模式模式是创建型模式中较为常用的一个,它并不是一个模式,而是三种功能相近的设计模式的统称,它们分别是简单工厂模式、工厂方法模式、抽象工厂模式,下面我将结合案例来一一讲解它们的特点案例:外设店铺假设我们经营着一家外设店铺,我们主要售卖雷蛇和罗技这两个型号的鼠标,为了方便用户购买,我们设计了一个网上购物的平台,用户在网上下单后我们会去根据需求来生成鼠标,再经过测试、包装、注册信息后,就将合格的

2020-10-30 10:01:49 306 2

原创 趣谈设计模式 | 观察者模式(Observer) :消息的发布与订阅

文章目录案例:文章推送观察者模式观察者模式的运作流程观察者模式解决的问题观察者模式大显身手总结要点应用场景生产者-消费者模型 VS 观察者模式完整代码案例:文章推送为了方便举例,我提出以下场景。假设我是一个科幻小说爱好者,我维护着一个叫做ScienceFictionPusher的公众号,定期向豆瓣、知乎等平台推送那些我觉得有趣的科幻小说,于是为了方便管理,我的推送程序是这样的逻辑class ScienceFictionPusher {public: //推送内容 void newP

2020-10-29 11:06:21 1050 5

原创 Shell程序设计 | 文本处理工具 :正则表达式、grep、sed、awk

文章目录正则表达式grepsedawk其它工具cutsortfinduniq常见面试题要想使用这些流式处理工具,那么就必须得了解正则表达式,由于正则表达式内容较多,一篇博客肯定写不完,所以这里只是简单的讲一下正则表达式的常用语法。正则表达式元字符选项说明\转义字符.匹配任意一个字符*匹配其前面的字符0次或者n次^匹配开头$匹配结尾[a-z]匹配方括号中的任意一个字符拓展元字符选项说明+匹配前面的正则表达式至

2020-10-27 12:24:44 1115 2

原创 Shell程序设计 | 基本语法 :变量、I/O、算术运算、条件判断、流程控制、函数

Shell脚本的基本语法 :变量、I/O、算术运算、条件判断、流程控制、函数

2020-10-26 10:52:39 482 4

原创 并发编程中常见的锁机制:乐观锁、悲观锁、CAS、自旋锁、互斥锁、读写锁

并发编程中常见的锁机制:乐观锁、悲观锁、CAS、自旋锁、互斥锁、读写锁

2020-10-24 21:28:19 369

原创 哲学家进餐问题的三种解决方法(C++11)

文章目录哲学家进餐问题方法一:当两边的叉子都可用时才拿方法二:限制就餐的哲学家数量方法三:奇数先左后右,偶数先右后左哲学家进餐问题方法一:当两边的叉子都可用时才拿方法二:限制就餐的哲学家数量方法三:奇数先左后右,偶数先右后左...

2020-10-24 13:45:07 464

原创 MySQL 备份与主从复制

文章目录备份主从复制主从复制的作用备份根据备份方法的不同,备份可划分为以下几种类型热备(Hot Backup) :热备指的是在数据库运行的时候直接备份,并且对正在运行的数据库毫无影响,这种方法在MySQL官方手册中又被称为在线备份冷备(Cold Backup) :冷备指的是在数据库停止的时候进行备份,这种方法十分简单,就是直接复制相关的数据库物理文件,这种方法在MySQL官方手册中被称为离线备份。温备(Warm Backup) :温备与热备相同有一点相同,即两者都是在数据库运行时进行备份,但是

2020-10-23 21:05:59 117 1

原创 AC自动机:如何实现敏感词过滤?

文章目录

2020-10-22 20:15:50 1169 4

原创 字符串匹配算法(三):KMP(KnuthMorrisPratt)算法

单模式字符串匹配算法KMP算法的原理以及实现

2020-10-20 15:43:41 111

原创 字符串匹配算法(二):BM(BoyerMoore)算法、坏字符规则,好后缀规则

BM算法的全程叫做Boyer-Moore,是一种非常高效的字符串匹配算法,有实验统计,它的性能是著名的KMP 算法的 3 到 4 倍。下面就讨论一下BM算法的原理以及如何实现

2020-10-19 20:06:07 288

原创 字符串匹配算法(一):BF(BruteForce)算法和RK(RabinKarp)算法

字符串匹配算法中的BF和RK算法

2020-10-18 15:05:23 133

原创 什么是基数排序?

文章目录什么是基数排序稳定的计数排序基数排序的实现什么是基数排序稳定的计数排序数据结构与算法 | 计数排序计数排序的基本思路在这里就不多进行介绍了,如果不了解的可以看看我以前写的博客。void countSort(vector<int>& arr){ int max = arr[0], min = arr[0]; //找出最大值和最小值,缩减范围 for(int i = 1; i < arr.size(); i++) {

2020-10-17 19:58:43 134

原创 Trie(字典树) : 如何实现搜索引擎的关键词提示功能?

文章目录搜索中的关键词提示Trie树的介绍Trie树的实现Trie树的优缺点搜索中的关键词提示当我们在搜索引擎中进行搜索时,有时仅仅输入了搜索内容的一部分,搜索引擎就会提示我们可能的一些选择,这样我们就不再需要将查询词完整的输入,大大节约了我们的时间。而实现这一功能的基石,正是Trie树Trie树的介绍Trie树又叫做字典树、前缀树。顾名思义,它是一个用于处理多模式字符串匹配的多叉树,用来在一组字符串中快速的找到某个字符串。其本质就是共享字符串的公共前缀,即利用字符串之间的公共前缀,将重复的

2020-10-16 19:35:43 196

原创 MySQL 锁与MVCC :数据库的锁、MVCC、当前读、快照读、锁算法、死锁

文章目录lock与latch锁的类型MVCC一致性非锁定读(快照读)一致性锁定读(当前读)锁算法死锁锁升级lock与latch在了解数据库锁之前,首先就要区分开lock和latch。在数据库中,lock和latch虽然都是锁,却有着截然不同的含义。latch通常被我们称为闩锁(轻量级锁),因为其要求锁定的时间必须非常短。在InnoDB中,latch可以分为mutex(互斥锁)和rwlock(读写锁),它的作用是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测机制。lock的操作对象则是事

2020-10-14 19:53:00 397

原创 MySQL 事务 :ACID、并发带来的问题、事务的隔离级别、事务的实现

文章目录存储引擎MyISAMInnoDB索引概念使用方法事务概念使用方法存储引擎MyISAMInnoDB索引概念使用方法事务概念使用方法

2020-10-14 19:31:24 246

原创 MySQL 索引 :哈希索引、B+树索引、最左前缀匹配规则、全文索引

文章目录索引什么是索引使用场景常见的索引哈希索引自适应哈希索引B+树索引全文索引索引的使用索引什么是索引在数据库中,表、数据、索引之间的关系就类似于书籍、书籍内容、书籍目录。倘若不使用索引,则MySQL必须遍历整个表,直到找到数据,而表越大,查询的时间则越长,则数据库的效率也就越低。而索引就类似于书籍的目录,可以帮助我们快速的定位、检索到需要的数据行,对提高数据库的性能有着很大的帮助。在MySQL中,索引是一种特殊的文件,其中包含着对数据表里所有记录的引用指针。各类索引有各自的数据结构实现。使

2020-10-13 16:41:44 211

原创 Linux中进程间传递文件描述符的方法

在进行fork调用后,由于子进程会拷贝父进程的资源,所以父进程中打开的文件描述符在子进程中仍然保持着打开,我们很容易的就将父进程的描述符传递给了子进程。但是除了这种情况下,如果想将某个父进程在子进程创建后才打开的描述符传递给子进程,又或者是想将子进程的描述符传递给父进程时,就遇到了问题。在Linux中,虽然文件描述符是一个整型值,但是它的传递并非只是传递这个值而已。因为这个整型值其实是文件描述符表fd_array[]的下标由于不同进程的文件描述符表不同,所以要传递一个文件描述符,就是要在接收进程中的文

2020-10-12 20:08:21 207

原创 浅析Linux中的零拷贝技术

文章目录传统文件传输的问题Linux中实现零拷贝的方法传统文件传输的问题在网络编程中,如果我们想要提供文件传输的功能,最简单的方法就是用read将数据从磁盘上的文件中读取出来,再将其用write写入到socket中,通过网络协议发送给客户端。ssize_t read(int fd, void *buf, size_t count);ssize_t write(int fd, const void *buf, size_t count);但是就是这两个简单的操作,却带来了大量的性能丢失例如我们

2020-10-11 10:35:48 434

原创 Linux网络编程 | 高性能定时器 :时间轮、时间堆

文章目录时间轮时间堆时间轮时间堆

2020-10-10 16:29:40 239

原创 Linux网络编程 | 定时事件 :Linux常见定时方法、定时器链表、空闲断开

文章目录Linux常见定时方法定时器链表空闲断开Linux常见定时方法 Socket超时选项 I/O复用超时参数 SIGALRM信号 ****定时器链表#ifndef __TIMER_LIST_H__#define __TIMER_LIST_H__#include<time.h>#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include<ne

2020-10-09 10:36:12 215

原创 Linux网络编程 | 信号 :信号函数、信号集、统一事件源 、网络编程相关信号

文章目录信号函数信号集统一事件源网络编程相关信号Linux 进程信号:信号的概念、生命周期、产生流程、阻塞在半年前我写过一篇博客介绍了Linux中信号的概念以及处理流程,这次再来深入的讲一讲信号的具体使用方法以及在网络编程中的具体应用。信号函数要想为一个信号设置处理函数,可以使用以下两个系统调用。 signal signal函数的使用非常简单,只需要直接指定信号类型以及处理的方法即可#include <signal.h>typedef void (*sighandler_

2020-10-08 10:47:42 323

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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