缓存思路

来源:互联网 发布:台湾ptt评淘宝用语 亲 编辑:程序博客网 时间:2024/04/30 13:36

把网络缓存大致先分为两种:

1、网络数据刷新不频繁的

在此种情况下网络数据数据的频率并不是很高,并且对数据的实时显示要求也不是很高,例如一些电商平台的商品显示列表数据。在这种情况下,数据比如每过1个小时才刷新一次,这样我们就没必要每次都去从网络上请求数据,可给数据设置一个超时值,当然这个超时值应该小于数据刷新的时间,例如如果数据刷新是1小时一次,那么我们可以把缓存的超时值设置成30分钟,10分钟,或者5分钟。这样就会既可以保证数据的快速显示又不会影响用户获得最新的数据。在这种情况下的业务逻辑如下:

[java] view plain copy
  1. if(网络可用){  
  2.     if(本地存在对应缓存&&缓存没有过期&&非刷新操作){  
  3.     返回本地;  
  4.     }else{  
  5.     进行网络请求;  
  6.     存储网络数据到本地;//(可以使用文件或sqllite)  
  7.     返回网络数据;  
  8.     }  
  9. }else{  
  10.     if(刷新操作){  
  11.     提示无网络状态下刷新操作不可用;  
  12.     }else{  
  13.         if(本地存在对应缓存){  
  14.         返回本地缓存  
  15.         }else{  
  16.         返回空;  
  17.         }  
  18.     }  
  19. }  

2、网络数据刷新较频繁的

如果网络数据刷新较为频繁,比如贴吧,说说什么的。就不能用上面所说的缓存机制,因为这种对数据的实时性要求比较高,这种情况下所需要的缓存机制也仅仅是稍微改善一下用户的使用体验,让用户刚刚进来的时候有内容可以看。这种情况下的缓存逻辑如下:

[java] view plain copy
  1. if(网络可用){  
  2.     if(本地存在对应缓存){  
  3.     在界面中先设置本地数据;  
  4.     }  
  5.     发出网络请求。  
  6.     网络请求数据存储到本地。  
  7.     等网络请求结束用新的数据刷新界面。  
  8. }else{  
  9.     if(本地存在对应缓存){  
  10.     在界面中设置本地数据;  
  11.     }else{  
  12.     界面中提示没有数据,或者网络不可用。  
  13.     }  
  14. }  

以上就是较为常用的网络缓存的两种实现思路。另外要说明的就是把网络数据存储到本地的具体技术,可以使用sqllite进行存储,也可以使用文件进行存储,如果使用文件存储建议建立一个文件夹,并且以每个url对应的hashcode码为文件名,这样存储比较清晰,并且计算超时值时可以直接用当前时间减去文件的修改时间就可以了,如果是用sqllite数据库存储,存储的时候应该存储对应的url,时间戳,和内容。

首先要提一下,本文中的缓存指的只是文本缓存。访问服务器使用http请求。

android里面使用缓存的好处:

1.节省流量

2.更快的响应,更流畅的体验。

3.减少http请求,降低服务器负担。

(如果一个应用启动到关闭共发起50次http请求,启用缓存后降低到了30次。我想缓存带来的效益要比你优化数据库表结构什么的优更加直接有效)

 

说到缓存,有几个必须提到的要点。

首先,每个缓存有应该有个id号,这样我们才能找到它或者删除它。

其次,既然是缓存,那必须有一个自己的生命周期或者说是有效期,这样缓存才能保持缓存的不断更新。

 

在android中应该用什么做缓存的id?什么做缓存?最简单直接的是用url做缓存id,用json做缓存内容。

比如请求一个商品id为1的商品信息的url是http://www.xxx.com?gid=1,获得的json数据格式{id:1,name:"一号商品",desc:"商品描述"}。这样下次在发起同样的http请求的时候,就不用从服务器获取数据了,直接根据url从本地找到对应的json即可。这里还有一点没说的就是缓存存储的问题。最简单的方式当然是存数据库,一张表两个字段。一个url,一个json。url设为主键,找缓存就是根据url找json了。

 urljson1http://www.xxx.com?gid=1{id:1,name:"一号商品",desc:"商品描述"}2http://www.xxx.com?gid=2{id:2,name:"二号商品",desc:"商品描述"}3http://www.xxx.com?gid=3{id:3,name:"三号商品",desc:"商品描述"}4http://www.xxx.com?gid=4{id:4,name:"四号商品",desc:"商品描述"}5http://www.xxx.com?gid=5{id:5,name:"五号商品",desc:"商品描述"}

为了让大家更好理解,一直没有说的太多。现在开始讲点复杂的。

刚才说到缓存还应该有个有效期。比如我设定的缓存的有效时间是2个小时。我可以用当前的时间减去上次缓存记录时的时间,看看这个时差是否大于两个小时即可。这样我们不得不修改一下缓存表

 urljsonlastmodified1http://www.xxx.com?gid=1{id:1,name:"一号商品",desc:"商品描述"}13888240292http://www.xxx.com?gid=2{id:2,name:"二号商品",desc:"商品描述"}13888240303http://www.xxx.com?gid=3{id:3,name:"三号商品",desc:"商品描述"}13888240314http://www.xxx.com?gid=4{id:4,name:"四号商品",desc:"商品描述"}13888240325http://www.xxx.com?gid=5{id:5,name:"五号商品",desc:"商品描述"}1388824033

表中的lastmodified就是缓存记录的时间,获取时间的方法System.currentTimeMillis();

 

现在就屡下逻辑:

首先是将要发起一个http请求(get请求),根据这个请求的url去数据库缓存表中查找有没有这条记录。如果没有,发起http请求。如果有,判读是否在有效期内,在有效期内直接使用,不在有效期,发起http请求。


自己对应缓存有效性的逻辑中认为:如果没有网络的情况下,即使缓存超过有效期也视为缓存有效。


除了利用数据库做缓存外还可以利用文件做缓存。

get请求的url作为文件名,请求的内容(如json)写入文件。这里要有些变通。以为文件名不能存在特殊字符所以可以把url进行MD5加密后的字符串作为文件名,写入文件的内容亦可以是json解析后的JavaBean再进行序列化。每个文件都有个最后修改时间,我们可以利用文件的这个属性来判断缓存的有效性。


原创粉丝点击