怎么我用缓存,老是被重新覆盖啊,用不了别人我要自学网的缓存位置

使用Retrofit和Okhttp实现网络缓存。无网读缓存,有网根据过期时间重新请求 - 简书
使用Retrofit和Okhttp实现网络缓存。无网读缓存,有网根据过期时间重新请求
使用Retrofit和Okhttp实现网络缓存,更新于
本文使用 Retrofit2.0.0-beta2、Okhttp 2.6.0(Okhttp3.0之后api写法有变化)
配置Okhttp的Cache
配置请求头中的cache-control或者统一处理所有请求的请求头
云端配合设置响应头或者自己写拦截器修改响应头中cache-control
最后实现的效果是:有网的时候根据你每个接口设置的需要缓存的时间(1分钟、5分钟等)进行缓存,过了时间重新请求;没网的时候读缓存。
在这里插一句为什么要做缓存,或者说有什么好处?
减少服务器负荷,降低延迟提升用户体验。复杂的缓存策略会根据用户当前的网络情况采取不同的缓存策略,比如在2g网络很差的情况下,提高缓存使用的时间;不用的应用、业务需求、接口所需要的缓存策略也会不一样,有的要保证数据的实时性,所以不能有缓存,有的你可以缓存5分钟,等等。你要根据具体情况所需数据的时效性情况给出不同的方案。当然你也可以全部都一样的缓存策略,看你自己。
1.配置okhttp中的Cache
OkHttpClient okHttpClient = new OkHttpClient();
File cacheFile = new File(context.getCacheDir(), "[缓存目录]");
Cache cache = new Cache(cacheFile, 1024 * 1024 * 100); //100Mb
okHttpClient.setCache(cache);
2.配置请求头中的cache-control
在Retrofit中,我们可以通过@Headers来配置,如:
@Headers("Cache-Control: public, max-age=3600)
@GET("merchants/{shopId}/icon")
Observable&ShopIconEntity& getShopIcon(@Path("shopId") long shopId);
没有设置的可以即为有网的时候不进行缓存。
或者你所有接口在有网的时候都不需要缓存或者都需要缓存且时间一样,那么也不用配置每个接口的@Headers的Cache-Control了。
3.云端配合设置响应头或者自己写拦截器修改响应头response中cache-control
到这一步缓存就已经待在你的缓存目录了。
如果云端有处里cache的话,就已经可以了。
但是很可能云端没有处理,所以返回的响应头中cache-control是no-cache,这时候你还是无法做缓存,大家可以用okhttp的写日志拦截器查看响应头的内容。
[ Okhttp Interceptors 使用说明,我是个链接](" target="_blank)
如果云端现在不方便处理的话,你也可以自己搞定缓存的,那就是写拦截器修改响应头中的cache-control。我把请求头中的cache-control读出来然后设置到了响应头中。
设置拦截器:
REWRITE_CACHE_CONTROL_INTERCEPTOR拦截器需要同时设置networkInterceptors和interceptors(OKHTTP3.0配置是否有效待我测试)
okHttpClient.interceptors().add(LoggingInterceptor);
okHttpClient.networkInterceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR);
okHttpClient.interceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR);
拦截器如下:云端响应头拦截器,用来配置缓存策略
* 云端响应头拦截器,用来配置缓存策略
* Dangerous interceptor that rewrites the server's cache-control header.
private final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = chain -& {
Request request = chain.request();
if(!NetUtils.hasNetwork(context)){
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
Logger.t(TAG).w("no network");
Response originalResponse = chain.proceed(request);
if(NetUtils.hasNetwork(context)){
//有网的时候读接口上的@Headers里的配置,你可以在这里进行统一的设置
String cacheControl = request.cacheControl().toString();
return originalResponse.newBuilder()
.header("Cache-Control", cacheControl)
.removeHeader("Pragma")
return originalResponse.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=2419200")
.removeHeader("Pragma")
最后日志拦截器也贴上来吧
private final Interceptor LoggingInterceptor = chain -& {
Request request = chain.request();
long t1 = System.nanoTime();
Logger.t(TAG).i(String.format("Sending request %s on %s%n%s", request.url(),
chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
Logger.t(TAG).i(String.format("Received response for %s in %.1fms%n%s", response.request().url(), (t2 - t1) / 1e6d, response.headers()));
以下测试Cache-Control的配置在请求头和响应头中都有且一样。
max-stale在请求头设置有效,在响应头设置无效。(因为max-stale是请求头设置参数,参考上面的缓存相关的知识第二个链接)
max-stale和max-age同时设置的时候,缓存失效的时间按最长的算。
关于max-age和max-stale我这里做了一个测试:
测试结果:
我在请求头中设置了:Cache-Control: public, max-age=60,max-stale=120,响应头的Cache-Control和请求头一样。
在第一次请求数据到一分钟之内,响应头有:Cache-Control: public, max-age=60,max-stale=120
在1分钟到3分钟在之间,响应头有:Cache-Control: public, max-age=60,max-stale=120
Warning: 110 HttpURLConnection "Response is stale"
可以发现多了一个Warning。
三分钟的时候:重新请求了数据,如此循环,如果到了重新请求的节点此时没有网,则请求失败。
另外关于缓存有一个rxcache也可以试试。
感谢@一起讨论研究
前言 在Android开发中我们经常要进行各种网络访问,比如查看各类新闻、查看各种图片。但有一种情形就是我们每次重复发送的网络请求其实返回的内容都是一样的。比如一个电影类APP,每一次向服务器申请某个电影的相关信息,如封面、简介、演员表等等,它们的信息都是一样的。显然,这样...
本文就是讲解在OKHTTP中如何配置缓存。 HTTP协议中缓存相关 为了更好的讲解OKHTTP怎么设置缓存,我们追根溯源先从浏览器的缓存说起,这样后面的OKHTTP缓存内容自然更加好理解。 我这部分内容也是经网络上查阅,这一篇写得很详细: 浏览器 HTTP 协议缓存机制详解...
网络请求是每一个Android应用都需要的功能,通过网络获取内容既缓慢,成本又高;大的响应需要在客户端和服务器之间进行多次往返通信,这拖延了客户端可以使用和处理内容的时间,同时也增加了访问者的数据成本。因此,缓存和重用以前获取的资源的能力成为优化性能很关键的一个方面。 Ca...
1.OkHttp源码解析(一):OKHttp初阶 2 OkHttp源码解析(二):OkHttp连接的&前戏&——HTTP的那些事 3 OkHttp源码解析(三):OKHttp中阶之线程池和消息队列 4 OkHttp源码解析(四):OKHttp中阶之拦截器及调用链 5 OkH...
Okhttp使用指南与源码分析 标签(空格分隔): Android 使用指南篇# 为什么使用okhttp### Android为我们提供了两种HTTP交互的方式:HttpURLConnection 和 Apache HTTP Client,虽然两者都支持HTTPS,流的上传...
浮动元素有什么特征?对父容器、其他浮动元素、普通元素、文字分别有什么影响? 浮动元素的特征:1、脱离普通文档流;2、可以向左或向右移动,直到它的外边缘碰到包含框或者另一个浮动元素的框的边缘;3、如果同时存在多个浮动元素水平排列,且浮动元素宽度的总和大于容器的宽度,则多出的元...
713的时候,我想着he是不可能了,那么来一场轰轰烈烈的be也不错。 那样我也能明明白白地毕业了,终归借别人酒浇自己家块垒而已。 其实对he的可能已经不抱希望了,这么长时间下来,对双方都产生过一些黑暗甚至卑劣的猜测。 毕竟是他们自己的事,经历过九州崩塌的9zer或许更有资格...
参见:hexo官方网站Hexo 提供了快速方便的一键部署功能,让您只需一条命令就能将网站部署到服务器上。 安装 hexo-deployer-git npm install hexo-deployer-git --save 修改配置 vim _config.yml #站点配置...帖子很冷清,卤煮很失落!求安慰
手机签到经验翻倍!快来扫一扫!
【硬件】缓存到底重不重要?!关于SSD的最争议话题!
2113浏览 / 3回复
&&恭喜您的文章被首页推荐,欢迎更多的人关注Z神通联盟,加入方式:发送个人代表作品到.cn& & & &近期,作为SSD主控的一线厂商,Marvell发布了一款全新的88NV11X0系列SSD主控,这个系列的主控有88NV1120以及88NV1140两款,这两款主控封装更小,最重要的变化在于不需要外部DRAM来做缓存。&&&&&&&没有缓存??很多人估计会下结论,那不就是低端货色了?&&&&&& 好吧,如果你还停留在有缓存的SSD才是好货的想法上,你真的OUT了。 && 不需要DRAM外部缓存最为直观的优点有两个,第一是节约了成本(缓存颗粒要钱买,地球人都知道);第二是产品所占用的空间更小(芯片很占地,严禁堆放)。这应该很容易理解吧。全新的88NV11X0芯片封装尺寸仅8*8mm2,最少仅需两颗芯片就能做成一个SSD,那么做成M.2 2230的尺寸成为可能&。图上的正是88NV1120主控,大小只有SD卡那么大,体积优势不言而喻,以后平板等数码类产品里面都是这样的SSD盘,是不是会更加轻薄了呢?&&&&&&&&其实作为Marvell主控,无缓存设计在Marvell主控的合作厂商东芝在他们的Q系列SSD上早就实现了,但是因为东芝Q系列的主控是在Marvell主控的基础上进行二次开发的,因此主控上打的是TOSHIBA的大LOGO。& & &&&&&&&&那么一定还有很多人有这样的疑问,没有缓存的SSD,体积和成本的确是降低了,那么性能呢?&&&&&&那么在讨论性能之前,我们应该先来回忆一下,缓存到底是什么?&&&&&&首先,缓存是为了平衡高速设备和低速设备之间的速度差异而存在的一种中介型设备。它的作用是让低速设备尽量的不拖高速设备的后腿。注意!我用了“尽量”一词,缓存容量始终是有限的,因此数据在缓存中的命中率也是有限的。所以无论如何,低速设备多多少少还是会拖高速设备的后腿,缓存的作用是减少这种现象的发生。&&&&&&我们再来看看,缓存一般出现在哪些环境下?!&&&&&&CPU缓存:&&&&&& CPU与内存的数据通信中速度是存在明显差距的,这是因为内存的响应速度相对于CPU是很慢的。在数据交互中,CPU经常是处在“等待”的状态,如果这种“等待”被一未的忽略,那么CPU将会大大降低工作效率,被内存拖垮。& & & &因此在主内存(RAM)和CPU之间,出现这种称为“缓存”的小容量的SRAM。在数据交互时,主内存返回的不仅仅是CPU需要的数据,同时“附赠”返回所需数据“前后”的一些看似无关的数据,并将这些数据放入缓存中。&&&&& 下一次CPU再次到缓存里请求数据的时候,如果所需数据正好在SRAM里,就可以“命中”了。那么命中率越搞,CPU的效率也就越高。&&&&&好吧,如果觉得光说一个CPU缓存还不够过瘾,我们再来看看SSD的近亲HDD硬盘。& & &HDD机械硬盘缓存:&&&& HDD硬盘一直以来延续着“温彻斯特”的这种碟式架构,可以说是目前电脑系统里最最“拖后腿”的设备。一颗HDD硬盘,没有缓存那绝对是在作死。内存是和硬盘进行数据交互的,由于HDD硬盘相对于内存而言,速度可以用弱爆来形容,已经成为千夫所指的系统瓶颈。解决HDD硬盘速度过慢的问题,目前最为有效的方法就是就在HDD内部集成小容量的内存,也就是硬盘的缓存,目前主流的从32M到64M不等。况且目前的HDD硬盘的缓存并非都用于缓存数据,综合效率在实际的使用中并不令人满意。&&&&&&&从CPU缓存、HDD硬盘缓存来看,缓存能带来较大幅度性能提升的原因在于,低速设备和高速设备之间的速度差距明显。那么SSD固态硬盘呢?&&&&&& SSD的缓存:&&&&&& 缓存在SSD固态硬盘中发挥的作用其实和HDD机械硬盘差不多。一般是搭载1-2颗DRAM颗粒实现,起到数据交换缓冲作用。SSD的速度和内存之间,它们的实际性能差距其实并不大。那么DRAM缓存颗粒呢?它所处的中介位置其实是非常尴尬的,因为对于SSD固态硬盘的速度来说,这种速度上的提升实在是太有限了。&&&&&& 就反应速度来说,SSD的反应速度一般都在0.2毫秒以内,四号不会比缓存慢。那么缓存对于读取速度的提升,就几乎可以忽略不计了。&&&&&&这是我正在使用的一颗东芝Q无缓存& 256G&SSD固态硬盘的成绩,性能表现出色,看起来和有无缓存真的没有什么关系。&&&&&& 其次带不带缓存,对于SSD固态硬盘的寿命影响也是微乎其微,众所周知SSD寿命的是NAND FLASH的写入次数。然而缓存命中更多的是关注读取,主控算法的好坏才是真正决定SSD性能和闪存颗粒使用寿命的关键因素。&&&&&&&对于无缓存SSD的HDTUNE测试图,很多人觉得不是直线不爽。觉得这是读写性能的不稳定。一般人我不告诉你,这和HDTUNE的测试文件大小有关,这类有规律的波动出现是由于SSD在执行TRIM指令的结果。在实际的使用中是没有任何感知的,除非你的心里在作怪。况且HDTUNE这个软件拿来测试SSD真的有点过时。&&&&&& &&&&&& &&&&&&& 以前有人抱怨固态硬盘性能衰减,那是因为没有TRIM和垃圾回收机制,对缓存给予太多的厚望。然而在新兴主控不断更迭的今天,缓存也许真的会慢慢淡出SSD的视野。&&&&&&
涨姿势了,看来以前还是太看重缓存了。这样的主控很可能导致性价比极高的ssd诞生,期待!
记得比尔盖茨说过一句话,大体意思是你们辛辛苦苦花钱花精力去升级硬件,带来的性能提升我们用几行代码就能搞定。新技术让一切变成可能
记得比尔盖茨说过一句话,大体意思是你们辛辛苦苦花钱花精力去升级硬件,带来的性能提升我们用几行代码就能搞定。新技术让一切变成可能
用户名/注册邮箱/注册手机号
其他第三方号登录海贼王现在在哪里能缓存啊?我以前都是在暴风影音里缓存,现在不行了,我说的是手机。
按时间排序
多得是。你可以用UC浏览器
风行(建议这个)
下载一个视频软件,缓存下来就可以了
搜狐视频,我女朋友就是的,能缓存
暴风缓存只有20兆的是收费的,他只有十来分钟,然后就没有啦!别的播放器是收费的啦!要不就是什么都搜不到
爱奇艺 真心不错
(提取码:7b5d)
感谢您为社区的和谐贡献力量请选择举报类型
经过核实后将会做出处理感谢您为社区和谐做出贡献
确定要取消此次报名,退出该活动?
请输入私信内容:注册 | 登录
从零开始学运营,10年经验运营总监亲授,2天线下集训+1年在线学习,做个有竞争力的运营人。
计算机技术的进步颠覆了整个世界,而其中的很多技术不仅能解决计算机方面的问题,对很多其他方面的问题也很有启发。今天笔者给大家介绍缓存理论,从缓存理论的角度来看待一些产品及生活上的问题,将会有许多有趣的结果,这就是今天的主题缓存理论+。笔者在此保证,本文没有门槛,但需要耐心。
如果这节看不太明白不用纠结,结合后面的例子会容易得多。
众所周知,内存和硬盘是电脑的两个重要部件,虽说两者都是用来存储数据的,特性却大相径庭:
内存访问速度快,容量小,断电后无法保存数据,在计算机中充当缓存的角色。
硬盘访问速度慢,容量大,断电后数据不丢失,用于长久地保持数据。
CPU是个急性子,每秒几百亿次计算不在话下,自然爱和内存打交道,不待见硬盘,不待见到什么程度呢,即使CPU要读取硬盘里的数据,也先让硬盘把数据交给内存,CPU再从内存读,缓存往往就是指这样快却容量小的中间存储。
问题来了,内存容量小,而计算机可能会使用的数据却很大,导致内存装不下,只能把装不下数据搁硬盘里,要使用硬盘中的数据,得先让内存清出一些暂时不用的数据,再从硬盘里把所需数据加载到内存,这种倒腾的过程叫做置换Swap,而清出数据的操作称为淘汰数据。从硬盘读数据就耗时了,所以我们希望我们每次取数据时数据都在内存里,减少硬盘的访问。
操作系统有一个很重要的任务——调整内存中的数据,目的在于减少用户使用电脑时因读取硬盘而造成的延迟和卡顿。调整一般发生两种情况下,一个是电脑闲置的时候,提前将用户可能会用到数据搬到内存中;另一个就是置换的时候,加载用户所需数据的同时,舍弃那些比较不可能被访问的数据。
计算机科学里把访问数据时数据刚好在内存里的概率成为命中率。为了提升用户体验,减少等待,就得提高命中率,选择合适的内存置换(淘汰)算法就显得至关重要,内存置换算法是指在发生置换操作时,应该淘汰内存中的哪些数据,来放置新的数据,常用的算法(别怕,都很简单)有:
1、先进先出算法(FIFO,First In First Out)
淘汰最先进来的数据,这个算法非常简单,这样做的道理是最先进来的数据可能已经用过了,过时了。对于一次性或短期使用的数据,非常合适,但对于长期使用的数据,就不合适了。这个算法命中率并不高,常常被提起主要是用来衬托其他算法的优越性,有点类似奥特曼的小怪兽。
2、最久没访问算法(LRU,Least Rescently Used)
淘汰内存中最久没有被用到的数据,这个就比FIFO合理多了,最久没被访问,可能真的是过时了。从逻辑上来说是相对合理的,而且比较简单,现在流行的操作系统大多都使用它或它的变种。当然,这个算法对于那种需要被周期性访问的数据就不合适了。
3、最不频繁算法(LFU,Least Frequency Used)
淘汰内存中在最近一段时间内使用频率最低的数据,这个又比LRU更合理了,就是保留最近最常用的数据,剔除最不常用的蛀虫。它并不是操作系统的宠儿,因为它计算量比较大,自身会消耗一些内存,对于操作系统这样的惜时(内存)如金的家伙是不可接受的。
4、智能算法(AI)
我定义的一类算法,它泛指通过机器学习算法依据各种历史数据,计算各个数据未来一小段时间内将会被访问的概率,保留概率高的,淘汰低的。举个例子,假设你白天使用电脑工作,晚上使用电脑娱乐,那么AI算法可能会在白天尽量在内存中保留工作相关的数据。
比如一些word文档及办公软件的数据,而到了晚上,工作相关的数据则优先被淘汰,内存中常驻游戏,影音之类的数据。再比如,操作系统检测到了我刚刚下载了一部电影,那么这时应该将这部电影的数据及播放器的数据加载到内存中,其他类型的则可能被淘汰。AI算法的计算量显然很大也很复杂,入不了操作系统的法眼,但在很多情况下却非常好用。
再介绍一个概念:多级缓存,后面将会用到。
其实在电脑中,内存并不是读取速度最快的存储介质,还有更快的,叫CPU缓存。如果你看CPU的参数,经常能看到(L1/L2/L3缓存,他们共同组成CPU缓存),它是CPU的一部分,你们在看CPU规格时常常会看到,它离CPU计算核心更近,访问速度更快,但容量更小。CPU缓存和内存的关系 与 内存和硬盘的关系是一毛一样的。其实CPU缓存中还能细分,“ L1缓存 ”是“ L2缓存 ”的缓存,“L2缓存”是“L3缓存”的缓存,“L3缓存”是内存的缓存,如下图所示,这样不断嵌套的缓存结构就叫多级缓存。
缓存还有另外一个作用,缓冲。
计算机中的例子不太好说,举个拉面店的例子。
有个拉面店只卖一种拉面,顾客时多时少,有时一次性来好几个人,师傅现做的话肯定有顾客等很久,如果提前做很多的话又有可能做多卖不出去,那么师傅想了这么一个策略,提前做好一些拉面,放在一个固定的桌子上,如果桌子上的拉面达到2碗,师傅就慢着点做,如果一直没卖出去,桌上的面达到4碗,就完全不做了,如果某个时段生意旺卖很快,桌上的面可能会少于2碗,或者卖完,甚至还有人等,那么师傅就要开足马力做面了。
那么,这里就把桌子当作缓存,通过缓存策略,给师傅一定的缓冲时间,一定程度上抵消人流波动带来的影响。
缓冲可以从两个角度解释,一个是任务发送者,另一个是任务处理者。在发送者和处理者之间设置缓存,来协调任务发送速度与处理速度不一致。当任务发送速度大于处理速度时,任务在缓存中堆积,发送者减慢发送速度,处理者提高处理速度;如果缓存中任务非常少了,则提高发送速度,减慢处理速度。如果处理是一次性的,缓存能减少处理的频率。
举个例子:垃圾桶是一种缓存,如果家里没有垃圾桶,我们一旦有垃圾就得扔到外头的垃圾桶,垃圾桶的存着可以减少我们处理的频率。
缓存理论不仅在计算机领域应用广泛,而且在生活和产品中也常常用到。我们先对理论进行抽象:
缓存/内存,泛指那些使用方便又非常有限的容器。
硬盘,那些使用不方便但容量非常大的容器。
数据,放在容器中的物体。
算法,上面的算法大多都是说怎么淘汰,而下面往往说的是怎么保留,怎样选择,其实本质是一样的。从保留数据的角度重新解释上面的算法:FIFO,保留最后进入内存的;LRU,保留最近用过的;LFU,保留近期使用最频繁的;AI,保留未来最可能用到的。
下面举例:
我们的电脑桌面就是一个“缓存”,你可以在上面放文件及程序,它非常方便,触手可及,但是它容量非常有限,而资源管理器(我的电脑)则像是“硬盘”。桌面空间有限,东西多了也容易造成混乱,所以必须有所取舍,熵君在整理电脑桌面时一般会将最常用的放在桌面上,不常用的淘汰,这其实就是LFU算法 。
我们的手机桌面的首屏也可以当做“缓存”,一打开就能用到,而最下面一排的快捷栏则是更高级的缓存。我一直期望手机有这样一个功能,自动把最常用(LFU)的应用放首屏,省得我去整理。
chrome的首页就有很多标签卡,都是你最常打开的网站(LFU),非常方便。
网站的首页也是一个缓存,就拿电商网站来说,首页资源是非常珍贵的,过去,这个首页往往是死的,把一些热门的商品放在首页,而现在都是使用推荐算法为每个用户定制首页,这就是上面所说的AI算法。新闻网站也很类似,以前都是编辑根据经验人工调整的首页,现在往往会引入智能算法(AI),结合用户个性化,新闻时效性等综合因素来安排首页内容。
生活中也有很多例子。笔者在整理房间的时候就会使用缓存理论,我会划定一些缓存。
比如桌面,或者其他一些触手可及的地方;我也会制造缓存,比如指定衣柜中的某个格子为缓存,规定放在这个格子里的衣服可以随意堆放。这些“缓存”常常会溢出,比如桌上太多东西了,影响我工作了;或者衣柜里的缓存区衣服太满,衣服不好找了。
这时我就会清理,我会把不常用的物品清出缓存区,并规整地放在它应该放的地方。这样就避免了频繁整理常用的物品,而这些常用的物品常常在你整理后又会使用到,那么之前就白整理了。这里也用到了缓存的缓冲功能。
这样的例子还有很多,比如微信的首屏也是个缓存,显示最近的对话,显然是使用LRU算法。当你在某个场景抽象出了缓存,那么下一步就是选取合适的算法,一般情况下LFU/LRU这样的简单算法就够用了,如果缓存资源非常珍贵,那么就应该求助你们的算法工程师做一套AI算法了,这就是缓存理论+。
缓存理论与电商物流
如何利用缓存理论分析网购物流的未来呢?
如果把网购当做一次数据访问,那么我们可以把商品当做数据,把发货的仓库当做硬盘,缓存则可以有很多种,那么我们将得到以下几种购物模式:
从硬盘直接读取数据,不经过缓存。也就是网购,并送货上门。
(1)优点:直接,不需要顾客奔波。
(2)缺点
无法确定派送时间。很多时候顾客在派送的时候不在目的地,或者由于其他原因无法接收,这样要么限制了顾客自由,要么降低了快递员的效率。
先从硬盘读取数据到缓存/内存,再从缓存读取数据。也就是网购,送货到自提柜再由用户自提,自提柜就是缓存。
(1)优点:用户收货不再受到快递派送时间的制约。
(2)缺点:
要自己取,如果自提柜远还不顺路就更费劲了;
很多地方没有自提柜;
自提柜的空间无法充分利用,如果自提柜很密集,那么空置率肯定很高。
数据已经提前从硬盘加载到内存,直接访问内存就可以了。这就便利店的模式,便利店也是一种缓存,老板进货就是从硬盘加载数据到缓存的操作。
(1)优点:快。
(2)缺点
要自己取;
商品有限,很多东西都买不到。
从缓存理论的角度分析
从缓存理论的角度,以上这几种购物方式其实是可以互相转换的。如果仅仅从缓存的角度,如何分析这几种模式?
模式一:没有缓存,每次从硬盘加载,慢。
模式二:有缓存,但是每次仍然从硬盘加载数据,缓存只起到了缓冲的作用,相当于命中率为0的缓存。无法确保缓存被充分利用,当自提柜密度提高时更甚。如果你把自提柜的空间比作便利店的货架,这相当于便利店的货架很大部分没摆放商品。
模式三:有缓存,缓存利用率高,但缓存算法并不是最优化,这是由店老板决定的,因此命中率还有提高的空间。缓存就像一潭死水,无法变化,缓存中没有的数据(店里没有的商品)无法获取。
笔者的理想模式是怎么样的呢?让我们通过改造模式二(自提柜)来获得:
增加自提柜的密度,要比便利店还更密,提供更好的覆盖度及体验。
发展自提柜快递员这种职业,和普通快递员不同,他们的任务是由顾客直接指派,并且快速响应,派送距离很短,一般1公里以内(由自提柜的密度决定),解决懒人的最后一公里。其实这个不一定有必要,更多的是想告诉你,通过这样,模式2可以取代模式1,并解决模式1的时间问题。
预先加载,在顾客购买之前,就将商品缓存到自提柜,这样,自提柜就和便利店就很相似了。这样就能充分利用自提柜的空间(缓存)。Android手机中有很多优化软件,在你内存占满时会让你清理内存,而这与Android的内存策略背道而驰,因为当内存占满时内存才是被充分利用的,这样能提高命中率,如果需要加载新的数据,那么Android会自动舍弃些不常用的数据。
使用AI算法对缓存(自提柜中提前加载的货物)进行安排,利用机器学习算法结合用户数据,预测某个自提柜附近的顾客们将会购买的商品,并将这些商品预先缓存好。当用户在电商网站购物时,发现自己想要的商品已经在附近的自提柜中,这样,购物体验就接近便利店了。
一些电商公司有过近似的尝试,但还是离理想模式有差距。
亚马逊是个奇葩公司,总是有很多惊人的想法,其中有一个是擅自派送商品到顾客家,而顾客甚至没有订购,如果顾客觉得这个不是他想要的,可以拒收。这个想法的逻辑和前面提的预先加载是一致的,虽然两者是类似,但是亚马逊这个做法是不可行的,因为它没有缓存,目标是某个用户,这就要求算法得精确到个人,难度太大。而通过缓存(自提柜)的缓冲作用,目标可以扩大为附近的顾客,这样对算法的要求就大大降低。
每年的双十一阿里都搞得风风火火,快递的效率一年比一年高,爆仓的情况已经好了很多,这里的秘诀就是阿里依据AI算法将商品提前缓存到各地的仓库,这样就对物流网络起到了缓冲的作用,同时也减少了用户等待的时间。
仓库也是一种缓存,那么仓库是缓存,自提柜又是什么呢?这其实并不冲突,上面提过了多级缓存这个概念,明显,自提柜是最末端的缓存,而仓库则是上一级缓存,其实仓库本身也是多级缓存,比如北京市朝阳区的仓库是北京市仓库的缓存,北京市仓库又可能是河北省仓库的缓存。阿里做的这个工作已经非常接近了,但是还停留在解决具体问题的阶段,没有去抽象升华。
菜鸟驿站,这个看着非常相似,实则差十万八千里。它沿袭了阿里轻资产,分流风险,做平台的风格。菜鸟驿站对各个快递代售点没有控制力,体验很差,如果把各个代售点当做缓存,阿里无法对缓存做任何安排。总的来说还不如现在的自提柜。当然它成本低,发展速度快是优点。
顺丰嘿客,似乎是网购体验店与自提柜的合体,发展并不顺利,还没完全摸透意图。不过没有强大的电商无法完全实现理想模式。
有些读者可能会有疑问:这样大肆租店/场地成本一定很高吧?是的,成本确实很高,但你想想,便利店都能支撑起这样的店租,而缓存算法及机制更为先进的理想模式肯定能创造更多价值,所以不用担心。
电商公司及快递公司,怎样能更快地到达理想模式?
发展(收购)便利店,慢慢将货架自提柜化。
将自动售货机与自提柜结合,取代货架,进一步无人化。
利用数据及算法优化便利店缓存(货架/自提柜/自动售货机)上的货品,提高命中率。
链接仓库与自提柜,形成多级缓存,随着自提柜数量的提升,增加仓库的数量。
将物流标准化自动化,进一步提升物流速度和效率。
在少数城市试错。
理想模式不可能完全取代商店,但作为一种理论上更先进模式,我相信它会消灭大部分商店,而商店存在的意义更多将是展示、体验还有服务。
一不小心又写多了,科学并不像大家想象的那么死板,经过理解与抽象,很容易应用到生活和产品中,今天的缓存理论,希望你喜欢。
作者:熵君,公众号/微博:@熵君
本文由 @熵君 原创发布于人人都是产品经理。未经许可,禁止转载。
赞赏是对原创者的最大认可
赞赏2人打赏
收藏已收藏 | 32赞已赞 | 9
产品经理群
运营交流群
数据分析群
文案交流群
Axure交流群
关注微信公众号
大家都在问
9个回答9人关注
13个回答15人关注
8个回答6人关注
8个回答8人关注
43个回答187人关注
16个回答17人关注

我要回帖

更多关于 我要自学网缓存 的文章

 

随机推荐