winform 线程监听两个目录下的文件_vb.net 利用.net自带的GZipStream压缩或者解压文件的代码,不需要任何第三方控件...

网上很少有用VB写的压缩文件的代码,但是,在网络传输,文件下载,打包发布等等方面的需求又比较多,所以,借鉴了一下C#代码的例子,改造成了VB用的类。另外加上了多层文件夹压缩解压。但是,因为时间有限,只是将文件全部读取到缓存处理,所以,针对大文件没有做特别的处理。例子里面有提示,根据需要自己改动一下吧。

文件:n459.com/file/25127180-478678624

以下内容无关:

-------------------------------------------分割线---------------------------------------------

在日常开发中,为了保证数据的一致性,我们一般都选择关系型数据库来存储数据,如 MySQLOracle 等,因为关系型数据库有着事务的特性。然而在并发量比较大的业务场景,关系型数据库却又往往会成为系统瓶颈,无法完全满足我们的需求,所以就需要使用到缓存,而非关系型数据库,即 NoSQL 数据库往往又会成为最佳选择。

NoSQL 数据库最常见的解释是 non-relational,也有人解释为 Not Only SQL。非关系型数据库不保证事务,也就是不具备事务 ACID 特性,这也是非关系型数据库和关系型数据库最大的区别,而我们即将介绍的 Redis 就属于 NoSQL 数据库的一种。

什么是 Redis

Redis 全称是:REmote DIctionary Service,即远程字典服务。Redis 是一个开源的(遵守 BSD 协议)、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库。Redis 具有以下特性:

  • 1、支持丰富的数据类型:字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sorted sets),位图等。
  • 2、功能丰富:提供了持久化机制,过期策略,订阅/发布等功能。
  • 3、高性能,高可用且支持集群。
  • 4、提供了多种语言的 API

Redis 的安装

  • 1、下载对应版本的安装包,如:Redis 5.0.5 版本,其他版本也可以点击这里进行下载。
  • 2、下载好之后传到服务器指定目录,执行命令 tar -zxvf redis-5.0.5.tar.gz 进行解压。
  • 3、解压成功之后,进入 Redis 主目录,执行命令 make && make install PREFIX=/xxx/xxx/redis-5.0.5 进行安装,如果不指定目录,则默认是安装在 /usr/local 目录下。
  • 4、安装成功之后可以看到 Redis 主目录下多了一个 bin 目录,bin 目录内包含了一些可执行脚本。
  • 5、回到 Redis 主目录下,找到 redis.conf 配置文件,将其中的配置 daemonize no 修改为 daemonize yes,表示在后台启动服务。
  • 6、然后就可以执行命令 /xxx/xxx/redis-5.0.5/bin/redis-server /xxx/xxx/redis-5.0.5/redis.conf 启动 Redis 服务。

Redis 到底有多快

大家可能都知道 Redis 很快,可是 Redis 到底能有多快呢,比如 Redis 的吞吐量能达到多少?我想这就不是每一个人都能说的上来一个具体的数字了。

Redis 官方提供了一个测试脚本,可以供我们测试 Redis 的 吞吐量。

  • redis-benchmark -q -n 100000 可以测试常用命令的吞吐量。
  • redis-benchmark -t set,lpush -n 100000 -q 测试 Redis 处理 setlpush 命令的吞吐量。
  • redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')" 测试 Redis 处理 Lua 脚本等吞吐量。

下图就是我这边执行第一条命令的自测结果,可以看到大部分命令的吞吐量都可以达到 4 万以上,也就是说每秒钟可以处理 4 万次以上请求:

26bd41b62e7f7c32ec2a069325b028c3.png

但是如果你以为这就是 Redis 的真实吞吐量,那就错了。实际上,Redis 官方的测试结果是可以达到 10 万的吞吐量,下图就是官方提供的一个基准测试结果(纵坐标就是吞吐量,横坐标是连接数):

3913d466b98469700c72d9a1fe190269.png

Redis 是单线程还是多线程

这个问题比较经典,因为在很多人的认知里,Redis 就是单线程的。然而 Redis4.0 版本开始就有了多线程的概念,虽然处理命令请求的核心模块确实是保证了单线程执行,然而在其他许多地方已经有了多线程,比如:在后台删除对象,通过 Redis 模块实现阻塞命令,生成 dump 文件,以及 6.0 版本中网络 I/O 实现了多线程等,而且在未来 Redis 应该会有越来越多的模块实现多线程。

所谓的单线程,只是说 Redis 的处理客户端的请求(即执行命令)时,是单线程去执行的,并不是说整个 Redis 都是单线程。

Redis 为什么选择使用单线程来执行请求

Redis 为什么会选择使用单线程呢?这是因为 CPU 成为 Redis 瓶颈的情况并不常见,成为 Redis 瓶颈的通常是内存或网络带宽。例如,在一个普通的 Linux 系统上使用 pipelining 命令,Redis 可以每秒完成 100 万个请求,所以如果我们的应用程序主要使用 O(N)O(log(N)) 复杂度的命令,它几乎不会使用太多的 CPU

那么既然 CPU 不会成为瓶颈,理所当然的就没必要去使用多线程来执行命令,我们需要明确的一个问题就是多线程一定比单线程快吗?答案是不一定。因为多线程也是有代价的,最直接的两个代价就是线程的创建和销毁线程(当然可以通过线程池来一定程度的减少频繁的创建线程和销毁线程)以及线程的上下文切换。

在我们的日常系统中,主要可以区分为两种:CPU 密集型 和 IO 密集型。

  • CPU 密集型:这种系统就说明 CPU 的利用率很高,那么使用多线程反而会增加上下文切换而带来额外的开销,所以使用多线程效率可能会不升反降。举个例子:假如你现在在干活,你一直不停的在做一件事,需要 1 分钟可以做完,但是你中途总是被人打断,需要花 1 秒钟时间步行到旁边去做另一件事,假如这件事也需要 1 分钟,那么你因为反复切换做两件事,每切换一次就要花 1 秒钟,最后做完这 2 件事的时间肯定大于 2 分钟(取决于中途切换的次数),但是如果中途不被打断,你做完一件事再去做另一件事,那么你最多只需要切换 1 次,也就是 21 秒就能做完。
  • IO 密集型:IO 操作也可以分为磁盘 IO 和网络 IO 等操作。大部分 IO 操作的特点是比较耗时且 CPU 利用率不高,所以 Redis 6.0 版本网络 IO 会改进为多线程。至于磁盘 IO,因为 Redis 中的数据都存储在内存(也可以持久化),所以并不会过多的涉及到磁盘操作。举个例子:假如你现在给树苗浇水,你每浇完一次水之后就需要等别人给你加水之后你才能继续浇,那么假如这个等待过程需要 5 秒钟,也就是说你浇完一次水就可以休息 5 秒钟,而你切换去做另一件事来回只需要 2 秒,那么你完全可以先去做另一件事,做完之后再回来,这样就可以充分利用你空闲的 5 秒钟时间,从而提升了效率。

使用多线程还会带来一个问题就是数据的安全性,所以多线程编程都会涉及到锁竞争,由此也会带来额外的开销。

什么是 I/O 多路复用

I/O 指的是网络 I/O, 多路指的是多个 TCP 连接(如 Socket),复用指的是复用一个或多个线程。I/O 多路复用的核心原理就是不再由应用程序自己来监听连接,而是由服务器内核替应用程序监听。

Redis 中,其多路复用有多种实现,如:selectepollevportkqueue 等。

我们用去餐厅吃饭为的例子来解释一下 I/O 多路复用机制(点餐人相当于客户端,餐厅的厨房相当于服务器,厨师就是线程)。

  • 阻塞 IO:张三去餐厅吃饭,点了一道菜,这时候他啥事也不干了,就是一直等,等到厨师炒好菜,他就把菜端走开始吃饭了。也就是在菜被炒好之前,张三被阻塞了,这就是 BIO(阻塞 IO),效率会非常低下。
  • 非阻塞 IO:张三去餐厅吃饭,点了一道菜,这时候张三他不会一直等,找了个位置坐下,刷刷抖音,打打电话,做点其他事,然后每隔一段时间就去厨房问一下自己的菜好了没有。这种就属于非阻塞 IO,这种方式虽然可以提高性能,但是如果有大量 IO 都来定期轮询,也会给服务器造成非常大的负担。
  • 事件驱动机制:张三去餐厅吃饭,点了一道菜,这时候他找了个位置坐下来等:
    • 厨房那边菜做好了就会把菜端出来了,但是并不知道这道菜是谁的,于是就挨个询问顾客,这就是多路复用中的 select 模型,不过 select 模型最多只能监听 1024socketpoll 模型解决了这个限制问题)。
    • 厨房做好了菜直接把菜放在窗口上,大喊一声,某某菜做好了,是谁的快过来拿,这时候听到通知的人就会自己去拿,这就是多路复用中的 epoll 模型。

需要注意的是在 IO 多路复用机制下,客户端可以阻塞也可以选择不阻塞(大部分场景下是阻塞 IO),这个要具体情况具体分析,但是在多路复用机制下,服务端就可以通过多线程(上面示例中可以多几个厨师同时炒菜)来提升并发效率。

Redis 中 I/O 多路复用的应用

Redis 服务器是一个事件驱动程序,服务器需要处理两类事件:文件事件和时间事件。

  • 文件事件:Redis 服务器和客户端(或其他服务器)进行通信会产生相应的文件事件,然后服务器通过监听并处理这些事件来完成一系列的通信操作。
  • 时间事件:Redis 内部的一些在给定时间之内需要进行的操作。

Redis 的文件事件处理器以单线程的方式运行,其内部使用了 I/O 多路复用程序来同时监听多个套接字(Socket)连接,提升了性能的同时又保持了内部单线程设计的简单性。下图就是文件事件处理器的示意图:

3614898d3d81f004b5a9730b306e6fb8.png

I/O 多路复用程序虽然会同时监听多个 Socket 连接,但是其会将监听的 Socket 都放到一个队列里面,然后通过这个队列有序的,同步的将每个 Socket 对应的事件传送给文件事件分派器,再由文件事件分派器分派给对应的事件处理器进行处理,只有当一个 Socket 所对应的事件被处理完毕之后,I/O多路复用程序才会继续向文件事件分派器传送下一个 Socket 所对应的事件,这也可以验证上面的结论,处理客户端的命令请求是单线程的方式逐个处理,但是事件处理器内并不是只有一个线程。

Redis 为什么这么快

Redis 为什么这么快的原因前面已经基本提到了,现在我们再进行总结一下:

  • 1、Redis 是一款纯内存结构,避免了磁盘 I/O 等耗时操作。
  • 2、Redis 命令处理的核心模块为单线程,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减少了线程上下文切换的消耗。
  • 3、采用了 I/O 多路复用机制,大大提升了并发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是“ rpcsvchost”,以及为什么它在Mac上运行?

You find something called rpcsvchost while using Activity Monitor to see what’s running on your Mac. What is this process, and should you be worried? In a word, no: rpcsvhost is a core part of macOS. 在使用“活动监视器”查看Mac上正在运行的内容时&#xff…

自定义异常禁用异常堆栈_如何在Mac上禁用或自定义自动更正

自定义异常禁用异常堆栈Sometimes, autocorrect gets it wrong, replacing a word you meant to type with something completely different. You can customize it to fix these issues or disable it altogether. 有时候,自动更正会把它弄错,用完全不同…

控制dcom程序使用端口_使用VS Code调试.net控制台应用程序的方法

本文由 比特飞 原创发布,欢迎大家踊跃转载。转载请注明本文地址:https://www.byteflying.com/archives/6928。1、概述本文向大家介绍使用Visual Studio Code调试.net控制台应用程序的方法。2、方案首先在创建好一个控制台应用程序,再在扩展中…

4khz的带宽是指什么意思_扬声器和耳机的Hz-KHz范围是什么意思?

4khz的带宽是指什么意思If you’ve looked at high-end headphones or speakers, you’ve probably noticed numbers on the spec sheet that read something like “20Hz-20KHz.” What do these numbers mean? 如果您看过高端耳机或扬声器,则可能已经注意到规格表…

vlc传输_如何使用VLC通过网络流式传输视频和音乐

vlc传输VLC includes a fairly easy-to-use streaming feature that can stream music and videos over a local network or the Internet. You can tune into the stream using VLC or other media players. VLC包括一个相当易于使用的流媒体功能,可以通过本地网络…

python实现异步的几种方式_终于搞明白了,异步Python比同步Python究竟快在哪里?...

大家好,你是否听人们说过,异步 Python 代码比“普通(或同步)Python 代码更快? 果真是那样吗?同步和异步是什么意思?Web 应用程序通常要处理许多请求,这些请求在短时间内来自不同的客户端。为避免处理延迟&a…

您可能没有注意到的7个Ubuntu File Manager功能

The Nautilus file manager included with Ubuntu includes some useful features you may not notice unless you go looking for them. You can create saved searches, mount remote file systems, use tabs in your file manager, and more. Ubuntu随附的Nautilus文件管理器…

P3174 [HAOI2009]毛毛虫(树形dp)

P3174 [HAOI2009]毛毛虫 题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大。例如下图左边的树(图 1 )抽出一部分就变成了右边的一个毛毛虫了&am…

wdcp mysql密码_WDCP提示无法连接mysql及创建站点提示mysql密码不正确

一、wdcp系统访问提示无法连接mysql1、可能是mysql服务没启动,首先ssh登陆服务器,然后执行service mysqld restart重启mysql再访问试下,如果无法启动,先用df -lh查看下home分区有没有挂载,如果没有挂载尝试先重启&…

applecare多少钱?_否,AppleCare +无法覆盖丢失或被盗的iPhone

applecare多少钱?Losing your iPhone or getting it stolen is pretty common these days, but it’s important to know that while AppleCare covers accidental damage, it doesn’t cover a lost or stolen iPhone. 如今,丢失iPhone或使其被盗很普遍&#xff0…

HDFS文件目录操作代码

分布式文件系统HDFS中对文件/目录的相关操作代码,整理了一下,大概包括以下部分: 文件夹的新建、删除、重命名文件夹中子文件和目录的统计文件的新建及显示文件内容文件在local和remote间的相互复制定位文件在HDFS中的位置,以及副本…

craigslist_如何设置Craigslist警报(用于电子邮件或SMS)

craigslistWhether you’re looking for apartments or used gadgets on Craigslist, you don’t have to keep checking the website. You can stay on top of things by getting notified when new posts go up that match your searches. 无论您是在Craigslist上寻找公寓还是…

Django模板语言中的自定义方法filter过滤器实现web网页的瀑布流

模板语言自定义方法介绍 自定义方法注意事项 Django中有simple_tag 和 filter 两种自定义方法,之前也提到过,需要注意的是 扩展目录名称必须是templatetagstemplatetags中的自定义标签和过滤器必须依赖于一个django app,也就是说,自定义标签和过滤器是绑…

dsp怪胎_2012年6月最佳怪胎文章

dsp怪胎This past month we covered topics such as why you only have to wipe a disk once to erase it, what RSS is and how you can benefit from using it, how websites are tracking you online, and more. Join us as we look back at the best articles for June. 在…

如何在Ubuntu上查看和写入系统日志文件

Linux logs a large amount of events to the disk, where they’re mostly stored in the /var/log directory in plain text. Most log entries go through the system logging daemon, syslogd, and are written to the system log. Linux将大量事件记录到磁盘上&#xff0c…

向Ubuntu提供反馈的5种方法

Ubuntu, like many other Linux distributions, is a community-developed operating system. In addition to getting involved and submitting patches, there are a variety of ways you can provide useful feedback and suggest features to Ubuntu. 与许多其他Linux发行版…

Tomcat 发布项目 conf/Catalina/localhost 配置 及数据源配置

本文介绍通过在tomcat的conf/Catalina/localhost目录下添加配置文件,来发布项目。因为这样对 tomcat 的入侵性最小,只需要新增一个配置文件,不需要修改原有配置;而且支持动态解析,修改完代码直接生效(修改配置除外)。在…

Centos7 中文乱码

1. 安装中文库 yum groupinstall "fonts" 2. 检查是否有中文语言包 locale -a 3. 查看当前系统语言环境 locale 解析如下 LANG:当前系统的语言LC_CTYPE:语言符号及其分类LC_NUMERIC:数字LC_COLLATE:比较和排序习惯LC_TIME&#xff…

chrome自动退出的原因_Chrome 70将让用户选择退出新的自动登录功能

chrome自动退出的原因An upcoming Chrome option allows users to log into Google accounts without logging into the browser. The change was prompted by a backlash among users and privacy advocates. 即将推出的Chrome选项允许用户无需登录浏览器即可登录Google帐户。…

学习笔记DL007:Moore-Penrose伪逆,迹运算,行列式,主成分分析PCA

2019独角兽企业重金招聘Python工程师标准>>> Moore-Penrose伪逆(pseudoinverse)。 非方矩阵,逆矩阵没有定义。矩阵A的左逆B求解线性方程Axy。两边左乘左逆B,xBy。可能无法设计唯一映射将A映射到B。矩阵A行数大于列数,方程无解。矩…