Redis作为一个基于内存的缓存系统,一直以高性能著称,
在单线程处理情况下,读速度可达到11万次/s,写速度达到81万次/s。
官方曾做过类似问题的回复:使用Redis时,几乎不存在CPU成为瓶颈的情况, Redis主要受限于内存和网络。
但是,单线程的设计也给Redis带来一些问题:
针对上面问题,Redis在40版本以及60版本分别引入了Lazy Free以及多线程IO,逐步向多线程过渡。
Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:
Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接。
文件事件就是服务器对套接字 *** 作的抽象 。
服务器与客户端的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信 *** 作。
(eg: 连接accept,read,write,close等)
Redis服务器中的一些 *** 作(eg: serverCron函数)需要在给定的时间点执行。
时间事件就是服务器对这类定时 *** 作的抽象
(eg: 过期键清理,服务状态统计等)
Redis将文件事件和时间事件进行抽象,时间轮询器会监听I/O事件表:
一旦有文件事件就绪,Redis就会优先处理文件事件,
接着处理时间事件。
在上述所有事件处理上,Redis都是以单线程形式处理,所以说Redis是单线程的。
处理过程见下图
Redis基于Reactor模式开发了自己的I/O事件处理器,也就是文件事件处理器。
Redis在I/O事件处理上,采用了I/O多路复用技术,同时监听多个套接字,
并为套接字关联不同的事件处理函数,通过一个线程实现了多客户端并发处理。
处理过程见下图
上述的设计,在数据处理上避免了加锁 *** 作,既使得实现上足够简洁,也保证了其高性能。
当然, Redis单线程只是指其在事件处理上 ,实际上,Redis也并不是单线程的,比如生成RDB文件,就会fork一个子进程来实现。
背景:
客户端向Redis发送一条耗时较长的命令,比如删除一个含有上百万对象的Set键,或者执行flushdb,flushall *** 作,
Redis服务器需要回收大量的内存空间,导致服务器卡住好几秒,对负载较高的缓存系统而言将会是个灾难。
为了解决这个问题,在Redis 40版本引入了Lazy Free, 将慢 *** 作异步化 ,这也是在事件处理上向多线程迈进了一步。
将大键的删除 *** 作异步化,采用非阻塞删除(对应命令UNLINK)。
大键的空间回收交由单独线程实现,主线程只做关系解除,可以快速返回,继续处理其他事件,避免服务器长时间阻塞。
意义:
Redis在40版本引入了Lazy Free,自此Redis有了一个 Lazy Free线程专门用于大键的回收 。
同时,也去掉了聚合类型的共享对象,这为多线程带来可能。
这为Redis在60版本实现了多线程I/O打下了基础。
Redis 60的多线程并未将事件处理改成多线程,而是在I/O上。
因为,如果把事件处理改成多线程,不但会导致锁竞争,而且会有频繁的上下文切换,
即使用分段锁来减少竞争,对Redis内核也会有较大改动,性能也不一定有明显提升。
流程简述如下:
见下图
Redis60的多线程默认是禁用的,只使用主线程。
如需开启需要修改redisconf配置文件:
开启多线程后,还需要设置线程数,否则是不生效的。
同样修改redisconf配置文件:
很多用户在做视频网站业务时往往不知道服务器应该配置,尤其是在网络选择和硬件配置方面,很多租用香港服务器的用户。
举个例子:如果租用香港服务器搭建网络视频网站,例如在线人数100人,同时观看视频的10人,没人看10分钟左右的480p徘徊,如果依照以上的条件需要一台什么样的服务器,下面小编来分析一下
硬件配置的选择
视频服务器的特点就是高并发,所以在CPU的选择上需要多线程的多核CPU,例如E5-2620,而在内存的选择上可以选择16G以上,系统上根据视频系统的平台可以选择windows和linux,当然考虑到稳定性centos+nginx,如果想要支持手机端,建议采用>
选择此外在硬盘的选择上由于现在视频的容量越来越大尤其是一些相对高清的视频建议选择1TB以上的硬盘,如果条件允许可以采用raid架构
线路的选择
如果是租用香港服务器,那么建议选择100M的CN2直连线路,尤其是主要观众如果主要分布在大陆地区的话,建议选择CN2GIA线路的服务器,延迟低在观看体验上与大陆地区的网站没有差别
服务商的选择
运营视频网站选择一个可靠的机房服务商是非常重要的,由于视频网站需要24小时不间断运维,所以在选择服务商的时候建议选择能够提供24小时不间断在线运维的服务商,这样才能够确保在出现故障的时候可以第一时间联系24小时在线客服,更快排除故障,让业务中断时间缩减到最小。
多线程技术可以提高cpu利用率,尤其是多核cpu的机器,提高并发执行效率。这是建立在cpu执行有空余的情况下的,多线程也并非没有代价,首先线程作为 *** 作系统的最小调度单位也是要占用内存空间的,其次线程调度及上下文切换也会消耗性能。一般线程数为cpu个数2+1较好,线程太多会占用内存,频繁的线程上下文切换也会导致效率降低。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)