在移动互联网时代,为了尽可能的为用户节省流程以及提高用户体验,对HTTP请求设计缓存机制是必不可少的,当前主流缓存策略有以下几种:
- 系统缓存
iOS系统为NSURLRequest提供了多种缓存策略,可以通过设置cachePolicy来设置请求的缓存策略
- NSURLRequestUseProtocolCachePolicy // 默认的缓存策略(取决于协议)
这个是默认的缓存机制,当系统第一次请求该网络资源的时候,本地缓存中并不存在该资源文件,于是请求了整个资源文件,并且缓存该文件的缓存信息。
当第二次请求该网络资源的时候,系统会在请求头中添加"if-Modified-Since"字段或者”if-None-Match“字段,将缓存信息携带上去,服务端根据缓存信息判断该资源是否发生了变化,如果没有变化,则返回304。 - NSURLRequestReloadIgnoringLocalCacheData
该策略在每次请求资源时都会忽略本地的缓存内容,去请求最新的资源。 - NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未实现
- NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData
忽略缓存,重新请求 - NSURLRequestReturnCacheDataElseLoad
有缓存就用缓存,没有缓存就重新请求 - NSURLRequestReturnCacheDataDontLoad
该策略有缓存就适应缓存,没有缓存就不发请求,当做请求出错处理。当本地并不存在对应的缓存资源时,回调接口就会报错,错误码-1008 - NSURLRequestReloadRevalidatingCacheData // 未实现
iOS 系统使用NSURLCache单例类来管理网络请求的缓存。对于app来说,由于使用了同一个缓存对象来管理缓存,所以不同的网络请求都是使用同一个缓存来管理的。
- 客户端缓存
有时候系统的缓存策略不能满足客户端需求的时候,需要自己去做一些缓存处理,我们大概是这么设计的。
在本地创建一个数据库,存储某个请求的最后一次缓存。在调用这个请求的时候,有一个cacheCompletion和requestCompletion,前者用于回调最近一次成功请求的缓存,后者用于回调真实请求的数据,用于解决网络接口请求慢导致不显示的问题。 - CDN缓存
请求大资源的一些CDN服务器会做一个本地缓存,如果缓存没有过期,则直接返回缓存的数据。如果缓存过期,在向源节点请求数据。 - 服务器缓存
主要是通过服务端redis缓存等机制实现的