摘要:
队列: 队列是一个有序列表,遵循先入先出原则,可以用数组或链表实现 使用场景 用于排队,按顺序执行 客户端: public static void Main(string[] args) { ArrayQueue<int> queue = new ArrayQueue<int>(6); queue.
阅读全文
posted @ 2020-07-11 18:04
.Neterr
阅读(148)
推荐(0)
摘要:
稀疏数组: 当一个元素中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数据。 稀疏数组的处理方法: 记录一个数组有多少个不同的值,把具有不同值的元素的行列及值记录在一个小规模数组中,从而缩小程序的规模 使用场景 序列化大部分元素值相同的数组,可以节省存储空间 客户端 public
阅读全文
posted @ 2020-07-11 17:02
.Neterr
阅读(204)
推荐(0)
摘要:
思路 野路子实现,完全自己想出来的实现方式,将棋盘转成一维数组,寻找横向、纵向、左斜、右斜元素下标的关系。 横向:元素之间下标相差1; 纵向:元素之间下标相差棋盘宽度; 右斜:元素之间下标相差宽度+1; 左斜:元素之间下标相差宽度-1; 客户端 没有写界面,先用测试数据 public static
阅读全文
posted @ 2020-07-11 14:59
.Neterr
阅读(606)
推荐(0)
摘要:
定义 责任链,顾名思义,就是用来处理相关事务责任的一条执行链,执行链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某个节点处理完了就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕 案例 客户端输入校验,需要多个校验步骤,比如sql注入校验、违禁词校验、js校验 客户端调用
阅读全文
posted @ 2020-07-10 22:39
.Neterr
阅读(182)
推荐(0)
摘要:
官方定义 适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作 说明 适配器模式数据结构型设计模式 当接口已经存在,通过适配器类使接口不兼容的那些类可以一起工作 案例 在电商项目中会对接多个支付接口,不同的支付接口调用方式不一样,有些是
阅读全文
posted @ 2020-07-10 09:00
.Neterr
阅读(192)
推荐(0)
摘要:
什么是桥接模式 桥接模式是一种结构型设计模式,它将一个大类或一系列紧密相关的类拆分成抽象和实现两个独立的层次结构,使它们可以分别变化。桥接模式通过将抽象部分与实现部分分离,可以使它们可以独立地扩展和变化。 使用场景 如果一个系统需要在构建的抽象化角色和具体角色之间增加更多的灵活性,避免在两个层次之间
阅读全文
posted @ 2020-07-09 23:41
.Neterr
阅读(940)
推荐(0)
摘要:
秒杀案例介绍 秒杀需要校验优惠券库存、每个用户只能使用一个优惠券,校验完成后下单。常规流程需要加锁,并发量低、数据库压力大。 如何优化? 将秒杀流程分为两个阶段,并且使用redis 第一阶段 校验优惠券库存、校验用户是否已使用优惠券。校验通过后扣减库存、记录使用优惠券的用户id。整个操作应该保证原子
阅读全文
posted @ 2020-07-09 19:39
.Neterr
阅读(539)
推荐(0)
摘要:
核心接口和类 IConnection:表示一个连接 IModel:表示一个Channel ConnectionFactory:连接工厂 IBasicConsumer:代表一个消费者消息 DefaultBasicConsumer:常用的消费者基类 主要命名空间 RabbitMQ.Client:核心AP
阅读全文
posted @ 2020-07-09 16:14
.Neterr
阅读(637)
推荐(0)
摘要:
消息队列(MQ): 是一种应用程序间通讯方法,不需要程序之间直接建立联系。MQ是用于接收、存储、分发消息的独立应用程序。 常见的MQ ActiveMQ:基于JMS RocketMQ:阿里巴巴的产品,基于JMS Kafka:分布式消息系统,亮点:吞吐量超级高,每秒数十万的并发。 RabbitMQ:由e
阅读全文
posted @ 2020-07-09 14:42
.Neterr
阅读(136)
推荐(0)
摘要:
众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。 HashMap数组每一个元素的初始值都是Null。 对于HashMap,我们最常使用的是两个方法:Get 和 Pu
阅读全文
posted @ 2020-07-09 09:36
.Neterr
阅读(126)
推荐(0)
摘要:
当Mysql的查询缓存开启后,执行查询SQL语句时,SQL语句和数据会被缓存,下次查询直接从缓存中查,直到数据被修改,缓存失效,修改比较频繁的表不适合做查询缓存 当前数据库是否支持查询缓存 show variables like 'have_query_cache' 是否开启了查询缓存 show V
阅读全文
posted @ 2020-07-09 09:16
.Neterr
阅读(140)
推荐(0)
摘要:
缓存更新策略 设置缓存的过期时间,一致性差 主动更新,更新数据库时主动更新缓存 建议主动更新为主,过期淘汰兜底,因为主动更新也不能完全保证一致性 主动更新策略 Cache Aside Pattern 由缓存的调用者,在更新数据库的同时更新缓存 Read/Write Through Pattern 缓
阅读全文
posted @ 2020-07-06 23:30
.Neterr
阅读(198)
推荐(0)
摘要:
public class BloomFilter { public BitArray _BloomArray; public Int64 BloomArryLength { get; } public Int64 BitIndexCount { get; } /// <summary> /// 初始
阅读全文
posted @ 2020-07-05 21:03
.Neterr
阅读(449)
推荐(0)
摘要:
什么是布隆过滤器 布隆过滤器(Bloom Filter)是一种比较巧妙的概率型数据结构,它可以告诉你某种东西一定不存在或者可能存在。当布隆过滤器说,某种东西存在时,这种东西可能不存在;当布隆过滤器说,某种东西不存在时,那么这种东西一定不存在。 布隆过滤器相对于Set、Map 等数据结构来说,它可以更
阅读全文
posted @ 2020-07-05 19:55
.Neterr
阅读(378)
推荐(0)
摘要:
缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。 解决方案 缓存空对象 布隆过滤 增强id的复杂度,避免被猜测id规律 做好数据的基础格式校验 加强用户权限校验 做好热点参数的限流 缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失
阅读全文
posted @ 2020-07-05 11:38
.Neterr
阅读(525)
推荐(0)
摘要:
# 介绍 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Redis通过内置的 Lua 解释器,可以使用 `EVAL `命令对 Lua 脚本进行求值。在lua脚本中可以通过两个不同的函数调用redis命
阅读全文
posted @ 2020-07-04 19:03
.Neterr
阅读(484)
推荐(0)
摘要:
介绍 redis对事务的支持目前还比较简单。不保证事务的一致性,即使中间有一条命令出错了,其他命令仍然可以正常执行,并且无法回滚。 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起执行,期间不会插入其他的命令。(隔离级别序列化) redis只能保证一个client发起的事
阅读全文
posted @ 2020-07-04 18:36
.Neterr
阅读(267)
推荐(1)
摘要:
dnSpy 是用于 .NET 调试的最有用的工具之一。它是一个很好的反编译器。但是它的主要用途是作为调试器。dnSpy允许你调试任何 .NET程序,而无需考虑符号或者源代码。 该工具的外观和感觉类似于Visual Studio。当你开始调试没有符号或者源代码的.NET进程时,dnSpy将向你显示反编
阅读全文
posted @ 2020-06-29 18:34
.Neterr
阅读(3029)
推荐(0)
摘要:
小表驱动大表,即小的数据集驱动大得数据集。在知道什么是小表驱动达大表之前,我们先来了解两个查询关键字,IN 与 EXISTS。我们通过两段查询语句先来了解一下它们的作用。我建立了两张表,一张员工表,一张部门表,将这两张表关联起来。 我们先使用IN 来查询数据: SELECT * FROM t_emp
阅读全文
posted @ 2020-06-27 10:08
.Neterr
阅读(509)
推荐(0)
摘要:
简介 事务是一组操作的集合,它是一个不可分割的工作单元,事务会把所有操作作为一个整体向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 事务的四大特性(ACID) 原子性(Atomicity) 事务是不可分隔的最小单元,多个操作要么全部成功,要么全部失败。原子性只能保证单个事务的一致性
阅读全文
posted @ 2020-06-26 16:19
.Neterr
阅读(159)
推荐(0)
摘要:
默认关闭,除非需要查看慢sql日志,平时不要打开 以下设置都是临时有效,重启数据库后会失效,想要永久生效需要修改配置文件进行配置 参数说明 slow_query_log 慢查询开启状态 slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置
阅读全文
posted @ 2020-06-26 10:53
.Neterr
阅读(158)
推荐(0)
摘要:
mysql中的explain命令可以查看sql语句是否使用了索引,用了什么索引,有没有全表扫描,帮助我们优化查询语句 查看索引 SHOW INDEX FROM 表名 EXPLAIN explain出来的信息有10列,主要介绍type、key、Extra这几个字段 id select 查询的序列号,表
阅读全文
posted @ 2020-06-23 00:25
.Neterr
阅读(132)
推荐(0)
摘要:
介绍 索引是帮助 MySQL 高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构上实现高级查询算法,这种数据结构就是索引。 优点 大大提高了查询速度,降低数据库的IO成本 通过索引列对数据进行排序,降低数
阅读全文
posted @ 2020-06-18 14:39
.Neterr
阅读(175)
推荐(0)
摘要:
慎用!=、<>、OR、IS NULL、IS NOT NULL等,它们会导致索引失效,用以下方案 使用范围查询替代不等于!=、<> -- 原始低效查询 SELECT * FROM products WHERE status != 'out_of_stock'; -- 优化方案1:使用范围查询 SELE
阅读全文
posted @ 2020-06-14 22:49
.Neterr
阅读(274)
推荐(0)
摘要:
互斥锁 一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩写 Mutex)。实现了互斥锁对象有:Monitor,Mutex,SpinLock 信号量 还有些房间,可以同时容纳n个人,比如
阅读全文
posted @ 2020-06-14 22:39
.Neterr
阅读(427)
推荐(1)
摘要:
Hashtable、Dictionary Hashtable、Dictionary:使用方式类似,都是存储键值对,推荐Dictionary Hashtable Hashtable存储键值对,key、value都是object类型 直接实例化的 Hashtable(如 new Hashtable()
阅读全文
posted @ 2020-06-14 17:59
.Neterr
阅读(499)
推荐(0)
摘要:
通过分析源码可以更好理解List<T>的工作方式,帮助我们写出更稳定的代码。 List<T>源码地址: https://github.com/dotnet/corefx/blob/master/src/System.Collections/src/System/Collections/Generic
阅读全文
posted @ 2020-06-13 22:14
.Neterr
阅读(245)
推荐(0)
摘要:
不使用表达式树,使用强类型生成where子句,好处是性能高,相比表达式树生成的sql,10倍+ 目前只支持生成where条件、查询语句,后期会增加生成Update SQL 支持生成Sqlserver、Mysql语句 where子句支持相等、比较大小、Between、Like、In操作 sql语句支持
阅读全文
posted @ 2020-06-09 19:22
.Neterr
阅读(255)
推荐(0)
摘要:
如果直接使用如下方式扩展系统函数,常常会导致冲突,有可能和系统函数重名或第三方引用的js也扩展了此函数 Array.prototype.first=function(){}; 安全扩展系统函数: var ArrayEx = (function(){ function ArrayEx(array){
阅读全文
posted @ 2020-06-06 17:25
.Neterr
阅读(191)
推荐(0)
摘要:
目的: 将多个资源文件(css、js)捆绑在一个文件中 压缩文件,去除空格换行,减小文件体积 步骤: 1、在NuGet下载 BuildBundlerMinifier 包 2、在项目根目录创建配置文件,如下: [ { "outputFileName": "wwwroot/js/info.min.js"
阅读全文
posted @ 2020-06-06 13:07
.Neterr
阅读(1124)
推荐(0)
摘要:
一. 前言 1.关于JWT的Token过期问题,到底设置多久过期? (1).有的人设置过期时间很长,比如一个月,甚至更长,等到过期了退回登录页面,重新登录重新获取token,期间登录的时候也是重新获取token,然后过期时间又重置为了1个月。这样一旦token被人截取,就可能被人长期使用,如果你想禁
阅读全文
posted @ 2020-06-04 22:38
.Neterr
阅读(1901)
推荐(0)
摘要:
简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表而不是基于库的,所以存储引擎也可以被称为表引擎。 MySQL默认存储引擎是InnoDB。 相关操作 -- 查询建表语句 show create table account; -- 建表时指定存储引擎 CREATE
阅读全文
posted @ 2020-06-01 10:21
.Neterr
阅读(695)
推荐(0)
摘要:
介绍 读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁。在C#中,推荐使用ReaderWriterLockSlim类来完成读写锁的功能。 某些场合下,对一个对象的读取次数远远大于修改次数,如果只是简单的用lock方式加锁,则会影响读取的效率。而如
阅读全文
posted @ 2020-05-31 16:55
.Neterr
阅读(413)
推荐(0)
摘要:
自旋锁(spinlock) 是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。 什么情况下使用自旋锁 自旋锁非常有助于避免阻塞,但是如果预期有大量阻塞,由于旋转过多,您可能不应该使用自旋锁。当锁是细粒度的并且数
阅读全文
posted @ 2020-05-31 10:49
.Neterr
阅读(414)
推荐(0)
摘要:
KestrelServer Kestrel 是一个跨平台的适用于 Kestrel。 Kestrel 是 Web 服务器,默认包括在 ASP.NET Core 项目模板中。 如何使用 可以单独使用 Kestrel,也可以将其与反向代理服务器(如 IIS、Nginx 或 Apache)结合使用。 反向代
阅读全文
posted @ 2020-05-29 20:14
.Neterr
阅读(1810)
推荐(0)
摘要:
引言 使用HTTP(超文本传输)协议访问互联网上的数据是没有经过加密的。也就是说,任何人都可以通过适当的工具拦截或者监听到在网络上传输的数据流。但是有时候,我们需要在网络上传输一些安全性或者私秘性的数据,譬如:包含信用卡及商品信息的电子订单。这个时候,如果仍然使用HTTP协议,势必会面临非常大的风险
阅读全文
posted @ 2020-05-29 19:13
.Neterr
阅读(491)
推荐(0)
摘要:
单体架构 应用程序就是一个项目,在一个进程中运行 单体架构的优点是开发简单、集中管理、没有分布式损耗 微服务架构 微服务架构是一种架构风格,旨在通过将单体程序的功能分解到各个离散的服务中心以实现对解决方案的解耦 DDD是一个很好的应用于微服务架构的方法论。 微服务架构特点: 一组小的服务 独立进程、
阅读全文
posted @ 2020-05-29 13:32
.Neterr
阅读(796)
推荐(0)
posted @ 2020-05-28 23:30
.Neterr
阅读(1022)
推荐(0)
摘要:
ConfigureServices方法中添加: public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(CookieAuthenticationDefaults.Authentic
阅读全文
posted @ 2020-05-28 11:29
.Neterr
阅读(338)
推荐(0)
摘要:
实现IApplicationModelConvention接口: public class NameSpaceVersionRoutingConvention:IApplicationModelConvention { private readonly string apiPrefix; priva
阅读全文
posted @ 2020-05-27 23:19
.Neterr
阅读(495)
推荐(0)