C#与.NET技术
实践与教程

专注分享C#、ASP.NET Core、Azure、Blazor等微软技术栈的开发教程、架构设计和最佳实践

85
技术文章
42
教程系列
2.8k
月访问量
328
活跃读者
分布式唯一ID - 雪花ID Snowflake .Net版
2020-02-11 0k

分布式唯一ID - 雪花ID Snowflake .Net版

雪花Id介绍: 雪花ID是用一个64位的整形数字来做ID,对应.net中的long,数据库中的bigint,雪花算法的原始版本是scala版,用于生成分布式ID(纯数字,时间顺序),订单编号等。 生成的雪花Id: 35324861574164480 35324861578358784 35324861578358785 对比自增和Guid: 自增ID: 对于数据敏感场景不宜使用,且不适合于分布式场景。 GUID: 采用无意义字符串,且36位字符串太长,数据量增大时造成访问过慢,且不宜排序。 算法描述: 最高位是符号位,始终为0,不可用。 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。 10位的机器标识,10位的长度最多支持部署1024个节点。 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。 雪花算法改进,时钟回拨: 雪花ID严重依赖系统当前时间,当系统时间被人为反后调整时,算法会出问题,可能会出重复ID.Snowflake原算法是在检测到系统时间被回调后直接抛异常.本代码在时钟回拨后,会将生成的ID时间戳停留在最后一次时间戳上(每当序列溢出时会往前走一毫秒),等待系统时间追上后即可以避过时钟回拨问题. 这种处理方式的优点是时钟回拨后不会异常,能一直生成出雪花ID,但缺点是雪花ID中的时间戳不是系统的当前时间,会是回拨前的最后记录的一次时间戳,但相差也不大.不知道有没有什么生产系统会对这个时间戳要求非常严格,无法使用这种补救方式的? 当然停掉系统后的时钟回拨是无法处理的,这种还是会有可能出现重复ID的. 生成Id以及解析Id方法: 源码git地址:https://gitee.com/itsm/learning_example/tree/master/snowflake-雪花Id public class SnowflakeId { // 开始时间截((new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc)-Jan1st1970).TotalMilliseconds) private const long twepoch = 1577836800000L; // 机器id所占的位数 private const int workerIdBits = 5; // 数据标识id所占的位数 private const int datacenterIdBits = 5; // 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) private const long maxWorkerId = -1L ^ (-1L << workerIdBits); // 支持的最大数据标识id,结果是31 private const long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); // 序列在id中占的位数 private const int sequenceBits = 12; // 数据标识id向左移17位(12+5) private const int datacenterIdShift = sequenceBits + workerIdBits; // 机器ID向左移12位 private const int workerIdShift = sequenceBits; // 时间截向左移22位(5+5+12) private const int timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; // 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) private const long sequenceMask = -1L ^ (-1L << sequenceBits); // 数据中心ID(0~31) public long datacenterId { get; private set; } // 工作机器ID(0~31) public long workerId { get; private set; } // 毫秒内序列(0~4095) public long sequence { get; private set; } // 上次生成ID的时间截 public long lastTimestamp { get; private set; } /// <summary> /// 雪花ID /// </summary> /// <param name="datacenterId">数据中心ID</param> /// <param name="workerId">工作机器ID</param> public SnowflakeId(long datacenterId,long workerId ) { if (datacenterId > maxDatacenterId || datacenterId < 0) { throw new Exception(string.

分布式 Snowflake 雪花ID
阅读更多
HTTP / HTTPS 必备基础知识
前端
2019-12-05 0k

HTTP / HTTPS 必备基础知识

HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol)。 http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应 。 一、地址栏输入网址(url)后发生了什么 1. DNS解析 首先浏览器通过DNS解析根据域名获取IP。通过下面的顺序获取。其中某个节点返回IP就不继续执行。 浏览器缓存 –> 系统host –> 本地域名服务器LDNS –> Root Server 域名服务器 2. 建立连接 浏览器根据得到的IP和目标服务器经过三次握手建立 TCP 连接。 3. 请求 建立连接后,浏览器会向目标服务器发起 HTTP-GET 请求,包括其中的 URL,HTTP 1.1 后默认使用长连接,只需要一次握手即可多次传输数据。 4. 响应 如果目标服务器只是一个简单的页面,就会直接返回,状态码为200。如果有重定向 ,返回 301,302 以 3 开头的重定向码,浏览器在获取了重定向响应后,在响应报文中 Location 项找到重定向地址,浏览器重新第一步访问即可。 5. 关闭连接 应答结束后,web浏览器与webserver四次握手断开连接,以保证其它web浏览器能够与webserver建立连接。 http1.1不是立即断开连接,而是服务端使用超时断开的策略来维护连接,一般是300s左右 二、无状态协议 HTTP无状态协议,是指协议对于事务处理没有记忆能力。每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的。不过,可以通过cookie、session等机制解决这个问题。 三、HTTP请求方法 根据 HTTP 标准,HTTP 请求可以使用多种请求方法。 HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。 HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。 方法 描述 GET 请求指定的页面信息,并返回实体主体。 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 PUT 从客户端向服务器传送的数据取代指定的文档的内容。 DELETE 请求服务器删除指定的页面。 HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 CONNECT 协议中预留给能够将连接改为管道方式的代理服务器。 OPTIONS 允许客户端查看服务器的性能。 TRACE 回显服务器收到的请求,主要用于测试或诊断。 PATCH 对 PUT 方法的补充,用来对已知资源进行局部更新 。 四、HTTP报文 在HTTP连接中报文分为请求(request)和响应(response)两种。每种报文在请求头都有不同的字段来标识不同的用途。

http https TCP
阅读更多
Cookie、session、token、jwt简单说明
2019-09-15 0k

Cookie、session、token、jwt简单说明

【Cookie】:是由服务器端生成,发送给客户端的文本文件,下次请求时自动发送给服务端。 【session】:在服务端保存用户的状态,并用一个cookie标识进行存取 【token】:服务端把用户信息和密钥通过加密算法生成一个字符串 【jwt】:一种基于 JSON 的开放标准,一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。 可以理解是一种特殊的token

http Cookie Session
阅读更多
npm和cnpm的各种源以及切换管理工具nrm
前端
2019-09-15 0k

npm和cnpm的各种源以及切换管理工具nrm

npm 允许用户从NPM服务器下载第三方包到本地使用。 允许用户从NPM服务器下载并安装第三方命令行程序到本地使用。 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用 npm命令 npm -v 来测试是否成功安装 查看当前目录已安装插件:npm list 更新全部插件: npm update [ --save-dev ] 使用 npm 更新对应插件: npm update <name> [ -g ] [ --save-dev] 使用 npm 卸载插件: npm uninstall <name> [ -g ] [ --save-dev ] cnpm 淘宝团队做的国内镜像,因为npm的服务器位于国外可能会影响安装。淘宝镜像与官方同步频率目前为 10分钟 一次以保证尽量与官方服务同步。 安装:命令提示符执行 npm install cnpm -g --registry=https://registry.npm.taobao.org cnpm -v 来测试是否成功安装 通过改变地址来使用淘宝镜像 npm的默认地址是https://registry.npmjs.org/ npm config get registry查看npm的仓库地址 npm config set registry https://registry.npm.taobao.org改变默认下载地址,这样不安装cnpm就能采用淘宝镜像 nrm nrm能够管理所用可用的镜像源地址以及当前所使用的镜像源地址,但是只是单纯的提供了几个url并能够让我们在这几个地址之间方便切换

前端 npm cnpm
阅读更多
Linux系统Centos7部署DotNet Core项目及环境安装
后端
2019-09-06 0k

Linux系统Centos7部署DotNet Core项目及环境安装

1、环境安装及项目运行 安装 dotnet core #使用微软官方的源 sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm #更新软件源 sudo yum update #可以先搜索看一下列表 #yum search dotnet #安装 sudo yum install -y dotnet-sdk-3.1.x86_64 #查看是否安装成功 dotnet --version 下载项目 git clone https://github.com/raikay/firstdemo.git 生成项目 #进入生成目录 cd firstdemo/firstdemo #生成 dotnet publish -c release -o "publish" # -c 指定release; -o 指定生成目录 运行项目 dotnet firstdemo.dll --urls http://0.0.0.0:80 浏览器访问地址查看结果 http://192.168.198.131/WeatherForecast 至此已经成功运行! 2、supervisor创建守护进程 到上面的步骤程序运行没问题了,但是如果退出当前控制台,程序就会结束运行。 我们可以使用supervisor托管程序,创建守护进程,使程序持续运行。 安装supervisor yum install -y epel-release #安装扩展源 yum install -y supervisor 进入 supervisor控制台 supervisorctl 可以进入 supervisor 控制台,表示服务安装成功,并已成功启动

dotnet .NET Core Linux
阅读更多
正则表达式元字符简介
2019-08-06 0k

正则表达式元字符简介

元字符1 .:匹配除\n之外的任何单个字符。 例如正则表达式“b.g”能匹配如下字符串:“big”、“bug”、“b g”,但是不匹配“buug”,“b..g”可以匹配“buug”。 [ ] :匹配括号中的任何一个字符(范围,字符集合)。 例如正则表达式“b[aui]g”匹配bug、big和bag,但是不匹配beg、baug。可以在括号中使用连字符“-”来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式“a[0-9]c”等价于“a[0123456789]c”就可以匹配“a0c”、“a1c”、“a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母,“[A-Za-z0-9]”可以匹配任何的大小写字母或者数字。思考:x[这里必须是元音]y,如何写正则?【当.出现在[]中,则表示普通.,不作为元字符。】 | :将两个匹配条件进行逻辑“或”运算。 例如‘z|food’ 能匹配 “z” 或 “food”。‘(z|f)ood’ 则匹配 “zood” 或 “food”。 //注意^$问题。 ():将 () 之间括起来的表达式定义为“组”(group) 将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。把一些字符表示为一个整体。改变优先级、定义提取组两个作用。 元字符2(限定符) 限定符:限定前面的正则表达式出现的次数。 *:匹配0至多个在它之前的子表达式,和通配符*没关系。等价于{0,}。 例如正则表达式“zo*”(等同于z(o)*)能匹配 “z” 、“zo”以及 “zoo”;因此“.*”意味着能够匹配任意字符串。“z(b|c)*“→zb、zbc、zcb、zccc、zbbbccc。“z(ab)*“能匹配z、zab、zabab(用括号改变优先级)。 +:匹配前面的子表达式一次或多次,等价于{1,} 例如正则表达式9+匹配9、99、999等。 “zo+”能匹配 “zo”以及 “zoo” ,不能匹配"z”。 **? :匹配前面的子表达式零次或一次。等价于:{0,1} ** 例如,“do(es)?” 可以匹配 “do” 或 “does” 。【colou?r、favou?r】一般用来匹配“可选部分”。(终止贪婪模式) {n} :匹配确定的 n 次。“zo{2}”→zoo。 例如,“e{2}” 不能匹配“bed”中的“e”,但是能匹配“seed”中的两个“e”。 //seeeed,不可以。 {n,} :至少匹配n次。 例如,“e{2,}”不能匹配“bed”中的“e”(只出现一次,至少两次),但能匹配 “seeeeeeeed”中的所有“e”。 {n,m} :最少匹配 n 次且最多匹配 m 次。 例如“e{1,3}”将匹配“seeeeeeeed”中的前三个“e”。 {2,5}//bed,seed,seeed;beeeeed错误。 元字符3 ^(shift+6) :匹配一行的开始。 例如正则表达式“^regex”能够匹配字符串“regex我会用”的开始,但是不能匹配“我会用regex”。^另外一种意思:非!([^0-9]) $ :匹配行结束符。

dotnet 正则 正则表达式
阅读更多
正则表达式在C#中的使用
2019-08-06 0k

正则表达式在C#中的使用

正则表达式简介 正则表达式是对字符串的操作 正则表达式是一个用来描述字符串特征的表达式。 特征:必须出现的内容、可能出现的内容、不能出现的内容。 观察字符串规律,根据规律总结特征,然后根据特定字符串的特征来编写正则表达式。 常用函数: Regex.IsMatch(); //判断是否匹配 Regex.Match();//提取某个(一个)匹配 Regex.Matches();//提取所有的匹配 Regex.Replace();//替换 Regex.Split();//分割 Regex.IsMatch() 练习1:判断是否是合法的邮政编码(6位数字) lRegex.IsMatch("100830","^[0-9]{6}$") Regex.IsMatch("119", @"^\d{6}$"); 解释:由元字符定义得知“[0-9]”表示0到9的任意字符,“{6}”表示前面的字符匹配6次,因此“[0-9]{6}”中的{6}表示对数字匹配6次(000000123)。简写表达式得知“[0-9]”可以被“\d”代替,所以第二种写法“\d{6}”也是正确的。 练习2:判断一个字符串是不是身份证号码。 长度为15位或者18位的字符串,首位不能是0。 如果是15位,则全部是数字。 如果是18位,则前17位都是数字,末位可能是数字也可能是X。 写法一:^[1-9][0-9]{14}([0-9]{2}[0-9Xx])?$ 写法二: ^([1-9][0-9]{14}|[1-9][0-9]{16}[0-9X])$ 练习3:判断字符串是否为正确的国内电话号码,不考虑分机。 •010-8888888或010-88888880或010xxxxxxx •0335-8888888或0335-88888888(区号-电话号)03358888888 •10086、10010、95595、95599、95588(5位) •13888888888(11位都是数字) Regex.IsMatch(phoneNumber, @“^((\d{3,4}\-?\d{7,8})|(\d{5})|(\d{11}))$”); //或者 Regex.IsMatch(phoneNumber, @“^((\d{3,4}\-?\d{7,8})|(\d{5}))$”); 按照要求一个一个写,都用|连起来。注意:由于区号有时为010-xxxxxxx有时为010xxxxxxx,-可有可无,所以需要?,由于-表示一个区间,所以这里要转义-。最后不要忘记在所有|的最外层加一对() Regex.Match() / Matches() string msg = "大家好呀,hello,2010年10月10日是个好日子。恩,9494.吼吼!886."; Match match1 = Regex.Match(msg, @"\d", RegexOptions.ECMAScript); //提取得到 2 (逐个提取) Match match2 = Regex.Match(msg, @"\d+", RegexOptions.ECMAScript); //提取得到2010 //提取所有的匹配的字符串 MatchCollection matches = Regex.

dotnet 正则 C#
阅读更多
yum的基本使用以及替换国内源
后端
2019-05-16 0k

yum的基本使用以及替换国内源

yum源管理 1.备份原有的yum源,以防出错时还可以还原 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载同时改名 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #其他源 wget http://mirrors.163.com/.help/CentOS7-Base-163.repo #centos7系统的 wget http://mirrors.163.com/.help/CentOS6-Base-163.repo #centos6系统的 wget http://mirrors.163.com/.help/CentOS5-Base-163.repo #centos5系统的 (注:如果下载出现错误,可能是变更了下载的地址,可以到:http://mirrors.163.com/.help/centos.html 找新的下载地址。没有安装wget的,要先安装。) 3.产生新的缓存。 yum clean all yum makecache 至此源更新完成,可以 yum -y update 测试一下更新的速度。 安装软件 以安装Docker为例 安装最新版 yum install -y docker-ce docker-ce-cli containerd.io 安装指定版本 列出可用版本 $ yum list docker-ce --showduplicates | sort -r docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable 安装指定版本 <VERSION_STRING>需要替换为第二列的版本号,如:18.06.0.ce-3.el7 $ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.

linux yum 包管理
阅读更多
Net Core 3.x 禁用序列化时自动首字母小写
后端
2019-03-11 0k

Net Core 3.x 禁用序列化时自动首字母小写

public void ConfigureServices(IServiceCollection services) { services.AddControllers().AddJsonOptions(config => { //去掉转小写功能 // System.Text.Json.JsonNamingPolicy.CamelCase:转小写 // null:不转小写 config.JsonSerializerOptions.PropertyNamingPolicy =null; }); }

dotnet .NET Core 序列化
阅读更多
NuGet源中国加速镜像,博客园,华为等
后端
2019-03-11 0k

NuGet源中国加速镜像,博客园,华为等

打开Visual Studio => 工具 => NuGet包管理器 => 程序包管理器设置 NuGet微软官方中国镜像地址: https://nuget.cdn.azure.cn/v3/index.json 官方默认源: https://api.nuget.org/v3/index.json 博客园: https://nuget.cnblogs.com/v3/index.json 华为: https://repo.huaweicloud.com/repository/nuget/v3/index.json MyNuGet: https://dotnet.myget.org/F/dotnet-core/api/v3/index.json 这是一个很激进的 NuGet 源,包含各种日构建包(其中包括 .NET Standard 或者 .NET Core 等库的日构建版本),所以如果你希望尝试最新的 API 最新的功能,最好设置此 NuGet 源。 早期版本: https://www.nuget.org/api/v2/ https://nuget.org/api/v2/

dotnet NuGet 包管理
阅读更多