.NET性能优化小技巧

2019-05-02 06:11 来源:未知

.NET 性能优化小技巧

Redis听到最多的一句话就是Redis的使用难吗?不难,Redis用好容易吗?不容易,有时候觉得这句话说的挺好,但又是让读者挺心里咯噔一下的,还不如不说!

Intro

之前做了短信发送速度的提升,在大师的指导下,发送短信的速度有了极大的提升,学到了一些提升 .NET 性能的一些小技巧

概述简介

美洲杯赌球,Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,如字符串,哈希,列表,集合,具有范围查询的排序集,位图,超级日志和具有半径查询的地理空间索引。Redis具有内置复制,Lua脚本,LRU逐出,交易和不同级别的磁盘持久性,并通过Redis Sentinel提供高可用性,并通过Redis Cluster自动分区。
往简单的说就是:Redis是一个开源的Key-Value存储,它具有以下特点:

  • 速度非常快(每个人都知道)
  • 丰富的数据结构,包括String,List,Hash,Set,Sorted Set等
  • 单线程,免了线程切换和锁的性能消耗(搞不懂,整天研究的并发编程在这里不适用?)
  • 原子操作(作为数据库都有)
  • 可持久化(RDB与AOF)
  • 发布/订阅 (个人认为RabbitMQ这方面比较优越,在微服务RPC调用这里,作服务的发现)
  • 支持Lua脚本
  • 分布式锁 (集群的关键)
  • 事务 (作为数据库都有)
  • 主从复制与高可用(Redis Sentinel)
  • 集群(3.0版本以上)

HttpClient 优化

关于使用 HttpClient ,大概很多人都知道尽量使用单例以提升 HttpClient 的性能。

由于 HttpClient 在发送请求时需要进行域名解析,使用的时候第一次一般来说会慢一些,我们在 HttpClient 初始化完成之后,向目标地址发送一个 HEAD 请求,这样会把域名解析结果有一个缓存,实际去请求的时候所需用的域名解析的时间就会减少了,这样就可以提升第一次实际发送请求的速度。

HttpClient 的超时时间设置尽可能短以避免超长等待提升响应时间

Redis数据结构

建议直接看Redis官网的数据结构,因为从来不想看二手Redis数据结构,这里简单介绍:

  • String
    这是最简单的Redis类型。如果只使用这种类型,Redis就像一个可持久化的Memcached服务器。
  • List
    Redis的List是基于双向链表实现的,可以支持反向查找和遍历。
    常用案例:聊天系统、社交网络中获取用户最新发表的帖子、简单的消息队列、新闻的分页列表、博客的评论系统。
  • Hash
    Hash是一个String类型的field和value之间的映射表,请见下图,类似于.NET中的Hashtable和Dictionary。主要用来存储对象,可以避免序列化的开销和并发修改控制的问题。
  • Set
    Set也是一个列表,不过它的特殊之处在于它是可以自动排重的:当需要存储一个列表数据,而又不希望出现重复的时候,Set是一个很好的选择(比如ID的集合)。并且Set提供了判断某个成员是否在一个Set集合内的接口,这也是List所没有的。
  • Sorted Set
    Sorted Set和Set的使用场景类似,区别是Sorted Set会根据提供的score参数来进行自动排序。当你需要一个有序的并且不重复的集合列表,那么就可以选择Sorted Set数据结构。常用案例:游戏中的排行榜。

同步操作优化

原来的同步操作,可以改为异步处理的使用异步方法处理,

如查询数据库等操作大多可以改为异步操作,减少线程阻塞,进一步提高 CPU 的利用率。

多个任务的调度,可以不需要关心一个任务调度的话就可以同时启动任务而且无需等待。

Redis重要特性

  • 管道
    Redis服务是一种C/S模型,提供请求-响应式协议的TCP服务,所以当客户端请求发出,服务端处理并返回结果到客户端,一般是以阻塞形式等待服务端的响应,但这在批量处理连接时延迟问题比较严重,所以Redis为了提升或弥补这个问题,引入了管道技术:可以做到服务端未及时响应的时候,客户端也可以继续发送命令请求,做到客户端和服务端互不干涉影响,服务端并最终返回所有服务端的响应,这在促进原有C/S模型交互的响应速度上有了质的提高。
    特点:在C/S交互中,客户端可发送任意数请求命令,不需要等服务端响应后再行发送请求;而服务端可以一次性完成并返回所有客户端请求结果,也可以分批次返回请求结果,这主要看服务端处理结果的速度而定。
  • 事务
    Redis事务是一组命令的集合。一个事务中的命令要么都执行,要么都不执行。如果命令在运行期间出现错误,不会自动回滚。
    管道与事务的区别:管道主要是网络上的优化,客户端缓冲一组命令,一次性发送到服务器端执行,但是并不能保证命令是在同一个事务里面执行;而事务是原子性的,可以确保命令执行的时候不会有来自其他客户端的命令插入到命令序列中。
TAG标签:
版权声明:本文由美洲杯赌球发布于计算机教程,转载请注明出处:.NET性能优化小技巧