图片 2

.NET性能优化小技巧

.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事务是一组命令的集合。一个事务中的命令要么都执行,要么都不执行。如果命令在运行期间出现错误,不会自动回滚。
    管道与事务的区别:管道主要是网络上的优化,客户端缓冲一组命令,一次性发送到服务器端执行,但是并不能保证命令是在同一个事务里面执行;而事务是原子性的,可以确保命令执行的时候不会有来自其他客户端的命令插入到命令序列中。

数据结构优化

在使用较多的 Model 处考虑 Model
中是否有较多的无用字段,如果有可以考虑用一个新的轻量级的 Model ,优化
Model 数据结构优化内存存储。

常见应用问题

  • 缓存穿透处理
    什么是缓存穿透?当根据Redis
    key在缓存中查询后,不存在对应Value,就应该会在后端系统如DB中去查找,该Key的并发请求量一旦变大,那么就会对DB造成很大的压力。解决办法有:a.前端风险控制,将恶意穿透情况排除在外;b.对查询结果为空的情况依然进行缓存,但缓存时间会设置得很短,一般是几分钟。
  • 缓存雪崩处理
    什么是缓存雪崩?当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。解决办法有:后端连接数限制,错误阈值限制,超时处理,缓存失效时间均匀分布,前端永不失效及后端主动更新。
  • 缓存时长
    策略定位复杂,需要多维度的计算。
  • 缓存失效
    按时失效,事件失效,后端主动更新。
  • 缓存Key
    Hash、规则、前缀+Hash,异常情况可人工干预。
  • Lua脚本
    服务端批量处理及事务能力,有条件逻辑的可扩展脚本。使用它的好处有:减少网络开销、原子操作、可复用。
  • Limit
    可滑动时间窗口,如应用于Session,Memcached需每次传Key和Value。

缓存

重复使用的值缓存起来(根据数据需要选择使用缓存类型,变量缓存或内存缓存或redis等分布式缓存),减少数据库查询次数

Redis简单介绍安装(Centos)

下载地址,建议生产环境使用稳定版
1、 确保已经安装有编译工具make

图片 1

没有安装make可以使用:

yum install make -y

2、开始安装
RedisDesktopManage:页面效果:

图片 2

RedisDesktopManage下载地址:https://redisdesktop.com/
Redis官网:https://redis.io/
Redis安装推荐博客:http://blog.csdn.net/lc1010078424/article/details/78295482
很多其它博客写的是真的垃圾!

Sql 优化

  1. 如果需要同时插入许多数据,尽可能使用 BulkCopy 操作以提升性能

  2. 更新/查询条件优化,使用更准确的条件,尽可能使用主键查询和更新

  3. 批量更新数据的多次操作能够合并为一次操作的就合并为一次操作,不能合为一次操作就一次提交,注意防
    Sql 注入

  4. 复杂 Sql 使用事务时,能在 Sql
    中使用事务就在Sql中使用否则在代码中使用。使用事务时仅在需要开启事务的地方开启事务,事务结束就提交事务,不要在事务中掺杂不需要放在事务中处理的数据库操作

End

感谢大师,跟着大师进行一次性能优化,确实学到好多,自己对一些概念也是理解的更加深入了。