缓存

缓存算法(页面置换算法)-FIFO、LFU、LRU

天大地大妈咪最大 提交于 2020-03-10 16:38:39
转自:http://www.cnblogs.com/dolphin0520/ 1.FIFO算法   FIFO(First in First out),先进先出。其实在操作系统的设计理念中很多地方都利用到了先进先出的思想,比如作业调度(先来先服务),为什么这个原则在很多地方都会用到呢?因为这个原则简单、且符合人们的惯性思维,具备公平性,并且实现起来简单,直接使用数据结构中的队列即可实现。   在FIFO Cache设计中,核心原则就是: 如果一个数据最先进入缓存中,则应该最早淘汰掉 。也就是说,当缓存满的时候,应当把最先进入缓存的数据给淘汰掉。在FIFO Cache中应该支持以下操作;    get(key):如果Cache中存在该key,则返回对应的value值,否则,返回-1;   set(key,value):如果Cache中存在该key,则重置value值;如果不存在该key,则将该key插入到到Cache中,若Cache已满,则淘汰最早进入Cache的数据。    举个例子:假如Cache大小为3,访问数据序列为set(1,1),set(2,2),set(3,3),set(4,4),get(2),set(5,5)   则Cache中的数据变化为:   (1,1) set(1,1)   (1,1) (2,2) set(2,2)   (1,1) (2,2) (3,3) set

web离线缓存

只愿长相守 提交于 2020-03-10 07:04:30
web应用程序本地缓存:通过每个页面的manifest文件来管理; manifest :文件是一个简单的文件夹,在该文件中,列举出需要被缓存或不需要缓存的文件资源的文件名称,文件的资源路径;可以为每个页面单独指定一个manifest文件,也可以为web应用程序指定总的manifest文件; cache :指定需要缓存在本地的资源文件; network :指定不进行本地缓存的文件 只有当客户端与服务器建立连接时才能访问; f allback :指定两个资源文件,第一个在线访问时使用的资源文件,第二个不在线访问的资源文件; 浏览器和服务器交互过程 首次访问http://luling(index.html 主页 ,manifest文件为index.manifest文件请求缓存index.html,hello.js,hello1.jpg) 1.浏览器请求http://luling; 2.服务器返回给浏览器index.html; 3.浏览器解析index.html网页,请求网页上的所有资源(html,css,js,图片,以及manifest文件); 4.服务器返回浏览器所有资源; 5.浏览器处理manifest文件,请求需要被缓存的资源; 6.服务器返回浏览器需要请求的缓存资源; 7.浏览器对缓存资源进行更新;存入缓存 触发事件通知本地缓存被更新; 再次访问http://luling

memcache缓存服务器

可紊 提交于 2020-03-10 01:54:00
memcache缓存服务器 MemCache 是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统, 用于动态Web 应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。 实验: 1、安装 libevent 软件(四台) [root@localhost ~]# tar -zxvf libevent-2.0.21-stable.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/libevent-2.0.21-stabl [root@localhost libevent-2.0.21-stable]# ./configure --prefix=/usr/ [root@localhost libevent-2.0.21-stable]# make && make install 2、安装 memcached 软件(Memcached 服务器 2 台) [root@localhost ~]# tar -zxvf memcached-1.4.31.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/memcached-1.4.31/ [root@localhost memcached-1.4.31]# ./configure -

nginx 静态资源代理服务

孤者浪人 提交于 2020-03-09 22:51:46
nginx 静态资源代理服务 说明 由于企信多数应用实现了前后端分离,即界面层与业务逻辑层分离。 业务逻辑层应用程序需使用tomcat、jar等方式运行,静态页面则使用nginx代理访问。 且nginx可配置缓存访问量大的静态资源(如用户头像),提高系统响应速度。 安装 请根据以下链接部署 - 代理软件nginx部署 代理静态资源 - 配置代理静态资源 # 将静态资源放于/data/eim/www目录下 ll /data/eim/www/plist/eim.plist # nginx配置代理/data/eim/www目录下的静态资源 vim /etc/nginx/conf.d/default.conf # 配置运行端口 listen 80; # 静态页面路径,将文件放于该目录下,即可被浏览器访问 location / { root /data/eim/www; # 错误页面路径 location = /50x.html { root /data/eim/www; :wq! - haproxy代理 acl nginx-server path_beg -i /plist use_backend nginx-server if nginx-server backend nginx-server mode http option forwardfor server wget 10.10

理解IP及DNS中的TTL

我只是一个虾纸丫 提交于 2020-03-09 20:54:47
1. TTL 1.1 IP协议中的TTL 定义 TTL是IP协议包中的一个值,指定数据报被路由器丢弃之前允许通过的网段数量。(IP数据包在计算机网络中可以转发的最大跳数) 在很多情况下数据包在一定时间内不能被传递到目的地。解决方法就是在一段时间后丢弃这个包,然后给发送者一个报文,由发送者决定是否要重发。 TTL 是由 发送主机 设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,每经过一个路由器,路由器会修改TTL值, 即将改值减小1。当记数到0时,路由器决定丢弃该包,并发送一个 ICMP Type 11 and Code 0 message(Time to live exceeded) 报文给最初的发送者,由发送者决定是否要重发。 1.1.1 常见操作系统的TTL值 UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255 Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64 微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128 微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32 LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64 1.1.2 linux系统TTL值修改 TTL值在文件

网站加速常用办法

家住魔仙堡 提交于 2020-03-09 17:45:49
大型web项目解决方案 之 网站加速 网站加速方案 1、squid代理缓存技术 反向缓存,动静分离。 基本原理:客户请通过代理服务器请求总服务器,代理服务器把把总服务器的静态数据放入squid的缓存池,以供下次访问,以减小总服务器的压力 2、文件缓存:页面静态化缓存 a、web服务器的伪静态:这个是做到了搜索引擎优化,并未对网站的运行速度作出贡献。 b、自己写代码实现动态网页静态化或者利用模版引擎和框架 3、内存缓存:memcache 把数据存入内存中,在内存中构建一个大型的哈希表。断电等会造成数据丢失。 4、sphinx全文索引搜索 将mysql的关键数据(id,中文)放入sphinx,php通过在sphinx中搜索中文对应的id,再通过这个id去mysql查询出数据,而不是直接用Like语句去mysql插数据。 sphinx的数据需要人工维护,以保持和数据库最新的数据一致 来源: oschina 链接: https://my.oschina.net/u/876930/blog/615111

缓存相关——缓存穿透、缓存并发、缓存失效、缓存预热、缓存雪崩、缓存算法

情到浓时终转凉″ 提交于 2020-03-09 16:38:50
一、缓存穿透 我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了。 那这种问题有什么好办法解决呢? 要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。 有一个比较巧妙的作法是,可以将这个不存在的key预先设定一个值。 比如,”key” , “&&”。 在返回这个&&值的时候,我们的应用就可以认为这是不存在的key,那我们的应用就可以决定是否继续等待继续访问,还是放弃掉这次操作。如果继续等待访问,过一个时间轮询点后,再次请求这个key,如果取到的值不再是&&,则可以认为这时候key有值了,从而避免了透传到数据库,从而把大量的类似请求挡在了缓存之中。 二、缓存并发 有时候如果网站并发访问高,一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况,如果并发确实很大,这也可能造成DB压力过大,还有缓存频繁更新的问题。 我现在的想法是对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询。 这种情况和刚才说的预先设定值问题有些类似,只不过利用锁的方式,会造成部分请求等待。 三、缓存失效

浓缩精华的架构演进过程,经验总结,值得收藏!

◇◆丶佛笑我妖孽 提交于 2020-03-09 12:27:53
架构设计的演进过程 业务驱动技术的发展是亘古不变的道理。最开始的时候,业务量少,业务复杂度低,采取的技术也相对简单,基本满足用户对功能的需求。随着IT信息化的普及,更多的交易放到了网络上,信息量增加和访问次数频繁就是要解决的问题了。因此,逐渐加入了缓存、集群等技术手段。同时对业务的扩展性和伸缩性的要求也越来越高。高并发、高可用、可伸缩、可扩展、够安全的软件架构一直是架构设计追求的目标。今天我们来看一下架构设计经历了哪些阶段,每个阶段都解决了哪些问题,又引出了哪些新问题。主要是引起大家的思考,在不同的业务发展阶段采取合适技术手段,用变化拥抱变化是IT人追求的目标。 应用与数据一体模式 最早的业务应用以网站、OA等为主,访问的人数有限,单台服务器就能够应付。通常,将应用程序和数据库部署到一台服务器上面,如图1-1所示。在这一阶段,我们利用LAMP(Linux Apache MySQL PHP)技术就可以迅速搞定,并且这些工具都是开源的。很长一段时间内,有各种针对这种应用模式的开源代码可以使用。这种模式基本上没有高并发的要求,可用性也很差。有的服务器采用托管模式,上面就安装了不同的业务应用,一旦服务器出现问题,所有的应用就罢工了。不过其开发和部署成本相对较低,适合刚刚起步的应用服务。图1 就描述了单个应用和数据库运行在单台服务器的模式,我们称这种模式为应用与数据一体模式。 图 1

MySQL的内存都用了哪里

半腔热情 提交于 2020-03-09 09:49:12
InnoDB buffer pool :主要用于缓存InnoDB的表、索引数据。通常缓冲池(buffer pool)的大小设置为服务器系统内存大小的50%~75%。如果系统有大量的内存,可以通过将其分配给多个缓冲池实例(buffer pool instances),来提高并发性。缓冲池不宜设置过小或过大,过小会照成缓冲池里面的页不断进行刷新,过大会因为内存争用导致发生交换(swap)。 MyISAM key buffer :用于缓冲MyISAM表的索引,被所有的线程共享。 内存表 :如果是一个内部使用的临时内存表,当表增大时,会将其转换成磁盘表。如果是由MEMORY引擎创建的表,则不会转换成磁盘表。 MySQL Performance Schema :用于监控mysql的执行性能,随着服务器的实际负载变化,动态分配使用内存。一旦内存被分配,只有在下次服务器重启时才会释放。 客户端连接线程 :每个线程会使用到连接缓冲、结果缓冲和线程堆栈。连接缓冲和结果缓冲会进行动态增长。每个连接线程也会使用内存用于计算语句摘要。 全部线程 :所有的线程共享相同的基础内存。当一个线程不再使用,如果线程没有回到线程缓存里,它分配的内存将会释放。 读取缓冲 :对表进行顺序扫描时,会为其分配一个读取缓冲。 随机读取缓冲 :对数据进行任意顺序读取时,会为其分配一个随机读取缓冲,以防止发生磁盘检索。 连接操作

JMM(java内存模型)

妖精的绣舞 提交于 2020-03-09 09:32:46
硬件层数据一致性 协议很多 intel 用MESI https://www.cnblogs.com/z00377750/p/9180644.html 现代CPU的数据一致性实现 = 缓存锁(MESI ...) + 总线锁 读取缓存以cache line为基本单位,目前64bytes/字节 位于同一缓存行的两个不同数据,被两个不同CPU锁定,产生互相影响的伪共享问题 使用缓存行的对齐能够提高效率 来源: CSDN 作者: Forest24 链接: https://blog.csdn.net/Forest24/article/details/104742490