缓存的原理

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

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

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

缓存原理运用

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

<script>
var count = 0;
function fib(n){
count ++;
if(n <= 2){
return 1;
}
return fib(n - 1) + fib(n - 2);
} fib(5);
console.log(count);//9
count = 0;
fib(6);
console.log(count);//15
count = 0;
fib(20);
console.log(count);//13529
count = 0;
fib(21);
console.log(count);//21891
</script>

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

<script>
//创建缓存容器
function createCache(){
var cache = {};
return function (key, value) {
//如果传了值,就说名是设置值
if(value !== undefined){
cache[key] = value;
return cache[key];
}
//如果没有传值,只穿了键,那就是获取值
else{
return cache[key];
}
}
}
var count =0 ;
function createFib(){
var fibCache = createCache();
function fib(n){
count ++;
//1.从cache中获取数据
if(fibCache(n) !== undefined){
//如果缓存中有 直接返回
return fibCache(n) ;
}
//如果缓存中没有 就计算
if(n <= 2){
//把计算结果存入数组
fibCache(n , 1) ;
return 1;
}
var temp = fib(n - 1) + fib(n - 2);
//把计算结果存入数组
fibCache(n, temp) ;
return temp;
} return fib;
} var fib = createFib();
fib(5);
console.log(count);//7
count = 0;
fib(6);
console.log(count);//3
count = 0;
fib(20);
console.log(count);//29
count = 0;
fib(21);
console.log(count);//3
</script>

jquery的缓存实现分析

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

模拟jquery缓存

<script>
function createCache(){
//cache对象中以键值对的形式存储我们的缓存数据
var cache = {};
//index数组中该存储键,这个键是有顺序,可以方便我们做超出容量的处理
var index = [];
return function (key, value) {
//如果传了值,就说名是设置值
if(value !== undefined){
//将数据存入cache对象,做缓存
cache[key] = value;
//将键存入index数组中,以和cache中的数据进行对应
index.push(key); //判断缓存中的数据数量是不是超出了限制
if(index.length >= 50){
//如果超出了限制
//删除掉最早存储缓存的数据
//最早存入缓存的数据的键是在index数组的第一位
//使用数组的shift方法可以获取并删除掉数组的第一个元素
var tempKey = index.shift();
//获取到最早加入缓存的这个数据的键,可以使用它将数据从缓存各种删除
delete cache[tempKey];
}
}
return cache[key];
}
} var eleCache = createCache();
eleCache("name","高金彪");
console.log(eleCache("name"));
</script>

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

<script>
function createCache() {
var keys = [];
function cache( key, value ) {
// 使用(key + " ") 是为了避免和原生(本地)的原型中的属性冲突
if ( keys.push( key + " " ) > 3 ) {
// 只保留最新存入的数据
delete cache[ keys.shift() ];
}
// 1 给 cache 赋值
// 2 把值返回
return (cache[ key + " " ] = value);
}
return cache;
} var typeCache = createCache();
typeCache("monitor");
console.log(typeCache["monitor" + " "]); typeCache("monitor","张学友");
console.log(typeCache["monitor1" + " "]); typeCache("monitor","刘德华");
console.log(typeCache["monitor2" + " "]); typeCache("monitor3","彭于晏");
console.log(typeCache["monitor3 "]);
</script>

最新文章

  1. 不要给&lt;a&gt;设置outline:none
  2. Spring+Mybatis+SpringMVC+Maven+MySql搭建实例
  3. C++中虚析构函数的作用
  4. MString 与 QString 互转
  5. csdn在线编程里面的一个排列组合题
  6. Linux下scp命令的用法
  7. Linux下生成动态链接库是否必须使用 -fPIC 的问题[转]
  8. find中的 time 参数
  9. eclipse搭建Log4J日志环境
  10. AngularJS学习篇(二十二)
  11. 深入css布局篇(2) — 定位与浮动
  12. typeof 子类获取父类
  13. ogg BR – BOUNDED RECOVERY 测试案例
  14. Java之IO流总结
  15. BZOJ2793[Poi2012]Vouchers——枚举
  16. Spring的单例实现原理-登记式单例
  17. HDU 2522 A simple problem (模拟)
  18. 关闭provider进程或者consumer进程后,会发生什么?
  19. Netbeans 安装emmet插件
  20. centos7 svn搭建

热门文章

  1. 在Myeclipse中拷贝一个web项目,但是tomcat文件夹中没有更新,需要进行修改才能更新。
  2. PHP array_merge_recursive()
  3. CocoaPods pod instal慢、卡住解决方法
  4. srm 539
  5. linux 磁盘性能监控
  6. 【C++程序不输出】到底是什么造成了程序不输出
  7. ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)
  8. JavaScript Patterns 2.3 For loops
  9. JSP-Runoob:JSP 生命周期
  10. STM32:TIMER输出比较模式-PWM