- 博客(157)
- 收藏
- 关注
原创 SpringCloud多机部署,负载均衡-LoadBalance
负载均衡(LoadBalance,简称LB),是高并发,高可用系统必不可少的关键组件。当服务流量增大时,通常会采用增加机器的方式进行扩容,负载均衡就是用来在多个机器或者其他资源中,按照一定的规则合理分配负载。SpringCloud LoadBalancer默认的负载均衡策略是轮询策略,是现实RoundRobinLoadBalancer。现在我们来实现一个采用随机策略的负载均衡器此处使用SpringCloudLoadBalancer提供的RandomLoadBalancer@Bean。
2024-11-18 18:03:15
1163
原创 SpringCloud-服务注册/服务发现-Eureca
1.服务提供者(Server):一次业务中,被其他微服务调用的服务,也就是提供接口给其他微服务2.服务消费者(Client):一次业务中,调用其他微服务的服务,也就是调用其他微服务提供的接口。3.服务注册中心(Registry):用于保存Server的注册信息,当Server节点发生变更时,Resgistry会同步变更。服务与注册中心使用一定的机制通信,如果注册中心与某服务长时间无法通信,就会注销该实例。
2024-10-16 15:50:44
890
原创 Spring Cloud环境搭建
这篇博客我们是想实现一个电商平台(简单的,不是真实实现)但是一个电商平台有很多很多功能,该如何实现呢?如果将所有功能写在一个服务里,这个服务就是巨大的。那么微服务架构就是最好的选择Representational State Transfer,表现层资源状态转移资源:网络上的所有事物都可以抽象为资源,比如网上的图片视频文本等。每一个资源都有为一个资源标识符,及URL表现层:资源的表现形式,比如文本资源可以使用txt格式,图片使用jpg,还有json,xml。
2024-10-15 21:20:12
817
原创 认识微服务
早期。传统企业将业务的所有功能都打包到一个项目中,或者说业务的多有功能实现都打包在一个war包或者jar包中,这种方式就是单体架构。比如博客系统,数据库+前端+后端的实现都在一个项目中,这就是单体架构。还比如电商系统:用户管理,订单管理,支付管理,商品管理,物流管理等,项目早期都会把这些模块写到一个web项目中,然后统一部署到一个web服务器中。
2024-10-15 15:56:58
531
原创 Redis渐进式遍历
我们知道,keys* 是一次性把所有的key都获取到,这个操作太危险,可能会一次性得到太多的key而阻塞服务器。但是通过渐进式遍历,既能够获取到所有的key,又能不会卡死服务器。redis使用scan命令进行渐进式遍历,进而解决直接使用leys获取键时可能出现的阻塞问题。每一次scan的时间复杂度都是O(1),但是要玩行政遍历所有的键,就需要执行多次scan。
2024-09-23 22:55:38
601
原创 Redis数据结构之zset
它和集合唯一不同的就是,有序集合中的每一个元素都有一个唯一对应的浮点类型的分数与之关联着,是的有序集合中的元素可以维护有序性。但是这个有序不适用下标作为排序的依据,而是使用这个分数。就好像排行榜一样,谁得到的分数多,就排在前面所以这里的有序和list中的有序的概念不一样,这里强调升序/降序注意zset中的member还是不能够重复,但是分数可以重复。
2024-09-22 16:01:02
1012
原创 Redis数据结构之set
集合类型也是保存多个字符串类型的元素的,但和list列表不一样,集合中的元素是无序的,而且元素不能够重复,不仅支持增删查改,还支持交集并集等操作。
2024-09-22 12:00:32
906
原创 Redis数据结构之list列表
列表相当于数组或者顺序表它里面的元素是有序的,也就是可以通过下标进行访问。这里的有序的含义是要根据上下文区分的,有的时候,有序指的是升序/降序,有的时候有序指的是顺序很关键,俩个元素交换后就不是同一个集合了。这里的list就是第二种,对应的下标有对应的值。所以说,同样的一个词,怎么解释要看上下文。就好比栈/堆,是数据结构?还是操作系统的?还是JVM的?也比如同步,是同步互斥的同步?还是同步异步的同步?
2024-09-22 08:14:11
977
原创 Redis数据结构之String字符串
一个分布式的web服务,会将用户的session保存在各自的服务器上,但会出现这样的问题:处于负载均衡的考量,分布式服务会将用户的请求分不到不同的web服务器上,但是却无法保证每次请求都分发到同一个服务器上,这就会导致用户要多次登录。上面所说的导入到其他存储介质,也就是写入到其他数据源,使用的是异步的方式。redis中的字符串,直接就是按照二进制的方式存储的(不会做任何的编码转换(就好像mysql,它默认的字符集是拉丁文,插入中文就会失败,除非charset utf8),存的是啥,取出来的就是啥)。
2024-09-21 21:21:55
940
原创 C++可变参数模板
如上,args可以传0到多个参数,可以传不同类型的参数注意下面的两个概念:Args是模板参数包,args是一个函数形参参数包这里面的args可以传入不同的类型,通过sizeof(args)可以求出参数个数。
2024-09-20 22:03:01
419
原创 c++11右值引用和移动语义
1.当既有移动构造又有拷贝构造既有移动赋值又有赋值重载时,如果你是右值,那就直接转移资源,如果你是左值那就进行深拷贝2.右值引用到底在什么时候能够体现其价值?当此自定义类型中需要进行深拷贝时就有其价值。//c++11如上,都想给vector中存放结果,对于c++98来说,只有如上这样做才能提高效率,而c++直接接收返回值即可,因为stl容器基本上都实现了移动构造移动赋值4.stl中的插入等都加入了右值版本。
2024-09-20 16:01:00
781
原创 C++11之统一的列表初始化
如上,注意m2的第二种构造,使用的是{}列表!!!而不是(),因为如果使用(),那就是调用构造函数,但是咱们没有写带参的构造函数!!!那d2和d3都是调用构造函数,难道没有什么区别吗?有区别:d3就是直接调用构造函数,而d和d2本质上是类型转换!!!它是先使用列表构造一个date临时对象,再用临时对象去拷贝构造d3!!!,如下可以验证:说明,必须是const引用才能接收初始化列表。
2024-09-20 12:55:55
502
原创 Java lambda表达式的变量捕获
有人看到这个lambda表达式能够访问isQuit这个变量而且还是可以被修改的变量,就发出疑问了,之前不是说lambda不能不或变量吗?
2024-09-19 17:22:39
331
原创 c++多态的原理
1.派生类对象由两部分构成,一部分是父类继承下来的成员,另一部分就是自己的成员2.基类对象和派生类对象的虚表不一样,每一个类都有一张共同的虚表3.子类对象存储时,要先存储父类对成员,再存储自己的成员,但是继承父类成员时,不会将虚表也继承1.该类继承了几个有虚函数的父类,该类就有几张虚表2.子类中没有被重写的虚函数放在第一张虚表中。
2024-09-12 17:39:02
782
原创 c++重载、重写、多态
当子类中含有与父类同名的成员变量/成员函数时,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫做隐藏,也叫做重定义。但在子类成员函数中,可以使用 基类::基类成员 显式访问。隐藏的条件交款,只要名字相同就是隐藏,像成员函数,不一定非得时虚函数,不一定要哦参数返回值相同。
2024-09-12 13:28:13
326
原创 c++基类和派生类对象的赋值转换——赋值兼容规则
由于b是double类型,所以赋值给int类型的引用前,要先进行隐式类型转换,这中间会生成临时对象,类是对象具有常性,所以int&之前应该加上const。1.公有有继承中,派生类对象可以赋值给基类对象/指针/引用。形象的说法叫做切割或切片,就是将派生类中父类的那一部分切过去。如上,当把public去掉后,就出错了。难道是没有产生临时对象吗?2.基类对象不能赋值给派生类对象。
2024-09-12 12:29:39
315
原创 c++非类型模板参数
模板参数分为类型模板参数和非类型模板参数类型参数:即跟在class/typename后面的参数类型名称非类型:即使用一个常量作为一个类/函数模板的参数,在该类/函数模板中可以使用这个常量。
2024-09-12 12:09:33
208
原创 c++11新特性——仿函数
什么是仿函数?其实还是一个类,但是可以像函数那样调用。本质上就是内部实现了operator(),是的这个类有了类似于函数的用法。这就是仿函数。
2024-09-12 10:49:18
156
原创 c++优先级队列的迭代器区间构造函数
而且建堆是从最后一棵子树开始向上进行的,最后一棵子树的下标就是size-2再除以2.而这里说的向下调整是说每棵子树都是向下调整。这样的话,当某棵子树在调整过程中没有进行交换时就是这棵子树调整好了,而不用再向下进行,直接进行下一棵子树的调整即可。所以说,构造函数也可以是模板函数,传入的是对应的容器的迭代器,使用这个迭代器区间对优先级队列中的容器进行初始化,然后进行向下调整建堆。之前在讲java的优先级队列的时候讲过,建堆最好是使用向下调整,这样的话,时间复杂度最小。是log以2为底n的对数。
2024-09-11 23:36:12
267
原创 c++list模拟实现
首先要有一个节点类初始化列表进行nullptr的赋初值然后就是链表的无参构造双向链表,连接后要构成一个环,如上empty_init;
2024-09-09 19:14:54
813
原创 c++ vector模拟实现细节
预留空间,只有在想要的空间大于现有空间时才会扩容。但还要注意——start不能为空。这里不能使用memcpy,因为底层其实是浅拷贝。所以应该自己进行深拷贝。tmp是一个数组,里面可能存放的是自定义类型,自定义类型的话,在其类中会有重载的赋值函数,所以直接使用如上佛如循环的方式即可。但是注意,operator[]也要写。还有一个,T tmp=new这里,应该是T*,指针类型!!!!仔细看这个函数,这里有错,更新finish是有错。
2024-09-08 17:17:04
1084
原创 c++ string类的模拟实现的注意事项
第一种形式,使用字符指针赋值为了防止修改,我们传入了常量字符串。但是这里的初始化列表出错了,因为_str是一个变量,将常量给到一个变量涉及到权限的放大,是错误的。那该怎么写呢?对_str的赋值只能使用strcpy字符串拷贝,如下:这样对了吗??还是不对!!!因为_str没有开辟空间!!!!体现了初始化列表与函数的结合但是,main函数中创建一个字符串对象却出错了!!!!为什么呢?注意初始化列表的顺序!!!!!是按照变量定义的顺序进行的!!!
2024-09-08 13:32:32
613
原创 c++ string中append/push_back/insert的区别以及erase/pop_back的区别
append是在末尾追加字符或字符串如上的几种用法。注意第二个,它的第三个参数不是结束位置,而是要追加的长度;要追加的字符串可以用string对象表示,也可以用字符指针表示;也可以用于在末尾添加n个相同字符;也可以使用迭代器。但是push_back就只能是天界单个字符,不能添加字符串。而insert是在任意位置插入如上。第一个是在指定下标处插入string对象中的字符串;第二个在第一个的基础上指定了字符串的子字符串,与append一样;
2024-09-05 16:26:21
310
原创 c++ string之字符替换、string的swap交换
例:将字符串中的空格全部替换成10%最简单的方法是调用string类中的replace函数但是replace这个函数的效率很低很低我们可以使用如下做法——用空间换时间:假如题目还要求在原字符串上修改,就可以再进行下面的操作,就是将tmp的值赋给s。但注意,他们是string类型,所以可以如下操作:这里的assign函数是string提供的,表示给s分配一个字符串,用来替换s中原有的字符串,所以上面就是将tmp中的字符串分配给s。还可以使用swap函数。
2024-09-05 16:08:39
479
原创 c++模板初阶
实现一个通用的交换函数这里如果想交换double类型的,可以再写一个重载函数。但代码太多了,最好有一个函数模板。这就是泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。模板分为函数模板和类模板函数模板代表了一大类函数,该函数模板与类型无关,在使用时被参数化,根据实参类型生成特定的类型的模板。注意,在传入类型参数调用函数之前,这些函数还没有实例化出来,只有显式调用后,才会生成对应的模板。格式:其中,typename是用来定义模板参数的关键字,也可以使用class比如:函数模
2024-09-04 19:36:05
468
原创 隐式类型转换/匿名对象的使用以及构造拷贝构造的优化
1.能使用匿名对象/隐式类型转换就使用,因为编译器可以优化2.同一个表达式的多个构造/拷贝构造能够优化合二为一3.隐式类型转换具有常性4.能使用引用就使用引用。
2024-09-04 16:13:23
386
原创 c++类与对象的static成员
在定义类时进行声明static成员的定义/初始化必须在类外:或者给一个具体的值:为什么必须在类外初始化?因为static不独属于某个对象,它是类变量,不管创建几个实例对象,static成员都只有一份,所以static成员不会走初始化列表,所以无法在类内初始化实际上说的是this指针不存在,不能用this调用函数。但可以实例化一个对象,用对象去调用非静态函数。
2024-09-04 15:46:13
366
原创 c++构造函数的隐式类型转换以及explicit关键字
这里的A a=4;就是构造函数的隐式类型转换(把整形4转换成了一个对象)实际上是用4调用A的构造函数生成一个临时对象(注意是临时对象!!!),再用这个临时对象拷贝构造出a。但是,编译器会进行优化,直接优化成:用4直接构造a。如下:但注意,下面这样就错了!!
2024-09-04 15:10:41
501
原创 c++用引用实现引用计数
如上,将main函数栈帧中的计数器n传给对象中的引用变量,那么,对 _ref的操作其实就是对n的操作。只要在构造函数及拷贝构造函数中加上_ref++,在析构函数中加上_ref--,就能实现内存中对象个数的统计。注意,不能够在赋值重载函数中进行_ref++,因为赋值重载是针对已经存在的对象。
2024-09-04 14:13:25
246
原创 c++类与对象之初始化列表
什么是初始化?初始化就是在创建变量的同时给该变量一个初始值。而当进入构造函数体内部时,对象已经创建好了,说明对象中的成员变量就已经创建好了,那时候就不能叫做初始化了,而是对以已经创建的变量进行赋值那哪里是成员声明的地方?如果只有声明,就会编译不通过,所以要给他一个初始值。但要是放在构造函数的函数体内,由于能够走到构造函数体内,就说明对象已经定义了,那么成员变量就也已经定义了,那就不符合const变量要在定义时初始化这个要求了。所以要在初始化列表中进行初始化所以如上,可以在初始化列表给定初始值。
2024-09-04 13:30:38
343
原创 c++类与对象(中)
1.如果要通过无参构造函数创建对象,对象后面不要跟括号,因为编译器不知道这是无参构造海事函数声明2.如果类中没有显式定义构造函数,c++编译器默认会生成一个无参构造,反之不会生成1.若没有在声明时赋值,且调用了无参构造,那么对于内置类型来说,不会做任何处理。而对于自定义类型,则回去调用它的默认构造函数。但当有缺省值时,就会使用缺省值。所以缺省函数的提出就是在补内置类型的坑2.注意,下面的写法是错误的:3.注意,指针是内置类型!!4.构造函数的任务是初始化对象,而不是开辟空间创建对象。
2024-09-04 07:07:24
664
原创 c++类与对象(上)
1.声明和定义全部在类里。需注意,此时,类中的函数可能会被编译器当成内联函数处理2.类中声明,类外定义。但注意,函数名前面要加上类名::,指明类域注意,以上类的定义中,对于内部的成员变量来说,都只是一个声明,根本没有进行定义,更没有在内存中为它开辟空间。只有在某个函数中用该类实例化了一个对象后,其中的成员变量才是真正有了空间!!!
2024-09-03 06:54:16
615
原创 c++入门之内联函数
因为inline被展开,就没有函数地址了,链接就会找不到由于内联函数不会生成指令,所以就不会生成地址进入符号表,所以找不到函数定义。
2024-09-02 17:35:45
388
原创 c++入门之引用
这里好像编译通过了。实际上,这不是b又去引用了x,而是在给b赋值,也就是给a赋值。怎么证明呢?如下操作:可以发现,ab的地址相同而与x的不同,并且a的值变成了20。1.引用是一个已经存在的变量的别名,指针存储一个变量的地址2.引用在定义时必须初始化,指针没有要求3.引用只能引用一个实体,指针可以指向任何一个同类型的实体4.使用sizeof计算时,引用的大小就是所引用的变量的类型的大小,但指针始终是4个字节5.没有NULL引用,有NULL指针6.有多级指针,没有多级引用。
2024-09-02 15:40:32
745
原创 c++入门之函数重载
1.根据上述分析就可以理解,C语言没拌饭发生重载,因为同名函数没案发区分。而c++是根据函数修饰规则来区分的,只要参数(的个数/类型/类型顺序)不同,修饰出来的名字就不同,就支持重载2.如果两个函数函数名和参数一样,只是返回值类型不同,无法构成重载,因为在调用时编译器没办法区分它的返回值是什么。
2024-09-02 06:47:13
531
原创 C++入门之缺省参数
1.半缺省参数必须从右往左给出,不能间隔着给2.缺省参数不能在函数的定义和声明中同时出现,一般是建议都写在声明中3.缺省值必须是常量或全局变量(也就是int a=10/int a=全局变量0)4.C语言不支持该语法。
2024-08-15 11:52:38
352
原创 C++入门——命名空间
命名空间需要使用namespace关键字,后跟空间的名字,再加一对{},括号中就是这个空间内的成员命名空间就相当于在全局中圈出一块位置,相当于在山上圈出一块地,有人承包改造成菜园。这是一个打印语句(后面会讲到),要想打印zyh中的rand,就要加上作用域限定符::,表示到zyh这块空间中寻找变量rand,而不是去全局中找库中的rand。这就好像拿到裁员中的钥匙,打开裁员去摘菜。但要是没有指定命名空间,就会去全局寻找,这里的全局是将命名空间除外,因为命名空间是被别人承包的菜园,没有许可不可以进入。
2024-08-15 10:24:09
376
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人