博主信息
Sky
博文
291
粉丝
0
评论
0
访问量
6833
积分:0
P豆:617

缓存函数的简单使用

2021年10月18日 22:13:15阅读数:27博客 / Sky

前言

缓存是一种重要的程序优化手段,一般采用以空间换时间的措施来提高程序性能,常用的缓存方法有浏览器缓存、HTTP 缓存等。

场景

假设有这样一个简单场景:后台返给前端一组数据做展示,考虑到页面性能问题,前端需要分页来显示。

我们就这个场景需求来做一下代码实现。

实现一

非常常规的实现方式:

// 假设后台返回的数据是一个数组,存在 data 中function getPagerData(pageNumber, pageSize) {
   return data.slice(pageSize * (pageNumber - 1), pageSize * pageNumber);}

每次点击页面页码时,都要调用 getPagerData 方法来计算出所需要展示的数据。

如果 data 的长度不大,那每次计算应该都很快,一旦 data 的长度较大,那每次计算展示数据的速度就不是那么乐观了。

为了性能和展示的体验效果,后台都将数据一把推了,结果前端因为计算显示数据而导致展示慢,这就有点说不过去了,后台开发说不定还会嘲笑前端不给力呢。

实现二

既然做了分页功能,那就意味着用户可以点击任何一页的页码。如果采用“实现一”中的方案,那即使是之前已经显示过的数据,如果用户想要再次展示,还是要重新计算一遍才行,这要就做了很多重复性的工作,实在是影响性能你。

现在我们做一个这样的优化:

function dataController() {
   let catchData = new Map();
   return function (pageNumber, pageSize) {
       if (!catchData.has(pageNumber)) {
           catchData.set(pageNumber, data.slice(pageSize * (pageNumber - 1), pageSize * pageNumber));
       }
       return catchData.get(pageNumber);
   };}let getPagerData = dataController();

之后用户每次点击页码时,我们只需要如下调用即可:

const data = getPagerData(pageNumber, pageSize);

然而,作为一名有追求有抱负的新时代程序员,我们会发现一个问题:手机号码出售上面的 dataController 只适用于这一种特定场景,没有可复用性!这哪行,必须改,于是有了下面这个方法:

function dataController(fn) {
   let catchData = new Map();
   return function (...args) {
       if (!catchData.has(args[0])) {
           catchData.set(args[0], fn(...args));
       }
       return catchData.get(args[0]);
   }}function getPagerData(pageNumber, pageSize) {
   return data.slice(pageSize * (pageNumber - 1), pageSize * pageNumber);}let getData = dataController(getPagerData);

之后每次需要数据的时候,都可以这样调用:

let data = getData(pageNumer, pageSize);

将具体截取数据的方法当做参数传入,之后如果有不同的截取逻辑,只需要封为函数传入 dataController 即可得到数据,大大提高了代码复用率。

总结

以上就是使用缓存函数的一个简单用例 !

~

~本文完,感谢阅读!

~

学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

你来,怀揣期望,我有墨香相迎! 你归,无论得失,唯以余韵相赠!

知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!


版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • 随着jwt出现,校验方式更加便捷化,无需通过redis,而是直接根据token取出保户信息,以及对token可性校验,点登录更为
    php清除冲区方法:1、使“ob_clean()”清除,该可以清除php冲区里面内容;2、使“ob_end_clean()”清除,该清除php冲区内内容,并且关闭输出冲区

    2020-11-04

    1069

    设置php方法:1、使Memcached高性能分布式内对象系统,于动态Web应以减轻据库负载;2、使Redis实现;3、使APC开放自由PHP opcode
    php页面主要是ob系列,如【ob_start(),ob_end_flush(),ob_get_contents() 】,今天我们来谈谈使这些来实现php网站页面静态化。
    Blade模板是是Laravel提供模板引擎,它强大,Blade允许在视图中使原生PHP代码,Laravel使是编译后文件,而不是视图本身,所以Blade对于应程序来说是零开销。
    php下载文件内容乱码解决办法:1、使flush刷新输出冲;2、使ob_clean清空输出冲区即可。
    php清除输出实现方法:首先使“ob_start();”打开冲区;然后利“ob_clean();”清除冲区中内容;最后通过“ob_end_flush();”输出冲区内容并关闭冲即可
    ​下面由Laravel教程栏目给大家介绍在Laravel中使Redis锁解决击穿问题,希望对需要朋友有所帮助!
    php5 session丢失解决办法:1、修改“php.ini”配置文件;2、使“Fecade Session::get()”获取或使助手“session()”;3、重启服务,清除
    解决方法是:1、穿透,可以把空据也起来和使布隆过滤器;2、雪崩,可以设置对应热点key永不过期,多结合,采购第三方Redis,以及过期时间错开,过期时间使随机生成即可。
    是一种优化技术,通过储开销大执行结果,并在相同输入再次出现时返回已结果,从而加快应程序速度。
    Redis是完全开源免费C语言编写,遵守BSD协议一个高性能(key/value)分布式内据库,也是基于内运行并支持持久化NoSQL据库,是当前最热门NoSql据库之一,也被人们称为据结构服务器
    redis常见使场景有:1、据;2、计器;3、实现队列;4、位操作(大据处理);5、分布式锁与线程机制;6、最新队列。
    php下载文件乱码解决办法:1、使flush刷新输出冲解决PHP下载文件内容乱码;2、使ob_clean清空输出冲区解决PHP下载文件内容乱码。
    穿透解决方法:1、把空据也起来;2、利布隆过滤器。
    php导出excel出现500错误解决方法:使【PHPExcel_Settings::setCacheStorageMethod()】方法将方式作为参传递给该方法来设置即可。
    高速储器中信息是:频繁访问RAM位置内容及这些据项储地址。
    php下载文件出现乱码解决方法:首先使ob_clean()丢弃输出冲区中内容;然后利ob_flush()冲刷出输出冲区中内容;最后下载文件即可。
    php下载文件出现乱码解决方法:首先在下载文件之前使ob_clean清空输出冲区;然后利flush刷新输出冲;最后下载文件即可。
    php显示不了验证码图片解决办法:1、去除“;extension=php_gd2.dll”中分号;2、将代码编码格式改成无BOM格式;3、使“ob_clean()”清除