菜菜哥,告诉你一个好消息web
YY妹子,什么好消息,你有男票了?redis
不是啦,我作的一个网站,之前常常因为访问量太大而崩溃,如今我加上了缓存,很稳定啦算法
加的什么缓存呢?数据库
我用的redis,号称业界最快的缓存组件了缓存
你以为如今的缓存操做应该是最快的了吗?服务器
是的,我以为没有缓存能比这种模式更快了网络
你先停停,我给你先讲个故事并发
进程内缓存是指缓存和应用程序在相同地址空间。即同一个进程内。分布式缓存是指缓存和应用程序位于不一样进程的缓存,一般部署在不一样服务器上。框架
从前有个机构,机构的主人叫作 CPU,这个机构专门派仆人取一些东西而后作相应的处理。下面是这个机构平常的场景。less
cpu
赶忙去个人仓库L1缓存取点东西
仆人
主人你要的东西,那里离咱们最近,因此很快,可是空间比较小。
cpu
你丫还挺快,只用了大约一秒
cpu
赶忙去仓库 L2缓存取点东西
仆人
主人你要的东西,那里离咱们也很近,比L1缓存远一点,可是也很快,空间比较小,可是比L1缓存的空间大。
cpu
速度还能够,大约20秒就回来了
cpu
街上有一个地方叫内存,赶忙去取点东西
仆人
主人你要的东西,内存这个地方空间很大呀,就是稍微远了点
cpu
竟然用了5分钟,等你这段时间我都刷了好几个段子了
cpu
有一个叫作磁盘的小镇,赶忙去取点东西
仆人
主人你要的东西,磁盘这个地方空间太大呀,取点东西很慢呀
cpu
竟然用了5天,等你这段时间我都能报团来一个周边游了
cpu
有一个叫作互联网的国度,赶忙去取点东西
仆人
主人你要的东西,互联网太远了,取点东西太费劲了
cpu
竟然用了15天,等你去互联网取东西,简直就是在浪费个人生命
当我作完一个委托人的任务,切换到另一个委托人的任务时候,我须要把上一个委托人的一些信息先记录下来,而后还须要把新委托人的信息读取一遍,这个过程我是很耗时的,大约须要一个小时呢
经过以上不正经的小故事,咱们能够了解到cpu取各个设备数据的大致差距。至于YY妹子的问题,你们也应该了解了。
1. 首先把数据从磁盘加载到内存作缓存,这个是对的。毕竟磁盘的IO速度比内存要慢的多。就拿咱们如今使用的大多数PC机以及服务器来讲,磁盘每每是性能的瓶颈。
2. 若是有条件或者框架支持能够实现进程内缓存,我仍是推荐使用进程内缓存,毕竟相似Redis这样的kv存储和应用程序多数状况不在一台服务器上,虽然局域网的速度肉眼看起来很是快,可是对于cpu来说,仍是让cpu休了一个大假。
至于什么状况下适合应用进程内缓存,我以为有几点须要注意:
1. 相同的请求或者设置的相同缓存key的请求每次都是同一个服务器上的同一个程序去处理,这样这个请求的缓存正常状况下只会产生一份。 若是每次请求都会路由到不一样的服务器,便会产生多个缓存的副本,维护这些缓存数据的一致性是须要代价的。
2. 当有新的服务器节点加入或者服务器节点退出的时候,不能发生雪崩现象,全部缓存请求都穿透到达数据库,那是比较要命的。好比能够看一下菜菜之前的文章:分布式缓存的一条明路(附代码)
3. 若是缓存的处理服务器发生变化,好比:因为某种缘由,开始请求是由服务器A来处理,后来A服务器down了,如今由服务器B来处理,在缓存转移的过程当中,必须能保证数据的正确性和一致性。
4. 程序的进程内缓存必须有过时策略,在有限内存大小的状况下,合理的使用。推荐使用LRU淘汰算法来保证内存不会撑爆。
5. 系统的并发量及其大,对性能的要求及其高,能够考虑使用进程内缓存。
6. 若是是小部分只读数据,而且访问量比较大,例如常用的字典数据等,能够考虑使用进程内缓存。
相对于分布式缓存,好比Redis,进程内缓存有哪些优点呢?
1. 进程内缓存性能比较高,延迟会更小,更节省带宽,毕竟分布式缓存网络调用的性能和本地调用比起来慢太多,
2. 因为和应用程序位于同一进程,共享相同的虚拟内存,因此在状态维护上更容易一些,
3. 其次进程内的缓存不设计到网络传输,因此没有序列化的过程,在性能上更胜一筹。
4. 进程内缓存的数据类型几乎能够是语言级别支持的任意类型,数据类型设计上比大多数分布式缓存设备支持要灵活许多。
在应对高并发的状况下,若是有适当的环境菜菜仍是以为进程内缓存为首选,另一点程序要尽可能避免线程切换,尽可能异步化。若是能够最好能预估出缓存数据的大小,避免内存泄漏等现象发生。
固然分布式缓存有本身的优点,在监控,容灾,扩展性,易用性等方面更胜一筹。至于用进程内仍是分布式缓存,没有定论,能解决业务痛点就是最好的结果
程序若是要想最大程度的提高并发量,缩短响应时间, 就把用户须要的数据放在离用户最近的地方