打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
程序员进公司,这项技术你必须掌握

    程序员交流中,经常用到词语,一般是  jdk,环境,编译,数据库,sql,缓存。具体什么是缓存尼,今天就让我们来彻底认识一下这个东西的存在性。

百度百科是这样介绍的: “缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。可以进行高速的数据交换的存储器,在cpu和内存直接存在,交换数据非常快

    百度所介绍的,缓存就是  我们电脑主机在输设备上输入指令后,cpu接受指令开始向缓存这个机制申请访问目标数据,但是缓存中不存在,又往下一级和内存进行交互,取回目标数据然后输出,我们并看到了计算机给我们呈现的结果。

缓存看来在计算机中作用十分巨大,有了缓存计算机的运行速度加快,处理速度迅速。

但是对于程序员来说,缓存的使用和设计显得尤为重要。

在WEB开发中用来应付高流量最有效的办法就是用缓存技术,能有效的提高服务器负载性能,用空间换取时间。

一般缓存技术都用在以下几点:

  1. 存储频繁访问的数据

  2. 临时存储耗时的计算结果

  3. 内存缓存减少磁盘IO

使用缓存的理由都不必多数, 降低系统访问时间,客户端使用起来,可以让顾客没有违和感。减低网速流量的使用,不重复使用数据而占用数据通道和网络通道。

在WEB开发中,缓存可以分为:

一、数据库端缓存

  • 数据库的缓存一般由数据库提供,可以对表建立高速缓存。数据库中,用户可能多次执行相同的查询语句,为了提高查询效率,数据库会在内存划分一个专门的区域,用来存放用户最近执行的查询,这块区域就是缓存。(参考MYSQL缓存)

  • “空间换时间”,比如建一个表来存储另外一个表某个类型的数据的总条数,在每次更新数据的时候同事更新 数据表和统计条数的表。在需要获取某个类型的数据的条数的时候,就不需要select count去查询,直接查询统计表就可以了,这样可以提高查询的速度和数据库的性能。

  • 数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得。用的最广的例子看Discuz的搜索功能,把结果ID缓存到一个表中,下次搜索相同关键字时先搜索缓存表。举个常用的方法,多表关联的时候,把附表中的内容生成数组保存到主表的一个字段中,需要的时候数组分解一下,这样的好处是只读一个表,坏处就是两个数据同步会多不少步骤,数据库永远是瓶颈,用硬盘换速度,是这个的关键点。

二、应用层缓存

应用层缓存这块跟开发人员关系最大,也是平时经常接触的。

  • 缓存数据库的查询结果,减少数据的压力。这个在大型网站是必须做的。

  • 缓存磁盘文件的数据。比如常用的数据可以放到内存,不用每次都去读取磁盘,特别是密集计算的程序,比如中文分词的词库。

  • 缓存某个耗时的计算操作,比如数据统计。

应用层缓存的架构也可以分几种:

  • 嵌入式,也就是缓存和应用在同一个机器。比如单机的文件缓存,java中用hashMap来缓存数据等等。这种缓存速度快,没有网络消耗。

  • 分布式缓存,把缓存的数据独立到不同的机器,通过网络来请求数据,比如常用的memcache就是这一类。

比较常见的应用层分布式缓存容器,Memcache、共享文件服务器、MemcacheDb、Tokyo Tyrant。php里面也有比如x-cache,apc等的基于进程的缓存,这种缓存比分布式缓存速度快,但是限于跟应用的一个机器。java实现的缓存也比较多,比如oscache,jcache ,ehcached等等。

三、前端缓存(服务端缓存)

我们这里说的前端缓存可以理解为一般使用的cdn技术,利用squid等做前端缓冲技术,主要还是针对静态文件类型,比如图片,css,js,html等静态文件。

一般针对静态资源如CSS,JS,图片等使用缓存,原因如下:

  • 请求更快:通过将内容缓存在本地浏览器或距离最近的缓存服务器(如CDN),在不影响网站交互的前提下可以大大加快网站加载速度。

  • 节省带宽:对于已缓存的文件,可以减少请求带宽甚至无需请求网络。

  • 降低服务器压力:在大量用户并发请求的情况下,服务器的性能受到限制,此时将一些静态资源放置在网络的多个节点,可以起到均衡负载的作用,降低服务器的压力。

前端比较常用的就是squid,Varnish Cache,ncache等等。Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang (vg.no) 使用3台Varnish代替了原来的12台squid,性能比以前更好。

四、客户端缓存(浏览器缓存)

客户端缓存依赖于浏览器的实现,目前一般的浏览器都实现了基于http都信息来缓存相应的文件。浏览器端的缓存,可以让用户请求一次之后,下一次不在从服务器端请求数据,直接从本地缓存读取,可以减轻服务器负担也可以加快用户的访问速度。

浏览器缓存分为强缓存和协商缓存:

  • 强缓存:浏览器在加载资源时,先根据这个资源的一些http header判断它是否命中强缓存,强缓存如果命中,浏览器直接从自己的缓存中读取资源,不会发请求到服务器。比如某个css文件,如果浏览器在加载它所在的网页时,这个css文件的缓存配置命中了强缓存,浏览器就直接从缓存中加载这个css,连请求都不会发送到网页所在服务器;

  • 协商缓存:当强缓存没有命中的时候,浏览器一定会发送一个请求到服务器,通过服务器端依据资源的另外一些http header验证这个资源是否命中协商缓存,如果协商缓存命中,服务器会将这个请求返回(304),但是不会返回这个资源的数据,而是告诉客户端可以直接从缓存中加载这个资源,于是浏览器就又会从自己的缓存中去加载这个资源;若未命中请求,则将资源返回客户端,并更新本地缓存数据(200)。

接下来我们进入实战的列子:

最近个人一直在摸索的python 的快速web开发框架,flask,我们就来看看这框架是如何处理缓存问题的。

首先安装依赖:

pip install Flask-Caching==1.7.2 #缓存主要用在,数据库的多次使用,数据库不用做出任何的修改。#创建falsk处理缓存的文件 cache.py # 缓存对象 from flask_caching import Cache cache = Cache()

#配置文件 # 缓存 # 本地缓存,一级缓存,缓存量大的情况下需使用二级缓存,一般使用redis app.config['CACHE_TYPE'] = 'simple' app.config['CACHE_DEFAULT_TIMEOUT'] = 5 * 60  # 默认过期时间 5分钟 cache.init_app(app)

系统整体使用缓存类。from extensions import cache #使用装饰器,作用于整个方法 @cache.cached(key_prefix='find_province_address')   def func():    pass

#局部使用缓存 result = cache.get(key)  # 取出缓存 if result is None:  # 缓存没有该数据    # 查询数据    cache.set(key, value) # 把数据放入缓存

    缓存对于程序开发很重要,就如淘宝和京东这种高并发的系统,是如何支撑着?缓存的技术满足了国内几亿人的购物需求。

        快来分享一下,大家都在使用什么样的缓存设置尼,本人使用python(走死了!!!)哟。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Client Side Cache 和 Server Side Cache 的区别
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
网站前端性能优化终极指南
你必须懂的前端性能优化
页面性能优化办法有哪些?| 技术头条
高并发解决方案
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服