我们来聊聊缓存

迈不过友情╰ 2022-06-15 05:27 268阅读 0赞

我们来聊聊缓存

缓存是什么?

缓存 :临时存储,提高访问效率(对性能的提升帮助非常大)

浏览器缓存 : 用户第一次发送请求访问某个网站时,服务器端响应并返回相应的页面信息,浏览器会缓存部分文件,当下一次用户再一次访问这个站点时,会加载临时缓存的页面信息,好处时,用户网络差的时候,也可以比较好的呈现页面信息,一定程度上节省了用户的流量

硬件缓存 : 当我们打开某个软件时 cpu不可能直接去硬盘读取数据,因为硬盘的转速太慢了,cpu会先让内存去硬盘中读数据,内存转速比硬盘转速高的多,内存在这里就充当一个缓存的角色

CDN缓存 : 打个比方,比如我在深圳想访问北京那边的网站,如果直接访问的话,因为距离较远,所以访问速度比较慢,这时候CDN缓存就扮演了一个很重要的角色;每个地方都会有CDN,当我想访问北京的网站时,北京的网站会在深圳这边的cdn服务器缓存一份,我们在从深圳cdn服务器访问北京那个网站就会快很多了

js中没有缓存机制,因此需要我们自己去模拟封装一个具备缓存功能的函数;

我们可以尝试先来封装一个简单的具有缓存功能的函数

  1. function createCache() {
  2. // 创建一个对象用来存储缓存
  3. var obj = {};
  4. return function(key, value) {
  5. // 用户如果传入两个参数,我们就把数据保存到缓存中,如果只传一个参数,就当他是获取数据
  6. return value ? obj[key] = value : obj[key];
  7. }
  8. }
  9. var personCache = createCache();
  10. personCache('手机', '苹果');
  11. console.log(personCache('手机'))
  12. // 缓存一般都有限定大小的;上面的代码并没有做到限定大小;

缓存一般都有限制大小的吧,上面的缓存没有限制大小,所以其实并没什么卵用,我们可以再丰富一下这个函数的功能;

  1. function createCache(){
  2. //申明一个对象当做缓存的容器用来存储用户传过来的数据;
  3. var obj = {};
  4. //再创建一个数组,利用数组的length属性可以一一对应对象中的数据,
  5. //方便我们访问或修改等操作;
  6. var keys = []
  7. function cache(key, value){
  8. if(value){
  9. obj[key] = value; //对象中存储了键值对,
  10. keys.push(key); //对应的数组中也要存入键和对象的数据对应
  11. if(keys.length > 20 ){ // 设置缓存大小为20条数据
  12. delete obj[[keys.shift()]]; //每次超过20条数据,
  13. //我们就删除数组和对象中的第一条数据
  14. }
  15. }else{
  16. return obj[key];
  17. }
  18. }
  19. return cache;
  20. }
  21. //到这里,我们就基本实现了一个缓存功能的函数,上述代码其实可以再优化优化的,
  22. // 可以利用内部的cache函数是对象的特征,我们把属性动态添加到cache函数身上
  23. //这样就不用额外再创建一个对象保存数据了

我们封装了一个缓存功能的函数,总要来解决问题吧,下面就用缓存来解决斐波那契性能问题

我们先来看看斐波那契的原理哈

这里写图片描述这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

由上图可知:

当我们求第三位数时,先计算第二位 和第一位

当我们求第四位,先计算第三位和第二位,第三位又会接着上一步的操作

当我们求第五位时,先计算第四位和第三位,第四位和第三位又会依次往下面计算….

这时我们会发现出很严重的问题:

因为存在大量的重复计算,所以导致效率低下!

解决:

  1. 每次需要获取一个斐波那契数字的时候,先去缓存中获取
  2. 如果缓存中找到了,就直接使用
  3. 如果缓存中没有找到,就使用递归的方式进行计算
  4. 计算出来的结果一定要在缓存中保存一份,以便下次使用

实际代码如下:

  1. // 缓存工具函数
  2. function createCache(){
  3. //申明一个对象当做缓存的容器用来存储用户传过来的数据;
  4. var obj = {};
  5. var keys = []
  6. function cache(key, value){
  7. if(value){
  8. obj[key] = value;
  9. keys.push(key);
  10. if(keys.length > 20 ){
  11. delete obj[[keys.shift()]];
  12. }
  13. }else{
  14. return obj[key];
  15. }
  16. }
  17. return cache;
  18. }
  19. // 解决斐波那契性能问题的函数
  20. var fibCache = createCache();
  21. function fib(n){
  22. //1. 直接去缓存中找n对应的数据
  23. var num = fibCache(n);
  24. //2. 判断num是否有值, 如果有就直接使用缓存中的内容
  25. if(!num){
  26. //如果缓存中没有取到值
  27. //就去计算一次
  28. if(n == 1 || n == 2){
  29. num = 1;
  30. }else{
  31. num = fib(n - 1) + fib(n - 2);
  32. }
  33. //计算出来结果之后,将结果保存进缓存当中,方便下次使用
  34. fibCache(n, num);
  35. }
  36. return num;
  37. }
  38. console.log(fib(100));

缓存会极大的提高我们程序的性能,我们在写代码时应注意利用缓存来优化我们代码的性能;

发表评论

表情:
评论列表 (有 0 条评论,268人围观)

还没有评论,来说两句吧...

相关阅读

    相关 聊聊MyBatis缓存机制

    前言 MyBatis是常见的Java数据库访问层框架。在日常工作中,开发人员多数情况下是使用MyBatis的默认缓存配置,但是MyBatis缓存机制有一些不足之处,在使用

    相关 我们聊聊缓存

    我们来聊聊缓存 缓存是什么? 缓存 :临时存储,提高访问效率(对性能的提升帮助非常大) 浏览器缓存 : 用户第一次发送请求访问某个网站时,服务器端响应并返回

    相关 聊聊缓存替换

    换出策略 前几天看到别人整理的关于缓存替换的讨论,觉得很是不错。大致有这么几种思路: 随机换出 FIFO(First In First Out) LR

    相关 我们聊聊技术债务

    > 技术债务 「技术债务」是开发团队在设计或架构选型时,从短期效应的角度选择了一个易于实现的方案。但从长远来看,这种方案会带来更消极的影响,亦即开发团队所欠的债务。 简单的