分类 后端技术 下的文章

并发编程模型: Actor模型

话说, 在并发编程中通常使用的两种方案是: 共享数据 与 消息传递. 使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争,处理各种锁的问题是让人十分头痛的一件事。 基于消息传递的并发模型有CSP模型(golang)和Actor模型, 这两种模型很像, 本文只讨论Actor模型. Actor简介 Actor模型是一个通用的并发编程模型,而非某个语言或框架所有,几乎可以用在任何一门编...

继续阅读 »

.NET高性能类及其优化技巧

基础知识 一般的,结构体的实例存储在栈中,引用类型存储在托管堆中 栈:空间比较小,但是读取速度快 堆:空间比较大,但是读取速度慢 引用结构体ref struct的数据保存在栈中,因此它的读写速度非常快,另一方面,栈中的数据销毁很快,而不是像托管堆一样,交给GC去回收 在大多数情况下,连续的内存操作比非连续性的内存操作要快特别是读操作, 多线程下连续内存的写由于CPU缓存伪共享问题性能反而...

继续阅读 »

[待完成].Net异步编程的前世今生APM/EAP/TPL/async-await

异步编程模型(APM) 早在.NET Framework 1.0中,就有异步编程模型模式,又称APM模式、Begin/End模式、IAsyncResult模式。 基于事件的异步模型(EAP) .net Framework 2.0引入了一些api,实现了处理异步操作的不同模式,这种模式主要用于在客户端应用程序上下文中处理异步操作。这种基于事件的异步模式或 EAP, EAP和Synchroniz...

继续阅读 »

Mysql数据库tinyint(1)字段存0/1回显true/false解决

MySQL数据库一个表中有一个tinyint(1)类型的字段,值为0或者1,如果取出来的话,0会变成false,1会变成true。 原因: 由于MySql中没有boolean类型,所以会用到tinyint(1)类型来表示,在mysql中boolean=tinyint(1), 有些MySQL工具中显示了有boolean或bool类型, 其实也是tinyint(1)的别名 解决方案: 修改t...

继续阅读 »

c#中常用类或组件的使用场景(归纳总结)

c#中常用的池对象及其使用场景 C# 中有多个池化对象,可以通过这些对象来管理和重用内存,减少不必要的内存分配和释放开销。以下是一些常见的池化对象: ArrayPool:用于管理数组池的类,可以重复使用数组内存,避免频繁的内存分配和垃圾回收。场景:高性能网络应用程序数据包处理/异步临时缓冲/大量数组计算 ObjectPool:用于管理对象池的类,可以重复使用对象实例,避免频繁的对象创...

继续阅读 »

MacOS使用教程及开发教程

使用教程(MacOS14为准) 开启SSH远程连接macOS 系统设置 - 通用 - 共享 - 远程登录 查看隐藏文件(以.开头的文件) 使用快捷键command + shift + . 终端工具 目前MacOS中最常用的终端工具: iTerm2(终端) + oh-my-zsh(主题) iTerm2安装配置使用指南——保姆级 右键助手 在appstore中安装右键助手,并配置 开发相关 .n...

继续阅读 »

.NET Core 多线程的用法

Thread 类 ThreadPool 类 Task 类 Parallel 类 Parallel.ForEach()用于数据并行性 Parallel.Invoke()用于任务并行性 async/await 异步操作 Concurrent 类:并发集合 线程安全(多线程并发同步) 使用lock关键字使并发线程同步 使用Interlocked类使并发线程同步 使用Mutex类使并发线程同步 并发...

继续阅读 »

什么是TCP粘包和半包?怎么解决?

为什么会有粘包问题? 粘包问题发生在 TCP/IP 协议中,因为 TCP 是面向连接的传输协议,它是以“流”的形式传输数据的,而“流”数据是没有明确的开始和结尾边界的,所以就会出现粘包问题。 粘包问题是指当发送两条消息时,比如发送了 ABC 和 DEF,但另一端接收到的却是 ABCD和EF,像这种一次性读取了两条数据的情况就叫做粘包(正常情况应该是一条一条读取的)。 半包问题是指,当发送的消...

继续阅读 »

CentOS6安装docker

CentOS6 安装docker 注意: docker官方已经找不到centos6版本的安装方式了, 官网上推荐是centos7及其以上版本的安装 只能通过rpm包安装 rpm包安装 # 查看服务器内核版本 [root@xxxxx ~]# uname -r 2.6.32-754.35.1.el6.x86_64 # rpm包安装 # 所有版本rpm包:https://cbs.centos.o...

继续阅读 »

.NET Core 配置GC工作模式与内存的影响

对GC工作模式的分类 为了满足不同的内存使用要求,GC 有一些选项来配置其运行方式。有两种主要模式:工作站模式(旨在最小化延迟)和服务器模式(旨在最大应用程序吞吐量)。GC 还支持两种“子模式”之一——并发或非并发 工作站模式 服务器模式 并发垃圾回收(.NET Framework 4以上被后台垃圾回收代替) 非并发垃圾回收(.NET Framework 4以上被后台垃圾回收代替) 后台垃...

继续阅读 »

.NET对象池的使用及其扩展: Microsoft.Extensions.ObjectPool

对象池介绍 池化并不是什么新鲜的技术,它更像一种软件设计模式,主要功能是缓存一组已经初始化的对象,以供随时可以使用。对象池大多数场景下都是缓存着创建成本过高或者需要重复创建使用的对象,从池子中取对象的时间是可以预测的,但是新建一个对象的时间是不确定的。 当需要一个新对象时,就向池中借出一个,然后对象池标记当前对象正在使用,使用完毕后归还到对象池,以便再次借出。 常见的使用对象池化场景: 对...

继续阅读 »

关于"函数式编程"编程的理解

什么是"函数式编程"? 函数式编程是一种风格范式,没有一个标准的教条式定义。函数式编程是一种编程范式,它将电脑运算视为函数运算,并且避免使用程序状态以及易变对象。其中,λ演算是该语言最重要的基础。而且λ演算的函数可以接受函数作为输入的参数和输出的返回值。 函数式编程只是一系列想法,而不是一套严苛的规定。 函数式编程具有什么样的特点? 函数是"第一等公民" 函数为第一公民是函数式编程的基础 如...

继续阅读 »

编程语言中高级特性:委托

形象的理解什么是委托 顾名思义,委托,把事情托付给他人或机构(办理)。诸如:“当事人委托律师出庭辩护”,“我能委托你办一件事吗”。总的来说就是委托方将具体的事情交给被委托方来做, 委托方不关心具体过程,只关心开始和结果。被委托方执行具体内容即可。 委托的使用会经历如下的过程 委托的声明: 定义委托内容中需要什么,达到什么样的效果。定义出庭辩护 编写委托方法: 按照定义的标准, 详细制定委托...

继续阅读 »

/bin/sh^M: bad interpreter:解决办法

/bin/sh^M: bad interpreter:解决办法 xcode编译时有时候遇到/bin/sh^M: bad interpreter:没有那个文件或目录这样的错误 可以用以下方式解决 先在控制台cd到报错的目录 vim xxx.sh # xxx.sh报错的那个文件 :set ff # 如果出现fileforma=dos那么就基本可以确定是这个问题了。 :set ff=unix # ...

继续阅读 »

记一次线上更换系统:涉及到java7 rpm deb 32位 64位

由于目标程序依赖java7,但是java7版本官方未维护了,且大多数源中都不提供7版本的了 众所周知,java7安装需要非常多的依赖,ubuntu22.04安装非常麻烦,搞了半天最终还是放弃了。 然而,目标程序只有openfire-3.10.3-1.i386.rpm集成了java7可以直接使用,但是ubuntu中无法安装32位的rpm程序。 错误:the package cannot be ...

继续阅读 »

.NET Core诊断工具及其用法

.NET CLI命令 本地和全局管理工具 诊断工具 代码分析工具 实战演练 其他工具 核心转储(core dump)是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件(进程内存的快照)。这种信息往往用于调试(事后调试)。 扩展阅读 官方文档: .NET CLI 概述 官方文档: 如何管理 .NET 工具 官方文档: .NET Cor...

继续阅读 »