汉中网站建设开发wordpress add
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:57
当前位置: 首页 > news >正文
汉中网站建设开发,wordpress add_theme_support,网站开发流程书籍,wordpress 评论框 模板目的
1.快速展示#xff0c;提升体验
已经加载过的数据#xff0c;用户下次查看时#xff0c;不需要再次从网络#xff08;磁盘#xff09;加载#xff0c;直接展示给用户
2.节省用户流量#xff08;节省服务器资源#xff09;
对于较大的资源数据进行缓存#xf…目的
1.快速展示提升体验
已经加载过的数据用户下次查看时不需要再次从网络磁盘加载直接展示给用户
2.节省用户流量节省服务器资源
对于较大的资源数据进行缓存下次展示无需下载消耗流量同时降低了服务器的访问次数节约服务器资源。图片
3.离线使用。
用户浏览过的数据无需联网可以再次查看。部分功能使用解除对网络的依赖。百度离线地图、图书阅读器无网络时允许用户进行操作等到下次联网时同步到服务端。
4.记录用户操作
草稿对于用户需要花费较大成本进行的操作对用户的每个步骤进行缓存用户中断操作后下次用户操作时直接继续上次的操作。已读内容标记缓存帮助用户识别哪些已读。搜索记录缓存
方法
NSUserDefault 简单数据快速读写 Property list (属性列表)文件存储 Archiver (归档) SQLite本地数据库 CoreData
数据持久化方式分类
内存缓存
定义
对于使用频率比较高的数据从网络或者磁盘加载数据到内存以后使用后并不马上销毁下次使用时直接从内存加载。
案例
iOS系统图片加载——[UIImage imageNamed:“imageName”] 网络图片加载三方库SDWebImage
磁盘缓存
定义
将从网络加载的、用户操作产生的数据写入到磁盘用户下次查看、继续操作时直接从磁盘加载使用。
案例
用户输入内容草稿缓存如评论、文本编辑 网络图片加载三方库SDWebImage 搜索历史缓存
缓存策略(常见缓存算法)
FIFOFirst in First Out
实现原理 FIFO 先进先出的核心思想如果一个数据最先进入缓存中则应该最早淘汰掉。类似实现一个按照时间先后顺序的队列来管理缓存将淘汰最早访问的数据缓存。 缺点
没有考虑时间最近和访问频率对缓存命中率的影响。对于用户较高概率访问最近访问数据的情况命中率会比较低。
LFULeast Frequently Used
实现原理 LFU 最近最少使用算法是基于“如果一个数据在最近一段时间内使用次数很少那么在将来一段时间内被使用的可能性也很小”的思路。记录用户对数据的访问次数将访问次数多的数据降序排列在一个容器中淘汰访问次数最少的数据。
缺点 LFU仅维护各项的被访问频率信息,对于某缓存项,如果该项在过去有着极高的访问频率而最近访问频率较低,当缓存空间已满时该项很难被从缓存中替换出来,进而导致命中率下降。
LRU (LeastRecentlyUsed)
实现原理
LRU 是一种应用广泛的缓存算法。该算法维护一个缓存项队列,队列中的缓存项按每项的最后被访问时间排序。当缓存空间已满时,将处于队尾,即删除最后一次被访问时间距现在最久的项,将新的区段放入队列首部。 缺点 LRU算法仅维护了缓存块的访问时间信息没有考虑被访问频率等因素当存在热点数据时LRU的效率很好但偶发性的、周期性的批量操作会导致LRU命中率急剧下降。例如对于VoD视频点播系统用户已经访问过的数据不会重复访问等场景。
LRU-K (LeastRecentlyUsed)
实现原理 相比LRU其核心思想是将“最近使用过1次”的判断标准扩展为“最近使用过K次”。具体来说它多维护一个队列记录所有缓存数据被访问的历史。仅当数据的访问次数达到K次的时候才将数据放入缓存。当需要淘汰数据时LRU-K会淘汰第K次访问时间距当前时间最大的数据。 缺点 需要额外的空间来存储访问历史维护两个队列增加了算法的复杂度提升了CPU等消耗。
2QTwo queues
实现原理
2Q算法类似于LRU-2不同点在于2Q将LRU-2算法中的访问历史队列注意这不是缓存数据的改为一个FIFO缓存队列即2Q算法有两个缓存队列一个是FIFO队列一个是LRU队列。 缺点 需要两个队列但两个队列本身都比较简单2Q算法和LRU-2算法命中率、内存消耗都比较接近但对于最后缓存的数据来说2Q会减少一次从原始存储读取数据或者计算数据的操作。
MQMulti Queue
实现原理
MQ算法根据优先级访问频率将数据划分为多个LRU队列其核心思想是优先缓存访问次数多的数据。 缺点 多个队列需要额外的空间来存储缓存维护多个队列增加了算法的复杂度提升了CPU等消耗。
iOS端可供选择的数据持久化方案
内存缓存
实现内存缓存的技术手段包括苹果官方提供的NSURLCacheNSCache还有性能和API上比较有优势的开源缓存库YYCache、PINCache等。
磁盘缓存
NSUserDefault
适合小规模数据弱业务相关数据的缓存。
keychain
Keychain是苹果提供的带有可逆加密的存储机制普遍用在各种存用户名、密码的需求上。另外Keychain是系统级存储还可以被iCloud同步即使App被删除Keychain数据依然保留用户下次安装App可以直接读取通常会用来存储用户唯一标识串。所以需要加密、同步iCloud的敏感小数据一般使用Keychain存取。
文件存储 Plist一般结构化的数据可以Plist的方式去持久化 archiveArchive方式可以存取遵循协议的数据比较方便的是存取使用的都是对象不过中间的序列化和反序列化需要花费一定的性能可以在想要使用对象直接进行磁盘存取时使用。 Stream指文件存储一般用来存图片、视频文件等数据
数据库存储
数据库适合存取一些关系型的数据可以在有大量的条件查询排序类需求时使用。 Core Data苹果官方封装的ORM(Object Relational Mapping) FMDBgithub最受欢迎的iOS sqlite 封装开源库之一 WCDB微信团队在自己使用的sqlite封装基础上的开源实现具有ORM(Object Relational Mapping)的特性支持iOS、Android。 Realm由Y Combinator孵化的创业团队开源出来的一款跨平台iOS、Android移动数据库。
应该用哪种缓存方案
根据需求选择
简单数据存储直接写文件、key-value存取即可。需要按照一些条件查找、排序等需求的可以使用sqlite等关系型存储方式。敏感性高的数据加密存储。不希望App删除后清除的小容量数据用户名、密码、token存keychain。
内存、磁盘数据持久化方案对比
可选方案详解
特性
属性 名称 delegateobj从cache移除时通知代理 countLimit存储数限制 costLimit存储空间开销值限制不精确 evictsObjectsWithDiscardedContent(自动回收废弃内容没看到这个属性的使用场景 方法 使用key同步存、取、删 删除所有内容
实现
NSCacheEntry内部类将key-value转换成改实体用来实现双向链表存储结构 key键 value值 cost开销 prevByCost上个节点 nextByCost下个节点
NSCacheKey对存取使用的key的封装用于实现存取使用不支持NSCopy协议的object
value存取使用的key的值
_entriesNSDictionary使用它以键值对形式存取NSCacheEntry实例 _head双向链表头节点链表按cost升序排序setObject触发costLimit/countLimit trim时从根节点开始删除 NSLock实现读写线程安全
TMCache
TMCache 最初由 Tumblr 开发但现在已经不再维护了。TMMemoryCache 实现了很多 NSCache 并没有提供的功能比如数量限制、总容量限制、存活时间限制、内存警告或应用退到后台时清空缓存等。TMMemoryCache 在设计时主要目标是线程安全它把所有读写操作都放到了同一个 concurrent queue 中然后用 dispatch_barrier_async 来保证任务能顺序执行。它错误的用了大量异步 block 回调来实现存取功能以至于产生了很大的性能和死锁问题。 由于该库很久不再维护不做详细对比。
PINCache
Tumblr 宣布不在维护 TMCache 后由 Pinterest 维护和改进的一个缓存SDK。它的功能和接口基本和 TMCache 一样但修复了性能和死锁的问题。它同样也用 dispatch_semaphore 来保证线程安全但去掉了dispatch_barrier_async避免了线程切换带来的巨大开销也避免了可能的死锁。
特性
PINCachingprotocal 属性
名称
方法
同步/异步使用key存、取、删、判断存在、设置ttl时长、存储空间消耗值同步/异步删除指定日期之前的数据磁盘缓存指创建日期同步/异步删除过期数据同步/异步删除所有数据
PINMemoryCache 属性
totalCost已经使用的总开销costLimit开销内存使用限制每次赋值时触发trim)ageLimit统一生命周期限制每次赋值时触发trimGCD timer循环触发)ttlCache是否ttl配置此项获取数据只会返回生命周期存活状态的数据removeAllObjectsOnMemoryWarningremoveAllObjectsOnEnteringBackground将要/已经添加、移除缓存对象block监听将要/已经移除缓存所有对象block监听已经接收内存警告、已经进入后台block监听
方法
同步/异步删除数据到指定的cost以下同步/异步删除在指定日期之前的数据继续删除数据到指定的cost以下trimToCostLimitByDate同步/异步遍历所有缓存数据
内部实现
通过NSMutableDictionary保存需要缓存的数据通过额外的NSMutableDictionary来保存createdDates创建时间、accessDates最近访问时间、costLimit、ageLimit等信息使用互斥锁保证多线程安全使用PINOperationQueue实现异步操作setObject触发costLimit trim时对accessDates进行排序实现LRU策略
PINDiskCache
prefix缓存名前缀cacheURL缓存路径urlbyteCount硬盘已存储数据大小byteLimit最大硬盘存储空间限制默认50M每次赋值时触发trim)使用时注意丢数据时不清楚为什么ageLimit同PINMemoryCache默认30天writingProtectionOptionttlCache同PINMemoryCacheremoveAllObjectsOnMemoryWarning同PINMemoryCacheremoveAllObjectsOnEnteringBackground同PINMemoryCache将要/已经添加、移除缓存对象block监听同PINMemoryCache将要/已经移除缓存所有对象block监听同PINMemoryCache已经接收内存警告、已经进入后台block监听同PINMemoryCache支持对key进行自定义编码和解码默认移除特殊字符 . : / %支持对数据进行自定义序列化和反序列化默认NSKeyedArchiver需要遵守NSCoding协议
方法
lockFileAccessWhileExecutingBlockAsync、synchronouslyLockFileAccessWhileExecutingBlock执行完所有文件写操作后回调blockfileURLForKey获取指定文件的fileUrl 同步/异步删除数据到指定的cost以下同PINMemoryCache同步/异步删除在指定日期之前的数据继续删除数据到costLimit以下同PINMemoryCache同步/异步遍历所有缓存数据同PINMemoryCache
内部实现
通过PINDiskCacheMetadata保存数据信息createdDate、lastModifiedDate、size、ageLimit初始化时加载所有文件的metadata保存在一个NSMutableDictionary中通过fileKey存取读取文件获取createdDate、lastModifiedDate、size等信息回写metadatasetxattr、removexattr、getxattr存储ageLimit信息回写metadatatrimDiskToSize按照文件大小降序排序删除先删大文件trimDiskToSizeByDate按最近修改时间升序排序先删较长时间未访问的LRUtrimToDate删除创建日期在指定日期之前的文件按修改时间倒序使用互斥锁保证多线程安全使用PINOperationQueue实现异步操作对accessDates进行排序实现LRU策略
PINCache 属性
diskByteCount设置diskCachebyteCountdiskCache磁盘缓存memoryCache内存缓存
方法
仅有初始化方法及 的实现
实现
二级缓存实现先取内存后取磁盘取磁盘同时更新内存使用同一个PINOperationQueue实现异步操作PINOperationGroup来实现内存缓存和磁盘缓存结束回调
实现
PINOperationQueueasync任务通过自定义的PINOperationQueue实现
pthread_mutex PTHREAD_MUTEX_RECURSIVE(添加operation线程安全)dispatch_queue: DISPATCH_QUEUE_SERIAL并发数1时直接使用串行队列执行使用串行队列保证对信号量数据操作是安全的修改并发数时修改信号量数量 DISPATCH_QUEUE_CONCURRENT执行block中的耗时操作dispatch_group阻塞当前线程用来实现 waitUntilAllOperationsAreFinisheddispatch_semaphore并发数量控制并发数为大于1时使用。
PINOperationGroup
dispatch_group_enter、dispatch_group_leave、dispatch_group_notify来回调group结束block
LRU淘汰
每次设置新的object时超出costLimit部分根据访问时间倒序删除
线程安全
pthread_mutex_lock 互斥 PINOperationQueue 实现多线程队列任务
YYCache
大神郭曜源开源的一个内存缓存实现YYCache是对标PINCache实现的实现了PINCache大部分的能力同时做了一些针对性性能优化。 内存缓存相对于 PINMemoryCache 来说去掉了异步访问的接口尽量优化了同步访问的性能用 OSSpinLock pthread_mutex_t互斥锁来保证线程安全。另外缓存内部用双向链表和 NSDictionary 实现了 LRU 淘汰算法。 磁盘缓存支持设置文件尺寸阈值来控制写磁盘还是存数据库。
特性
YYMemoryCache
属性 name名称 totalCount缓存数 totalCost已经使用的总开销 countLimit缓存数限制并非严格限制GCD timer定时触发后台线程trim costLimit开销内存使用限制并非严格限制GCD timer定时触发后台线程trim ageLimit统一生命周期限制并非严格限制GCD timer定时触发后台线程trim autoTrimInterval定时触发trim时长默认5s shouldRemoveAllObjectsOnMemoryWarning shouldRemoveAllObjectsWhenEnteringBackground releaseOnMainThread是否允许主线程销毁内存键值对默认NO注意指定该值为YES后YYMemoryCache的缓存只有回到主线程才把缓存的对象销毁即执行release操作。 releaseAsynchronously是否异步线程销毁内存键值对默认YES 已经接收内存警告、已经进入后台block监听 方法 同步使用key存、取、删、判断存在、设置每个存储内存开销值 同步/异步删除所有缓存根据releaseOnMainThread、releaseAsynchronously决定 同步trim删除数据到指定的count以下 同步trim删除数据到指定的cost以下从tail开始移除即移除最近未访问数据 同步trim删除在指定日期之前的数据 内部实现 _YYLinkedMapNode链表节点key、value、pre、next、cost、timeCACurrentMediaTime最近访问时间信息保存 _YYLinkedMap最终使用_YYLinkedMap的节点通过链表方式执行增、删、改操作 dic、totalCost、totalCount、headMRU、tail(LRU)、releaseOnMainThread、releaseAsynchronously insertNodeAtHead bringNodeToHead removeNode removeTailNode removeAll 链表最新访问的放在头结点便于执行trim操作直接从尾节点开始删除 使用pthread_mutex_t互斥锁保证线程安全 使用DISPATCH_QUEUE_SERIAL执行增加obj缓存触发costLimit情况下的trim任务
YYDiskCache
属性 name缓存名 path缓存路径 inlineThreshold控制保存sqlite或文件的阈值大于该值存文件默认20KB customArchiveBlock、customUnarchiveBlock对数据进行自定义序列化和反序列化默认NSKeyedArchiver需要遵守NSCoding协议 customFileNameBlock根据key名称对文件名做自定义 countLimit同YYMemoryCache默认无限制 costLimit同YYMemoryCache这里指真实的磁盘存储大小默认无限制 ageLimit同YYMemoryCache默认无限制 freeDiskSpaceLimit磁盘可缓存最小剩余空间限制默认0 autoTrimInterval同YYMemoryCache默认60s errorLogsEnabled错误日志 方法 同步/异步使用key存、取、判存、删数据 同步/异步删除所有数据 异步删除所有数据并在block回调进度 同步/异步获取totalCount、totalCost 同步/异步trimToCount、trimToCost、trimToAge 为指定object绑定extendedData 内部实现 使用dispatch_semaphore_t信号量设置为1作为锁使用了 使用dispatch_queue_tDISPATCH_QUEUE_CONCURRENT异步线程执行trim、CRUD等 注意这导致所有的异步操作回调block都是在异步线程没在主线程 _globalInstancesNSMapTable缓存了所有初始化的diskCache实例key strongvalue weak YYKVStorage 属性 path缓存路径 typeYYKVStorageTypeFile、YYKVStorageTypeSQLite、YYKVStorageTypeMixed errorLogsEnabled 方法 保存key-value数据 根据key删除key-value数据删除超过指定size的数据访问时间倒序删除每次删除16个删除指定时间之前的数据同删除数据到整体储存空间到指定size内删除数据到整体储存数量到指定count内删除所有数据 使用key取数据 判断指定key是否存在数据获取存储数量获取存储占用size 实现 内部使用selite存取数据 删除所有数据先移动到指定的trash目录下然后后台删除trash目录移动文件比删除文件更快 DISPATCH_QUEUE_SERIAL后台删除trash
YYCache
属性 name名称 memoryCache内存缓存 diskCache磁盘缓存 方法 同步/异步使用key存、取、判存、删除数据 同步/异步删除所有数据 异步删除所有数据并在block回调进度 实现 二级缓存先取内存再取磁盘 异步操作直接使用globalQueue执行了。
实现
磁盘存取封装YYKVStorage执行文件读写、seqlite操作具体的存取操作交给它完成内存LRU淘汰每次设置新的object时超出costLimit部分根据访问时间倒序删除借助链表 线程安全pthread_mutex_lock 互斥 实现内存缓存线程安全dispatch_semaphore_t信号量设置为1作为锁使用了
内存缓存方案对比
性能
YYCache的读写性能均较为优秀。NSCache和PINCache各有优劣。
plist文件
plist全名Property List属性列表文件它是一种用来存储串行化后的对象的文件属性列表文件的扩展名为.plist 因此通常被称为plist文件。文件是xml格式的。plist文件通常用于储存用户设置也可以用于存储捆绑的信息。
平时的info.plist就是一个plist文件
#import Foundation/Foundation.hint main(int argc, const char * argv[]) {autoreleasepool {// 创建一个NSMutableDictionary对象NSMutableDictionary *plistData [[NSMutableDictionary alloc] init];// 添加一些示例数据到plistData字典中[plistData setObject:John Doe forKey:Name];[plistData setObject:johnexample.com forKey:Email];[plistData setObject:30 forKey:Age];// 获取文件路径可以根据需要修改保存路径NSArray *paths NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *documentsDirectory [paths objectAtIndex:0];NSString *plistPath [documentsDirectory stringByAppendingPathComponent:data.plist];// 写入plist文件[plistData writeToFile:plistPath atomically:YES];NSLog(Plist文件已创建并写入成功%, plistPath);}return 0;
} 这样的j话我们就能通过打印的文件目录来查看写入的东西了
- 上一篇: 汉中网站建设公司做旅游网站的
- 下一篇: 汉中网站制作今天《新闻联播》回放
相关文章
-
汉中网站建设公司做旅游网站的
汉中网站建设公司做旅游网站的
- 技术栈
- 2026年03月21日
-
汉中网站建设费用微信商城小程序怎么开发
汉中网站建设费用微信商城小程序怎么开发
- 技术栈
- 2026年03月21日
-
汉中商城网站建设传奇新开网
汉中商城网站建设传奇新开网
- 技术栈
- 2026年03月21日
-
汉中网站制作今天《新闻联播》回放
汉中网站制作今天《新闻联播》回放
- 技术栈
- 2026年03月21日
-
杭seo网站建设排名深圳网站建设品牌策划
杭seo网站建设排名深圳网站建设品牌策划
- 技术栈
- 2026年03月21日
-
杭州 高端网站建设 推荐有关做详情页的参考网站
杭州 高端网站建设 推荐有关做详情页的参考网站
- 技术栈
- 2026年03月21日
