自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Redis】缓存穿透、缓存击穿和缓存雪崩

Redis缓存穿透和雪崩Redis缓存的使用,极大的提高了应用程序的性能和效率,特别是数据查询等。但同时,它也带来了一些问题。其中,最主要的问题就是数据一致性,从严格意义上来讲,这个问题是无解的。如果对数据一致性要求很高,那么就不能使用缓存。另外一个典型的问题就是:内存穿透,内存击穿和内存雪崩问题。目前,业界也都有比较流行的解决方案。缓存穿透—查不到缓存穿透的就是用户想要查询一个数据,发现Redis中没有,也就是缓存没有命中,于是向持久层数据库发起查询,发现也没有这个数据,于是本次查询失败。当

2022-05-22 15:51:39 396 2

原创 【Redis】主从复制(哨兵模式)

Redis主从复制**主从复制:**指的是将一个Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower)。 数据的复制是单向的 ,只能从主节点到从节点。Master以写为主,Slave以读为主。默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点(或者没有从节点),但一个从节点只能有一个主节点。主从复制的作用:数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式故障恢复:

2022-05-22 15:46:12 523 2

原创 【Redis】发布-订阅功能

Redis发布订阅Redis发布订阅(pub/sub)是一种 消息通信模式 :发布者(pub)发送消息,订阅者(sub)接受消息。应用: 微信、抖音等的关注系统!Redis客户端可以订阅任意数量的频道。发布订阅模型下图展示了频道channel1,以及订阅这个频道的三个客户端 – client2 client5和client1之间的关系: 当有新消息通过PUBLISH命令发送给频道channel1时,这个消息就会被发送给订阅他的三个客户端:相关命令#订阅给定的一个或多个频道的信息sub

2022-05-22 15:39:09 360 2

原创 【Redis】持久化(RDB、AOF)

Redis的持久化Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘中,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以Redis提供了持久化的功能RDB (Redis DataBase)在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接读到内存中Redis会单独创建(fork)一个子进程来进程持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上一次持久化好的文件。整个过程中,主进程是不进行任何I

2022-05-21 15:15:04 101 2

原创 【Redis】官方推荐的基于C接口hiredis

hiredishiredis是Redis官方推荐的基于C接口的客户端组件,它提供接口,供c语言调用以操作数据库。//头文件#include <hiredis/hiredis.h>//连接redis数据库,参数为ip地址和端口号,默认端口6379.该函数返回一个redisContext对象redisContext *redisConnect(const char *ip, int port);//执行redis命令,返回redisReply对象void *redisCommand

2022-05-21 15:12:46 1710 3

原创 【数据结构】B-树,B+树,B*树

B-树:绝对平衡的多叉查找树B-树:就是B树,B-Tree,是m阶平衡搜索树(B:balance)。B树是绝对平衡的,左右子树高度差是0,不像AVL树,可以为1(这里的m阶是指最多有m个地址域)AVL树:2 阶平衡搜索树,平衡因子<=1,一个结点有两个地址域,一个数据域B 树:m阶平衡搜索树,平衡因子==0,一个结点有m个地址域,有m-1个数据域B树应用场景:文件索引系统的实现2-3-4树可以理解为4阶的B树B树的插入插入规则为什么B树除根节点和叶结点外,其

2022-05-21 15:09:49 856 2

原创 【Redis】事务

事务事务的本质: 一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!一次性,顺序性,排他性,执行一系列的命令!MySQL中的事务,要么同时成功,要么同时失败,必须保证原子性!Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:批量操作在发送 EXEC 命令前被放入队列缓存。收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。一个事务从开始到

2022-05-15 17:53:37 86 2

原创 【Redis】五种基本类型和三种特殊类型

Redis的5个基本类型redis中的数据都是以key/value的形式存储的,五大数据类型主要是指value的数据类型字符串string#设置值set stu wang#获取值get sty#判断key是否存在exists stu#追加字符串,如果key不存在,相当于set命令,返回值为追加之后的strlenappend stu jiaxin#获取字符串的长度strlen key1#对指定key的value自增1/自减1,value要为整数值incr keydecr

2022-05-15 16:11:38 346 2

原创 【MySQL】分库分表

MySQL分库分表数据库架构演变刚开始多数项目用单机数据库就够了,随着服务器流量越来越大,面对的请求也越来越多,我们做了数据库读写分离, 使用多个从库副本(Slave)负责读,使用主库(Master)负责写,master和slave通过主从复制实现数据同步更新,保持数据一致。slave 从库可以水平扩展,所以更多的读请求不成问题。但是当用户量级上升,写请求越来越多,怎么保证数据库的负载足够?增加一个Master是不能解决问题的, 因为数据要保存一致性,写操作需要2个master之间同步,相当于是重复了

2022-05-14 17:24:45 114 2

原创 【MySQL】集群(主从复制、读写分离)

MySQL集群在实际生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性、高可用性,还是高并发等各个方面都是不能满足实际需求的,一般要通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。主从复制,热备份&容灾&高可用读写分离,支持更大的并发主从复制主从复制的流程:两个日志(binlog二进制日志&relay log日志)和三个线程(master的一个线程和slave的二个线程)主库的更新操作写入binlog二进

2022-05-14 17:23:17 456 2

原创 【Java】JVM内存结构和垃圾回收

JVM(Java虚拟机)JVM介绍JVM —— Java程序运行环境(Java二进制字节码运行环境)好处:一次编写,到处运行自动内存管理,垃圾回收功能数组下标越界检查多态JVM、JRE、JDK比较:Jvm在倒数第二层 由他可以在(最后一层的)各种平台上运行Jre大部分都是 C 和 C++ 语言编写的,他是我们在编译java时所需要的基础的类库Jdk还包括了一些Jre之外的东西 ,就是这些东西帮我们编译Java代码的, 还有就是监控Jvm的一些工具内存结构和垃圾回

2022-05-09 14:39:35 194 4

原创 【MySQL】日志(错误日志、查询日志、二进制日志、慢查询日志、redo log和undo log)

MySQL日志show variables like 'log_%'; 错误日志:mysqld 使用错误日志名 host_name.err(host_name 为主机名) 并默认在参数 DATADIR(数据目录)指定的目录中写入日志文件。查询日志:查询日志记录了客户端的所有语句。由于上线项目sql特别多,开启查询日志IO太多导致MySQL效率低,只有在调试时才开启,比如通过查看sql发现热点数据进行缓存:show global variables like "%genera%"; 二进制日

2022-05-08 18:15:54 515 2

原创 【MySQL】优化(SQL和索引优化、应用层面优化、修改配置文件优化)

面试常问MySQL怎么优化,可以从这几点考虑。

2022-05-08 18:10:53 706 2

原创 【MySQL】锁机制(排他锁、共享锁、间隙锁、MVCC多版本并发控制)

MySQL的锁机制表级锁、行级锁表级锁:对整张表加锁。开销小,加锁快,不会出现死锁;锁粒度大,发生锁冲突的概率高,并发度低行级锁:对某行记录加锁。开销大,加锁慢,会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度高。排他锁、共享锁共享锁:Shared,又称为S 锁,读锁 ,读操作的时候创建的锁,一个事务对数据加上共享锁之后,其他事务只能对数据再加共享锁,不能进行写操作直到释放所有共享锁。排他锁:Exclusive,又称为X 锁,写锁 ,写操作时创建的锁,事务对数据加上排他锁之后其他

2022-05-05 13:02:17 1172 2

原创 【MySQL】事务(ACID特性、并发存在的问题、隔离级别)

MySQL事务什么是事务事务就是一组逻辑操作的集合。事务:一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写回磁盘上。事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态怎么实现事务实现事务就是要保证可靠性和并发隔离,或者说,能够满足ACID特性的机制。而这些主要是靠日志恢复和并发控制实现的日志恢复:数据库里有两个日志,一个事redo log,一个事undo log。r

2022-05-04 13:24:53 1052 2

原创 【MySQL】索引(底层实现原理、B树与B+树区别)

MySQL索引索引:为了更快地查找到数据优点: 提高查询效率缺点: 索引并非越多越好,过多的索引会导致CPU使用率居高不下,由于数据的改变,会造成索引文件的改动,过多的磁盘I/O造成CPU负荷太重索引分类索引类型:按逻辑分类、按物理分类逻辑分类:主键索引:使用Primary Key修饰的字段会自动创建索引(MyISAM, InnoDB) 。每张表中的主键索引只能有一个,要求主键中的每个值都唯一,即不可重复,也不能有空值。唯一索引:使用UNIQUE修饰的字段,值不能够重复,主键索引就隶属于

2022-04-30 13:58:59 1225 4

原创 【MySQL】存储引擎(MyISAM、InNoDB、MEMORY)

MySQL的存储引擎数据库存储引擎:是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是插件式存储引擎。使用show engines;可以查看存储引擎MyISAMMyISAM 不支持事务、也不支持外键,索引采用非聚集索引,其优势是访问的速度快,对事务完整性没有要求,以 SELECT、

2022-04-30 13:50:49 893 3

原创 【MySQL】连接查询

连接查询内连接#内连接:inner joinSELECT a.属性名1,a.属性名2,...,b,属性名1,b.属性名2... FROM table_name1 a inner join table_name2 b on a.id = b.id #inner可以省略,默认join就是内连接where a.属性名 满足某些条件;#on a.uid = c.uid 区分大表和小表,按照数量来区分,小表永远是整表扫描,然后去大表扫描,所以给大表建索引是有用的#从stuent小表中取出所有的a

2022-04-29 19:34:53 781 2

原创 【MySQL】limit分页查询

limit分页查询limit 子句可以被用于强制 select 语句返回指定的记录数#如果只给定一个参数,它表示返回最大的记录行数目: SELECT * FROM table LIMIT 5; #检索前 5 个记录行 #两个参数:第一个参数是偏移量,第二个参数是检索的行数SELECT * FROM table LIMIT 5,10; # 偏移5个,后面的10个返回,即:6-15行#上面两个参数的语法等价于:select * from table limit 10 offset 5

2022-04-29 19:30:25 3295 2

原创 【C++】【刷题】实战应用——海量数据的查重及top K问题

基本单位换算:1G=》1024*1024*1024=》1 000 000 000=》10亿10亿整数=》1G整数=》1G*4字节=》4GB(32位int占4字节,int*4字节,64位int4字节,int*8字节)50亿整数=》5G整数=》5G*4字节=》20GB(32位)海量数据查重/去重有一组IP地址、URL、字符串,哪些有重复,重复了多少次,去除重复的考虑类似这种问题,主要有以下思路:哈希表 + 分治思想:哈希表增删查O(1),但是占空间大,10亿个整数,大约占4GB,用哈希表存k.

2022-04-27 13:19:14 479 2

原创 【C++】【刷题】实战应用——大数加减

题目背景大数用内置类型是存不下的,32位操作系统中int最大存储2^31-1 = 2147483647,long:2147483648 ,logn long:9223372036854775807所以一般用字符串来存储非常大的数据请实现以下类的方法,完成大数的加减法#include <iostream>#include <string>#include <algorithm>using namespace std;//题目:请实现以下类的方法,完

2022-04-27 13:16:42 401 2

原创 【C++】【刷题】实战应用——DFS与BFS搜索迷宫路径及迷宫最短路径

题目背景请输入迷宫的行列数(例如:5 5)请输入迷宫的路径信息(0表示可以走,1表示不能走):0 0 0 1 11 0 0 0 11 1 0 1 11 1 0 0 11 1 1 0 0迷宫路径搜索中...>>>如果没有路径,直接输出<<<不存在一条迷宫路径!>>>如果有路径,直接输出<<<* * * 1 11 0 * 0 11 1 * 1 11 1 * * 11 1 1 * *深度优先遍历进行搜索DF

2022-04-27 13:13:41 623 2

原创 【C++】C++11新特性

委托构造函数C++11 标准提出了委派构造函数新特性。利用这个特性,程序员可以将公有的类成员构造代码集中在某一个构造函数里,这个函数被称为目标构造函数。其他构造函数通过调用目标构造函数来实现类成员构造,这些构造函数被称为委派构造函数。在该新特性提出之前,构造函数是不能显式被调用的,委派构造函数打破了这一限制class CGoods{public: CGoods():CGoods("\0", 0, 0, 0) //: CGoods("\0", 0) {} { } CGoods(string

2022-04-26 14:13:01 880 2

原创 【C++】语言级别的多线程操作(线程库、互斥量、条件变量)

线程库头文件头文件#include <thread>命名空间std创建线程示例#include <thread>void fun(){ //do some work}int main(){ std::thread t(fun); t.join();}在 上例 中,函数 fun将会运行于线程对象 t 中, join 函数将会阻塞main线程, 直到 t 线程执行结束注意:std:: thread 出了 作用域之后将会析 构, 这时如果线程函数还

2022-04-26 13:45:45 171 2

原创 【C++】右值引用、移动语义、完美转发、引用折叠

问题的引入如果有的应用场景必须返回的是定义过的对象,也必须按赋值的方式来接收函数调用,那优化的后两条规则就用不成了解决办法:给该类添加一个右值引用拷贝构造函数,函数内部不做资源的分配,而是资源的转移,每当有通过右值(临时对象)来构建对象的时候,就调用右值引用拷贝构造函数右值引用左值:有名字或有内存右值:没名字(临时量)或没内存int main(){ int a=10; int &b=a; // ok int &c=10; //error, 1

2022-04-24 13:10:19 879 2

原创 【C++】对象使用过程中背后调用的方法以及对象优化

对象使用过程中背后调用的方法C++编译器对于对象构造的优化,用临时对象生成新对象的时候,临时对象不产生了,直接构建新对象用临时对象赋值给已存在的对象的时候,要产生临时对象,再调用operator=构造函数完成类型转换,(构造函数强转详细可查看博客:C++:构造函数强转、参数列表)临时对象生存周期:所在的语句而引用就是别名,相当于给这块内存又给了个名字,所以用引用引用临时对象,临时对象的生命周期就变成引用变量的生命周期了所以用指针指向临时变量是不安全的,而用引用引用临时对象是安全的程序运行

2022-04-24 13:02:29 1042 2

原创 【牛客】面试必刷TOP101——01链表

BM1 反转链表描述给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。数据范围: 0≤n≤1000要求:空间复杂度 O(1),时间复杂度 O(n) 。如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。以上转换过程如下图所示:示例1输入:{1,2,3}返回值:{3,2,1}示例2输入:{}返回值:{}说明:空链表则输出空我的思路:初始化:3个指针

2022-04-21 15:54:13 665 2

原创 【C++】C++语言级别提供的四种类型转换方式

C类型强转int a = (int)b;C++语言级别提供的四种类型转换方式const_cast : 去掉(指针或者引用)常量属性的一个类型转换static_cast : 提供编译器认为安全的类型转换(没有任何联系的类型之间的转换就被否定了)reinterpret_cast : 类似于C风格的强制类型转换dynamic_cast : 主要用在继承结构中,可以支持RTTI类型识别的上下转换代码示例:class Base{public: virtual void

2022-04-20 13:43:10 130 2

原创 【C++】虚基类、虚继承、菱形继承

虚基类、虚继承**多重继承:**一个派生类有多个基类,代码复用好处:更多代码的复用坏处:菱形继承问题:派生类有多份间接共同基类,解决方案:虚继承虚基类内存布局:在原来的基础上,把虚基类移到最后面,原来基类位置补一个虚基类指针vbptr0、8是偏移量菱形继承class A{public: A(int data) :ma(data) { cout << "A()" << endl; } ~A() { cout << "~A()" <&

2022-04-20 13:30:15 446 2

原创 【Linux】编译链接全过程

编译链接全过程在Linux下,当我们使用GCC来编译Hello World程序时,只须使用最简单的命令(源代码为hello.c)gcc hello.c./a.out事实上,上述过程可以分解为4个步骤,分别是预处理,编译,汇编和链接,如下图:预编译预编译阶段把.cpp和.h等文件编译成一个 .i文件,第一步预编译的过程相当于如下命令:gcc -E hello.c -o hello.i #-E表示只进行预编译,-o指定生成文件名预编译阶段主要处理那些源代码文件中以“#”开始的预编译指令。

2022-04-19 19:18:39 516 2

原创 【C++】一文搞懂STL

C++ STL standard template libaray 标准模板库,学习底层原理和增删改查的使用,容器的底层数据结构有什么样的优缺点,容器就有什么样的优缺点allocator容器中,对象的构造析构,内存的开辟释放是通过容器的空间配置器allocator来实现的,allocator有四个函数:allocate:开辟内存deallocate:释放内存construct:构造对象destroy:析构对象一、标准容器C++11新加容器: array forward_list(单向链

2022-04-19 18:11:10 1966 2

原创 【C++】STL泛型算法和绑定器

五、泛型算法和绑定器泛型算法泛型算法是STL库里面定义的一些算法,这些算法可以用一个接口操作各种数据类型,因此称为泛型算法template + 迭代器 + 函数对象泛型算法详细介绍在C++ Primer 3rd末尾附录泛型算法头文件#include <algorithm> //包含了C++ STL里面的泛型算法泛型算法特点:泛型算法的参数接收的都是迭代器,为什么?因为泛型算法是给所有容器都能使用的,要通用参数还可以接收函数对象,功能可以更改,例如sort可递增排序,也

2022-04-19 17:57:00 111 2

原创 【C++】STL函数对象

三、函数对象(类似C的函数指针)函数对象 =》 C语言里面的函数指针使用C的函数指针实现比大小效率低的问题template<typename T>bool mygreater(T a, T b){ return a > b;}template<typename T>bool myless(T a, T b){ return a < b;}template<typename T, typename Compare>bool co

2022-04-19 17:54:39 550 2

原创 【C++】STL迭代器

二、迭代器vec.begin(); //返回首元素迭代器vec.end(); //end返回容器末尾元素的后继位置注意迭代器失效问题:对容器进行连续插入或者删除操作(insert/erase),一定要更新迭代器,否则第一次insert或者erase完成,迭代器就失效了1) 正向迭代器:容器类名::iterator 迭代器名;vector<int>::iterator it;auto it = vec.begin();2) 常量正向迭代器容器类名::const_ite

2022-04-19 17:51:16 452 2

原创 【C++】STL标准容器之关联容器

一、标准容器3、关联容器主要分为两类:set:集合,存的是关键字keymap:映射表存的是 [key,value]键值对常用增删查方法:增加:insert(val);遍历:iterator自己搜索或调用find成员方法,unordered_set<int>::iterator it = set1.find(15); cout << *it;删除:erase(key) erase(it)3.1、无序关联容器 => 链式哈希表无序关联容

2022-04-19 17:47:54 430 2

原创 【C++】STL标准容器之容器适配器

一、标准容器2、容器适配器标准容器 - 容器适配器怎么理解适配器?容器适配器底层没有自己的数据结构,它是另外一个容器的封装,它的方法全部由底层依赖的容器进行实现的,如下Stack代码,它的底层就是deque,相当于将deque适配成一个Stack没有实现自己的迭代器template<typename T, typename Container=deque<T>> class Stack{public: void push(const T & v

2022-04-19 17:42:04 717 2

原创 【C++】STL标准容器之顺序容器

C++ STL standard template libaray 标准模板库,学习底层原理和增删改查的使用,容器的底层数据结构有什么样的优缺点,容器就有什么样的优缺点

2022-04-18 13:15:00 610 2

原创 【C++】进程的虚拟地址空间内存划分和布局以及函数调用堆栈详细过程

进程的虚拟地址空间内存划分和布局 任何的编程语言产生两种东西:指令和数据,下图是对x86 32位linux环境下而言的用户空间3G,内核空间1G所以进程之间通信可以通过共享的内核来通信:匿名管道、信号量函数调用堆栈详细过程int sum(int a, int b){ int temp = 0; temp = a + b; return temp;}int main(){ int a = 10; int b = 20; int ret = sum(a, b); cout

2022-04-18 13:02:54 344 2

原创 【C++】单例模式和观察者模式

单例模式(创建型)创建型模式:提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,我们无法再创建一个同类型的其他对象,所有的操作都只能基于这个唯一实例比如日志模块,数据库模块,任务管理器饿汉式单例模式还没有获取实例对象,实例对象就已经产生了,饿汉式是线程安全的优点:程序加载时就进行实例化,之后的操作效率会很高。缺点: 由于程序加载时就进行实例化,如果后续不对此类进行任何操作,就会导致内存的浪费

2022-04-17 17:10:36 453 2

原创 【C++】一文搞懂智能指针

智能指针基本概念头文件memory智能指针的->运算符重载不带引用计数的智能指针为什么智能指针要区分带引用计数或不带引用计数呢?因为多个智能指针指向同一份资源会引起资源的重复释放,即浅拷贝资源释放的问题,所以有的不带引用计数,但是只能有一个智能指针指向该份资源,有的带引用计数auto_ptrauto_ptr怎么解决浅拷贝资源多份释放的问题?答:永远让最后一个auto_ptr指向该份资源,前边的auto_ptr被置为nullptr,图示如下:所以auto有很多缺点:不推荐使用

2022-04-17 16:56:30 557 2

空空如也

空空如也

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

TA关注的人

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