缓存

同步 异步 阻塞 非阻塞

我的未来我决定 提交于 2020-03-28 03:52:56
同步:函数没有执行完不返回,线程被挂起;   阻塞:没有收完数据函数不返回,线程也被挂起;   异步:函数立即返回,通过事件或是信号通知调用者;   非阻塞:函数立即返回,通过select通知调用者 这样看来异步和非阻塞有什么区别呢? 异步=非阻塞? 同步是在操作系统层面上,阻塞是在套接字上? Reactor是同步 Proactor是异步? 回答: 同步、异步、阻塞和非阻塞的概念   在进行网络编程时,我们常常见到同步、异步、阻塞和非阻塞四种调用方式。这些方式彼此概念并不好理解。下面是我对这些术语的理解。 同步   所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如sin,isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的LRESULT值返回给调用者。 异步   异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。以CAsycSocket类为例(注意,CSocket从CAsyncSocket派生

五分钟学后端技术:如何学习Redis、memcache等常用缓存技术

[亡魂溺海] 提交于 2020-03-27 19:08:54
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 本文思维导图 什么是缓存 计算机中的缓存 做后端开发的同学,想必对缓存都不会陌生了,平时我们可能会使用Redis,MemCache这类缓存组件,或者是本地缓存,来实现一些后端的应用。 那么,严格来说,到底什么才是缓存呢,先来看看百度百科的定义。 缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。 最早,“缓存”一词是用来指代计算机硬件中的高速缓存,因为CPU和内存的运算速度差距过大,如果CPU直接和内存交互的话,会浪费掉CPU的大量运算时间,于是有了高速缓存,来为这两个速度差距甚远的组件做中介。 具体的工作原理是,CPU要取数据的时候,先找高速缓存要,由于它们俩的速度差距并不大,所以CPU不会损失掉太多性能,如果数据就在缓存中,那么就直接在缓存里取,否则则到内存去取,取完之后还要留在高速缓存中,以便于下次CPU要使用时无需再到内存中去取。 其实,高速缓存还可以分为一级缓存,二级缓存和三级缓存等,每往下一级,速度也就越慢,价格也越低,毕竟,成本是我们不得不考虑的因素,要不然一切硬件都上顶配,就不需要讨论软件的优化了。 除了高速缓存外,其实还有硬盘缓存

五分钟学后端技术:如何学习Redis、memcache等常用缓存技术

喜欢而已 提交于 2020-03-27 19:00:34
3 月,跳不动了?>>> 原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 本文思维导图 什么是缓存 计算机中的缓存 做后端开发的同学,想必对缓存都不会陌生了,平时我们可能会使用Redis,MemCache这类缓存组件,或者是本地缓存,来实现一些后端的应用。 那么,严格来说,到底什么才是缓存呢,先来看看百度百科的定义。 缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。 最早,“缓存”一词是用来指代计算机硬件中的高速缓存,因为CPU和内存的运算速度差距过大,如果CPU直接和内存交互的话,会浪费掉CPU的大量运算时间,于是有了高速缓存,来为这两个速度差距甚远的组件做中介。 具体的工作原理是,CPU要取数据的时候,先找高速缓存要,由于它们俩的速度差距并不大,所以CPU不会损失掉太多性能,如果数据就在缓存中,那么就直接在缓存里取,否则则到内存去取,取完之后还要留在高速缓存中,以便于下次CPU要使用时无需再到内存中去取。 其实,高速缓存还可以分为一级缓存,二级缓存和三级缓存等,每往下一级,速度也就越慢,价格也越低,毕竟,成本是我们不得不考虑的因素,要不然一切硬件都上顶配,就不需要讨论软件的优化了。

Java面试之Redis

跟風遠走 提交于 2020-03-27 15:30:15
179. Redis 是什么?都有哪些使用场景? Redis 是一个使用 C 语言开发的高速缓存数据库。 Redis 使用场景: 记录帖子点赞数、点击数、评论数; 缓存近期热帖; 缓存文章详情信息; 记录用户会话信息。 数据缓存功能 分布式锁的功能 支持数据持久化 支持事务 支持消息队列 存储方式不同:memcache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小;Redis 有部份存在硬盘上,这样能保证数据的持久性。 数据支持类型:memcache 对数据类型支持相对简单;Redis 有复杂的数据类型。 使用底层模型不同:它们之间底层实现方式,以及与客户端之间通信的应用协议不一样,Redis 自己构建了 vm 机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。 value 值大小不同:Redis 最大可以达到 512mb;memcache 只有 1mb。 180. Redis 有哪些功能? 181. Redis 和 memcache 有什么区别? 182. Redis 为什么是单线程的? 因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺理成章地采用单线程的方案了。 关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。

微软企业库4.1学习笔记(十三)缓存模块

天涯浪子 提交于 2020-03-27 10:22:23
  企业库的缓存模块允许开发者在应用中包含本地缓存。它支持内存缓存,内存中缓存的数据,可以用数据库或者其他分离的存储作为后端数据存储。缓存模块可以不经修改而直接使用,它提供了获取数据、添加数据到缓存、清空缓存中的数据所需的全部方法。同样支持可配置的缓存过期和清除策略。   在构建企业级分布式应用的时候,架构师和开发者将会面对许多挑战。缓存可以帮助他们克服下面的一些挑战:   性能,缓存通过存储和数据消费者最相关的数据,可以提升应用的性能。避免了重复的数据创建,处理和传输。   可扩展性,在缓存中存储资源帮助节省资源,在有增加应用的需要情况下,提高可扩展性。   可获得性,在本地存储数据,应用在网络发生潜在问题、webservice发生问题、硬件发生问题的情况下,应用还是可以生存下来,可以继续使用。   在缓存模块将会讲述下面的主题   缓存模块简介   使用缓存模块进行开发   关键的解决方案   缓存模块的设计   通过修改来扩展缓存模块的功能   部署和实施   缓存模块的QuickStart   一、缓存模块简介   将通过下面的一些话题,帮助你决定缓存模块是否适合你的应用需求。   通用的解决方案   示例代码   缓存模块的突出点   什么时候使用缓存模块   缓存模块的取舍   安全   除了上面的话题,还将介绍下面的一些内容   使用缓存模块进行开发

微软企业库4.1学习笔记(十七)缓存模块5 缓存的典型用法

北城余情 提交于 2020-03-27 08:10:20
本节介绍开发者在使用缓存的时候,常用的方法。每个方法在实际开发中都可以找到对应的用处,会有代码示例。分两个部分介绍,第一个部分包括下面的一些用法:   向缓存添加数据,Add方法,如何向缓存中添加数据,设置过期,设置优先级。   从缓存中删除数据,Remove方法   从缓存中获取数据,GetData方法   清空缓存,Flush方法   第二部分介绍缓存的加载。   1.1向缓存中添加数据   需要缓存的数据,在创建和传输的时候都是很消耗性能的。例如,一个零售商的应用系统,一些列产品数据需要从数据访问组件传递给用户显示组件,然后才可以显示在用户界面。代表显示世界的实体类Products和Orders,为了提升性能,一些数据会被放在缓存中。   你需要向缓存中添加数据,同时为过期处理提供过期时间,为清除处理设置缓存的优先级,先清除优先级低的缓存项。   使用CacheManager的Add方法,如果你没有设置过期时间和优先级,会自动设置默认值,分别是NeverExpired永不过期和Normal正常。如果缓存中已经存在相同key的项,会先移除旧项,然后添加新项。在这个过程中如果失败的话,缓存值会恢复到原始值。 using System; using System.Collections.Generic; using System.Linq; using System.Text;

微软企业库4.1学习笔记(十八)缓存模块6 缓存的设计目的

馋奶兔 提交于 2020-03-27 06:42:54
设计缓存的目的   缓存模块可以用来实现下列功能:   提供了一系列的API   它使得开发者不需要学习很多内部的工作机制,就可以将常用的缓存功能加入应用   使用企业库的配置工具很容易配置   性能高效   线程安全,内部的代码考虑到了在多个线程调用,没有非预期的内部交互。   使用后端存储,使得发生以外也可以保持数据的完整无缺。   保证了内存中的数据和后端存储保持数据同步。   本节讲述一些缓存模块设计的亮点,和设计的细节。还包括一些过期处理的设计和扫描处理的设计。   1、设计亮点     上图显示的是缓存模块中关键类之间的关系。   当你用CacheFactory初始化一个CacheManager对象的时候,在内部创建了一个CacheManagerFactory对象,创建了一个Cache对象。常见Cache对象之后,在后端存储的所有数据被加载到内存中,放在Cache对象中。然后应用可以用CacheManager发出请求,获取数据添加数据,删除数据。   当应用向CacheManager发送请求,使用GetData方法从缓存中获取数据的时候,CacheManager对象会请求Cache对象。如果请求项存在的话,返回缓存的数据,如果不存在返回null,如果对象过期,也返回null。   当应用使用CacheManager的add方法,向缓存中添加项的时候

微软企业库4.1学习笔记(十八)缓存模块6 缓存的设计目的

牧云@^-^@ 提交于 2020-03-27 06:08:46
设计缓存的目的   缓存模块可以用来实现下列功能:   提供了一系列的API   它使得开发者不需要学习很多内部的工作机制,就可以将常用的缓存功能加入应用   使用企业库的配置工具很容易配置   性能高效   线程安全,内部的代码考虑到了在多个线程调用,没有非预期的内部交互。   使用后端存储,使得发生以外也可以保持数据的完整无缺。   保证了内存中的数据和后端存储保持数据同步。   本节讲述一些缓存模块设计的亮点,和设计的细节。还包括一些过期处理的设计和扫描处理的设计。   1、设计亮点     上图显示的是缓存模块中关键类之间的关系。   当你用CacheFactory初始化一个CacheManager对象的时候,在内部创建了一个CacheManagerFactory对象,创建了一个Cache对象。常见Cache对象之后,在后端存储的所有数据被加载到内存中,放在Cache对象中。然后应用可以用CacheManager发出请求,获取数据添加数据,删除数据。   当应用向CacheManager发送请求,使用GetData方法从缓存中获取数据的时候,CacheManager对象会请求Cache对象。如果请求项存在的话,返回缓存的数据,如果不存在返回null,如果对象过期,也返回null。   当应用使用CacheManager的add方法,向缓存中添加项的时候

走进缓存的世界(一) - 开篇

孤街醉人 提交于 2020-03-26 11:55:29
系列文章 走进缓存的世界(一) - 开篇 走进缓存的世界(二) - 缓存设计 走进缓存的世界(三) - Memcache 概述 对于程序员来说多多少少都懂一点算法,算法是什么?算法是“时间”与“空间”的互换策略。 我们常常研究一个算法的时间复杂度和空间复杂度,如果我们有绝对足够的时间和空间,那么算法就不需要了,可惜这种条件是不存在的,只是在某些情况下我们会协调两者从而达到性能上的平衡。 缓存是一种“用空间换时间”的策略,通俗的讲,缓存就是把一些数据暂时存储起来,避免了某些重复的耗时操作,减少时间开销的一种方法。 商业世界中常说的一句话是“现金为王”。在技术世界里,与之相近的一个说法是“缓存为王”。 从底层到上层主要涉及:数据库模型设计,SQL优化,使用缓存等。从图中的优化模式来看,其中数据库模型设计的合理程度奠定了应用系统优化的基石,如果模型设计得不合理,随着业务发展,后续的优化将会变得很困难。另一方SQL优化也是数据库优化的一个重要方面,慢SQL和top SQL往往是系统性能杀手,它们是导致系统故障的重要潜在危险。 缓存在构建高性能服务器中有着举足轻重的作用,很多时候sql优化, 算法优化所带来的效果可能远远不如缓存带来的优化效果。但是缓存的使用并不是零成本的,任何缓存的增加,都会带来两大问题: 数据不一致 系统复杂度大幅度增加 如何解决呢?首先考虑去掉缓存。不要为了缓存而缓存

Redis在Java web中的应用

删除回忆录丶 提交于 2020-03-26 10:56:05
一般而言Redis在Javaweb应用中存在两个主要的场景,一个是缓存常用的数据,另一个是在需要高速读/写的场合使用它快速读/写,比如一些需要进行商品抢购和抢红包的场合. 一,缓存 在对数据库的读/写操作中,现实的情况是读操作的次数远超写操作, 一般是1 : 9 到3 : 7 的比例,所以需要读的可能性是比写的可能性多得多。当发送S QL 去数据库进行读取时,数据库就会去磁盘把对应的数据索引回来, 而索引磁盘是一个相对缓慢的过程。如果把数据直接放在运行在内存中的Redis 服务器上,那么不需要去读/写磁盘了,而是直接读取内存,显然速度会快得多,并且会极大减轻数据库的压力。 而使用内存进行存储数据开销也是比较大的,因为磁盘可以是TGB 级别,而且十分廉价,内存一般是几百个GB 就相当了不起了,所以内存虽然高效但空间有限,价格也比磁盘高许多,因此使用内存代价较高,并不是想存什么就存什么,因此我们应该考虑有条件的存储数据。一般而言,存储一些常用的数据,比如用户登录的信息: 一些主要的业务信息,比如银行会存储一些客户基础信息、银行卡信息、最近交易信息等。一般而言在使用 Red is 存储的时候,需要从3 个方面进行考虑。 ·业务数据常用吗?命中率如何?如果命中率很低,就没有必要写入缓存。 · 该业务数据是读操作多,还是写操作多,如果写操作多,频繁需要写入数据库,也没有必要使用缓存。