0.缓存好处简述
- 避免冗余的数据传输:
当很多的人去访问一个网站的原始服务器,此时原始服务器会为每个访问着者都发送一份相同的文本。这样就会浪费我们的网络带宽,同时使我们的原始服务器负载加重。假如使用了缓存,此时我们就可以在缓存服务器中备份一份文本,此时再有访问者访问就不用直接和原始服务器对接,让缓存去发送文本。这样可以减少我们的原始服务器的负载压力,同时可以避免一些不必要的数据传输。
- 缓解带宽瓶颈:
缓存还可以缓解带宽瓶颈。我们都知道在网络传输中,数据的传输速率会以路径中最小的的带宽来计算。而大多数的网络一般为本地网络提供的带宽是大于远程网络的带宽。当我们在本地做了缓存之后就不用远程的去向原始服务器请求数据,则避免了远距离传输数据时受到小带宽的限制,这样我们就利用局域网的较大带宽来传输文本。
- 避免瞬间拥塞:
瞬间拥塞问题其实很考验原始服务器的抗压能力,当在网络上有一个热点问题的时候,会在短时间内有巨大的点击量,这样服务器不得不在但时间内处理百万计的网络请求。如果我们不做缓存处理,那么这样的对原始服务器的考验是巨大的。如果我们做了缓存,用户没有必要向服务器请求一些非必要的数据或者文本,这样对于原始服务器来说是一个极大的帮助,减少了服务器去接收访问的数据的次数。
- 距离延迟:
数据传输的过程中,当发送者和接收者两者的距离很远,那么数据传输带来的延迟就越明显。即使是光速传输,也会存在延迟,而缓存能够让远距离数据传输变得很低。
1.常见的本地缓存
1.storage:
- SessionStorage:
临时的会话存储,只要当前的会话窗口未关闭,存储的信息就不会丢失,即便刷新了页面或者在编辑器中更改了代码,存储的会话信息也不会丢失。
- LocalStorage
如果不主动删除,则会永久的存储在用户本地
封装的小工具方法:localStorage.js
2.cookie(另作介绍)
2.cookie与storage区别
- cookie兼容所有的浏览器(本地cookie谷歌不支持),storage不支持IE6~8;
- 二者对存储的内容均有大小限制,前者同源情况写一般不能存储4kb的内容,后者同源一般能存储只能存储5MB的数据;
- cookie有过期时间,localStorage是永久存储;
- 一些浏览器处于安全的角度可能会禁用cookie,但无法禁用localStorage。
3.手动实现缓存的方法
function memoize(fn) {
const cache = {};
return function (param) {
if (cache[param]) {
console.log('cached');
return cache[param];
} else {
let result = fn(param);
cache[param] = result;
console.log(`not cached`);
return result;
}
}
}
const toUpper = (str ="")=> str.toUpperCase();
const toUpperMemoized = memoize(toUpper);
toUpperMemoized("abcdef");
toUpperMemoized("abcdef");
使能接受多个参数:
const slice = Array.prototype.slice;
function memoize(fn) {
const cache = {};
return (...args) => {
const params = slice.call(args);
console.log(params);
if (cache[params]) {
console.log('cached');
return cache[params];
} else {
let result = fn(...args);
cache[params] = result;
console.log(`not cached`);
return result;
}
}
}
const makeFullName = (fName, lName) => `${fName} ${lName}`;
const reduceAdd = (numbers, startingValue = 0) => numbers.reduce((total, cur) => total + cur, startingValue);
const memoizedMakeFullName = memoize(makeFullName);
const memoizedReduceAdd = memoize(reduceAdd);
memoizedMakeFullName("Marko", "Polo");
memoizedMakeFullName("Marko", "Polo");
memoizedReduceAdd([1, 2, 3, 4, 5], 5);
memoizedReduceAdd([1, 2, 3, 4, 5], 5);
---END---