缓存的原理

1、就是将常用的数据存储起来,提供便利,减少查询次数和所消耗的事件

2、利用作用的原理所产生的数据库:非关系型数据库(内存型数据库) MongoDB、Redis等

3、还有网站静态页面缓存机制,将网页静态化,存储在服务器端

缓存原理运用

1、之前我们递归的原理计算斐波那契数列,但是我们发现递归所消耗的运算量是很大的

  1. <script>
  2. var count = 0;
  3. function fib(n){
  4. count ++;
  5. if(n <= 2){
  6. return 1;
  7. }
  8. return fib(n - 1) + fib(n - 2);
  9. }
  10.  
  11. fib(5);
  12. console.log(count);//9
  13. count = 0;
  14. fib(6);
  15. console.log(count);//15
  16. count = 0;
  17. fib(20);
  18. console.log(count);//13529
  19. count = 0;
  20. fib(21);
  21. console.log(count);//21891
  22. </script>

2、我们可以创建一个缓存容器,如果放入的数字之前存在,就直接拿出来;不存在就进入下一步的运算,每次都将计算的值存入到容器中

  1. <script>
  2. //创建缓存容器
  3. function createCache(){
  4. var cache = {};
  5. return function (key, value) {
  6. //如果传了值,就说名是设置值
  7. if(value !== undefined){
  8. cache[key] = value;
  9. return cache[key];
  10. }
  11. //如果没有传值,只穿了键,那就是获取值
  12. else{
  13. return cache[key];
  14. }
  15. }
  16. }
  17. var count =0 ;
  18. function createFib(){
  19. var fibCache = createCache();
  20. function fib(n){
  21. count ++;
  22. //1.从cache中获取数据
  23. if(fibCache(n) !== undefined){
  24. //如果缓存中有 直接返回
  25. return fibCache(n) ;
  26. }
  27. //如果缓存中没有 就计算
  28. if(n <= 2){
  29. //把计算结果存入数组
  30. fibCache(n , 1) ;
  31. return 1;
  32. }
  33. var temp = fib(n - 1) + fib(n - 2);
  34. //把计算结果存入数组
  35. fibCache(n, temp) ;
  36. return temp;
  37. }
  38.  
  39. return fib;
  40. }
  41.  
  42. var fib = createFib();
  43. fib(5);
  44. console.log(count);//7
  45. count = 0;
  46. fib(6);
  47. console.log(count);//3
  48. count = 0;
  49. fib(20);
  50. console.log(count);//29
  51. count = 0;
  52. fib(21);
  53. console.log(count);//3
  54. </script>

jquery的缓存实现分析

1、jquery中扫描dom元素,扫描class,扫描id都是很费时间,每次查询元素都要全局扫描一次,必然很费时间,所以jquery也有自己的缓存机制

模拟jquery缓存

  1. <script>
  2. function createCache(){
  3. //cache对象中以键值对的形式存储我们的缓存数据
  4. var cache = {};
  5. //index数组中该存储键,这个键是有顺序,可以方便我们做超出容量的处理
  6. var index = [];
  7. return function (key, value) {
  8. //如果传了值,就说名是设置值
  9. if(value !== undefined){
  10. //将数据存入cache对象,做缓存
  11. cache[key] = value;
  12. //将键存入index数组中,以和cache中的数据进行对应
  13. index.push(key);
  14.  
  15. //判断缓存中的数据数量是不是超出了限制
  16. if(index.length >= 50){
  17. //如果超出了限制
  18. //删除掉最早存储缓存的数据
  19. //最早存入缓存的数据的键是在index数组的第一位
  20. //使用数组的shift方法可以获取并删除掉数组的第一个元素
  21. var tempKey = index.shift();
  22. //获取到最早加入缓存的这个数据的键,可以使用它将数据从缓存各种删除
  23. delete cache[tempKey];
  24. }
  25. }
  26. return cache[key];
  27. }
  28. }
  29.  
  30. var eleCache = createCache();
  31. eleCache("name","高金彪");
  32. console.log(eleCache("name"));
  33. </script>

jquery源码:很简洁,为了减少变量的声明将函数当对象进行存储值,还有就是对象的添加属性,为了不与对象原生可能拥有的属性发生冲突,使用了[ key + " " ]的方式

  1. <script>
  2. function createCache() {
  3. var keys = [];
  4. function cache( key, value ) {
  5. // 使用(key + " ") 是为了避免和原生(本地)的原型中的属性冲突
  6. if ( keys.push( key + " " ) > 3 ) {
  7. // 只保留最新存入的数据
  8. delete cache[ keys.shift() ];
  9. }
  10. // 1 给 cache 赋值
  11. // 2 把值返回
  12. return (cache[ key + " " ] = value);
  13. }
  14. return cache;
  15. }
  16.  
  17. var typeCache = createCache();
  18. typeCache("monitor");
  19. console.log(typeCache["monitor" + " "]);
  20.  
  21. typeCache("monitor","张学友");
  22. console.log(typeCache["monitor1" + " "]);
  23.  
  24. typeCache("monitor","刘德华");
  25. console.log(typeCache["monitor2" + " "]);
  26.  
  27. typeCache("monitor3","彭于晏");
  28. console.log(typeCache["monitor3 "]);
  29. </script>

JS高级——缓存原理的更多相关文章

  1. 第十七课:js数据缓存系统的原理

    这一章主要讲的是jQuery的缓存系统的历史发展,以及他自己的框架的缓存系统的实现.都是源码解析. 我就挑几个重点讲下: (1)jQuery的缓存机制的原理 jQuery的缓存机制实现的原理是在元素中 ...

  2. 深入研究Node.js的底层原理和高级使用

    深入研究Node.js的底层原理和高级使用

  3. JS高级(摘自简书)

    JS高级 1. 访问对象属性(方法也是属性)的通用方式:obj['属性名'] 1. 属性名包含特殊字符,如"-".空格,访问:obj['content-type'] 2. 属性名不 ...

  4. ahjesus 前端缓存原理 转载

    LAMP缓存图 从图中我们可以看到网站缓存主要分为五部分 服务器缓存:主要是基于web反向代理的静态服务器nginx和squid,还有apache2的mod_proxy和mod_cache模 浏览器缓 ...

  5. Ext.js高级组件

    第二章:Ext.js高级组件 grid组件 普通方式 表格面板类Ext.grid.Panel xtype(别名):gridpanel.grid title标题.renderTo渲染至.width宽.h ...

  6. Ajax缓存原理

    一.什么是Ajax缓存原理? Ajax在发送的数据成功后,会把请求的URL和返回的响应结果保存在缓存内,当下一次调用Ajax发送相同的请求时,它会直接从缓存中把数据取出来,这是为了提高页面的响应速度和 ...

  7. 【Web技术】276- WebView缓存原理分析和应用

    前言 混合式开发,在产品体验以及页面加载速度的体验上已经非比以往的.今日早读文章由@unclechen分享. 正文从这开始- 一.背景 现在的App开发,或多或少都会用到Hybrid模式,到了WebV ...

  8. 如何编写高质量的js代码--底层原理

    转自: 如何编写高质量的 JS 函数(1) -- 敲山震虎篇   本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/7lCK9cHmunvYlbm ...

  9. JS高级前端开发群加群说明及如何晋级

    JS高级前端开发群加群说明 一.文章背景: 二. 高级群: 三. 加入方式: 四. 说明:   一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在“前端开发”关键字搜索结果第一名.当然取得这 ...

随机推荐

  1. 【ZJOI2017 Round2练习&BZOJ4826】D1T2 sf(主席树,单调栈)

    题意: 思路:From http://blog.csdn.net/neither_nor/article/details/70211150 对每个点i,单调栈求出左边和右边第一个大于i的位置,记为l[ ...

  2. ubuntu 16.04网卡找不到eth0

    自15版本开始就不叫eth0.可以通过ifconfig进行查看: ifconfig -a 其中enp3s0才是网卡的名称,lo为环路. 参考: http://blog.csdn.net/christn ...

  3. 复习es6-解构赋值+字符串的扩展

    1. 数组的解构赋值 从数组中获得变量的值,给对应的声明变量赋值,,有次序和对应位置赋值 解构赋值的时候右边必须可以遍历 解构赋值可以使用默认值 惰性求值,当赋值时候为undefined时候,默认是个 ...

  4. 此人牛b,学习榜样

    http://liyangliang.me/about/ ------------------------------------------------------------2017年11月12日 ...

  5. TI C66x DSP 系统events及其应用 - 5.11(中断控制寄存器)

    C66x DSP运行中断的简要流程: 1.使能了全局中断和子中断.假设硬件检測到中断发生,那么CPU就要跳转. 2.软件把CPU内部的A,B类寄存器的值等推入堆栈保存,把当前PC寄存器的值放入IRP寄 ...

  6. Android图形显示系统——上层显示1:界面绘制大纲

    Android显示之应用界面绘制 越到上层,跟业务关联越直接.代码就越繁杂.Android上层显示的代码正是如此.此外,java语言本身繁复的特点(比C语言多了满屏的try-catch,比C++少了析 ...

  7. 2015:WPS笔试-Android开发岗位

    题目一共三道: 一:实现一个函数,能够推断两条直线的关系:平行.重合.垂直或相交. 二:实现一个函数.能够得到随意两个日期的相隔天数. 三:针对题目一或题目二,实现一个完整的单元測试. (笔试后在网上 ...

  8. 浅析Linux字符设备驱动程序内核机制

    前段时间在学习linux设备驱动的时候,看了陈学松著的<深入Linux设备驱动程序内核机制>一书. 说实话.这是一本非常好的书,作者不但给出了在设备驱动程序开发过程中的所须要的知识点(如对 ...

  9. POJ2393 Yogurt factory 【贪心】

    Yogurt factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6821   Accepted: 3488 De ...

  10. Android简单开发之 通用Adapter ViewHolder

    我们寻常使用Adapter的方式 public class BusbaseSearchApadter extends SimpleBaseApadter { private List<Busba ...