分库分表-分库(功能拆分):
数据库的线程是有限的,多个数据库增加了线程资源,这就是分库分表的目的
分库分表-分表(数据拆分):
当一个表超过2kw数据后,查询会变慢,索引会失去效用,此时分表+索引是最优解
索引:
可以解决2kw以下的数据量,超过这个阈值,收效甚微
读写分离(主库从库):
主库写入,从库查询,解决了读库效率瓶颈。
二八原则,读库业务占整体业务的80%,写库只占20%。
多个从库增加了查询的效率。
DDD(领域驱动设计):
工作模式上解决了沟通成本问题(客户和程序员、开发和测试),开发流程上把项目分为各个业务模块,面向业务的开发模式。
属于面向业务的工作模式(业务:用户模块、资产模块、漏扫模块),以每周一个周期,各个职能人员、甚至是客户,共同交流进度、遇到的问题,共同确立未来的走向。
virtual方法和abstract方法:
virtual方法必须写具体实现,abstract方法不能写具体实现;
virtual方法不是必须重写的,abstract必须重写来具体实现;
virtual方法可以通过override和new重写,abstract只能用override重写。
New和Override:
New不会改变父类的值,Override的子类会覆盖父类的值。
New用于重写普通方法、virtual方法,Override用于重写virtual方法、abstract方法和Override方法。
const和readonly的区别:
const是静态常量,默认静态,不能static修饰,只能值类型和string类型,结构体也不行;
readonly是动态常量,可在构造函数中初始化,可以static修饰,能任意类型。
volatile:
cpu为了读取某些数据更快,会把热数据放在CPU高级缓存中,下次在读取的时候就不经过内存了;
这样很快,但如果内存中的数据发生变化时,并不会更新到CPU高级缓存中,这样俩数据就不一样了;
volatile修饰符,会让数据在内存中更新时,强制更新CPU高级缓存。
RPC(远程过程调用):
比http快,是因为直接使用了TCP获取数据,提升了网络IO性能;
·TCP长链接,不用反复握手
·TCP传输的是二进制,http是字符串,所以TCP所需数据量很小,传输更快
·二进制流转数据,再把数据传给相应服务的方法,这块由stub处理
string a="abc"; string b=a; a="xyz"; b是否为“xyz”?
否。
因为string驻留机制。string一经创建,就不能修改。只会另开辟一个内存地址存储新值,再指向新的内存地址。
string a="abc"; string b="abc"; 他们指向的是否为同一个内存地址?
是。
因为string驻留机制。在程序中使用到的具有完全相同的字符序列的String,均是对应着同一个string对象,是对同一个段内存的引用。
string a="abc"; string b= new string("abc"); 他们指向的是否为同一个内存地址?
否。
a属于常量,编译时就定义在常量池了。b是运行时生成的字符串对象,b没有驻留机制。
构造函数可以继承么?
可以。通过 :Base()继承。
构造函数什么返回类型?
没有返回类型。返回的就是它自己。
IOC三个生命周期都是什么时候实例化的?
都是第一次调用时实例化。
GC怎么回收的?
只要资源出了作用域,而且没人再引用,GC会标记它等待下次回收时销毁。
GC会不会回收非托管资源?
会
哪些资源不会被GC回收?该用什么来回收?
文件、流、连接等。
Using块。
Using块要求被引用的对象必须继承什么接口?
IDisposable
Using块内出现异常会不会无法回收?Using块本质是什么?
不会,依然会正确回收。
本质就是try.catch.finally。
聚集索引和非聚集索引的区别?
1.聚集索引一个表只能有一个(一般是主键),而非聚集索引一个表可以存在多个。
2.聚集索引在b+树的叶子节点,就是数据本身。非聚集索引在b+树的非叶子节点,不存储数据,只存储数据的主键。
3.聚集索引只要查一次就可以查到。非聚集索引想要查数据,要先查到数据的主键,再通过主键从聚集索引中查到数据(回表)。
4.聚集索引的记录是物理上连续存在的,非聚集索引物理存储并不连续。
b+树是单向链表还是双向链表?
叶子节点是双向链表;
叶子节点中的数据是单向链表。
RestFull有什么好处?
restful只是标准,标准的意思是如果在大家都依此行事的话,沟通成本会很低,开发效率就高。
什么是原子性?
一个操作,它要么完整的被执行,要么完全不执行。
没有执行一半这种情况,执行一半失败也会回滚。这种特性就叫原子性。
什么是幂等性?
不管执行多少次请求,所产生的结果都一样。
Post Put Patch 有什么区别?
Post多用于创建,Put Patch多用于更新。
Post每次执行都会创建一个资源,是非幂等的。
PUT更新需要传全部参数,客户端提交什么就替换什么,是幂等的。
PATCH更新可以只传部分参数,更节约网络资源;有时用于更新计数,比如+1,这种情况是非幂等的。
怎样在后端实现幂等性?
1、先查库再插入(占用数据库性能)
2、表单打开时,设置个表单token,存入redis,执行插入请求时带上这个token,
如果redis里有,就从redis删除改token并执行插入,
如果redis里没有,就表示已经插入过了,返回请勿重复提交。
怎样手动从容器获取服务?
先注入IServiceProvider,然后通过 serviceProvider.GetService(typeof(xxx)) as xxx; 获取服务
你通常使用WebApplicationBuilder做什么?
1、使用 builder.Configuration 添加配置。
2、使用 builder.Services 添加服务
3、使用 builder.Logging 配置日志
4、配置 IHostBuilder 和 IWebHostBuilder
WebHost和Host区别?
WebHost:网络主机(Http),用于Net Core 2.1创建主机;
Host:通用主机(HTTP + 非 HTTP 工作负载),用于Net Core 3-5创建主机;
WebApplication 用来作什么?
1、IHost - 用来启动和停止 Host
2、IApplicationBuilder - 用于建立中间件管道
3、IEndpointRouteBuilder - 用于添加路由端点
怎样用redis实现热搜排名?
采用zset,是有序集合,元素中的score参数实现排序,该参数可以是整数或小数,可重复;
每次搜索都更新score,实现实时更新排序。
怎样加快redis从数据库同步数据,保障redis数据及时性?
1、缓存数据设置超时时间。
2、并通过quartz定时同步数据库中的数据。
3、增量更新时,先更新redis,再更新数据库,这样查询会先走redis。
待更新数据可以存入队列,通过队列更新redis;
也可以使用canal监听mysql binlog,通过解析binlog的增量数据
怎样解决消息队列堆积?
1、通常的解决方案就是增加消费端实例。说白了就是增加机器。如果出现线上事故,能申请多少机器就申请多少机器,争取在最短的时间内消费掉积压在MQ中的消息。
2、如果申请机器行不通,毕竟公司的机器是有限的,此时可以增加消费端的消费能力。在MQ的配置中配置"最大消费者数量"与"每次从队列中获取的消息数量"
3、如果还是不能解决问题的话,还有另外一种解决方案。紧急上线专门用于记录消息的队列,不多BB,先把MQ中的消息记录到数据库中,然后再慢慢的消化处理。
怎样让消费者感知队列积存量?
记录日志,并监控该日志,当达到阈值会预警并提醒。
OAuth2.0 - 为什么先拿授权码再拿token?
授权码这步,不是你对授权中心直接进行请求;
而是你给用户一个授权中心的登录页面,让用户自己登陆,然后授权中心根据回调,请求你的服务,把授权码给你;
这一步,因为是请求你,所以你的服务可能就是http传输,直接在http上传输token是不安全的,所以授权服务只能先给你个授权码。
你拿着授权码+clientID,再请求授权中心,因为是授权中心的服务,所以可以确保是https的,是传输安全的,最终response会返给你token。
(clientID就是在微信开发者平台上注册的,标识你应用的唯一ID)
标签:string,redis,笔记,索引,更新,授权,net,数据 From: https://www.cnblogs.com/Vito666/p/16622393.html