iOS-持久化

news2025/4/27 7:06:58

目的

1.快速展示,提升体验

  • 已经加载过的数据,用户下次查看时,不需要再次从网络(磁盘)加载,直接展示给用户

2.节省用户流量(节省服务器资源)

  • 对于较大的资源数据进行缓存,下次展示无需下载消耗流量
  • 同时降低了服务器的访问次数,节约服务器资源。(图片)

3.离线使用。

  • 用户浏览过的数据无需联网,可以再次查看。
  • 部分功能使用解除对网络的依赖。(百度离线地图、图书阅读器)
  • 无网络时,允许用户进行操作,等到下次联网时同步到服务端。

4.记录用户操作

  • 草稿:对于用户需要花费较大成本进行的操作,对用户的每个步骤进行缓存,用户中断操作后,下次用户操作时直接继续上次的操作。
  • 已读内容标记缓存,帮助用户识别哪些已读。
  • 搜索记录缓存

方法

NSUserDefault 简单数据快速读写
Property list (属性列表)文件存储
Archiver (归档)
SQLite本地数据库
CoreData

数据持久化方式分类

内存缓存

  • 定义

对于使用频率比较高的数据,从网络或者磁盘加载数据到内存以后,使用后并不马上销毁,下次使用时直接从内存加载。

  • 案例

iOS系统图片加载——[UIImage imageNamed:@“imageName”]
网络图片加载三方库:SDWebImage

磁盘缓存

  • 定义

将从网络加载的、用户操作产生的数据写入到磁盘,用户下次查看、继续操作时,直接从磁盘加载使用。

  • 案例

用户输入内容草稿缓存(如:评论、文本编辑)
网络图片加载三方库:SDWebImage
搜索历史缓存

缓存策略(常见缓存算法)

FIFO(First in First Out)

实现原理
FIFO 先进先出的核心思想如果一个数据最先进入缓存中,则应该最早淘汰掉。类似实现一个按照时间先后顺序的队列来管理缓存,将淘汰最早访问的数据缓存。

请添加图片描述
缺点

没有考虑时间最近和访问频率对缓存命中率的影响。对于用户较高概率访问最近访问数据的情况,命中率会比较低。

LFU(Least Frequently Used)

实现原理
LFU 最近最少使用算法是基于“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”的思路。记录用户对数据的访问次数,将访问次数多的数据降序排列在一个容器中,淘汰访问次数最少的数据。请添加图片描述

缺点
LFU仅维护各项的被访问频率信息,对于某缓存项,如果该项在过去有着极高的访问频率而最近访问频率较低,当缓存空间已满时该项很难被从缓存中替换出来,进而导致命中率下降。

LRU (LeastRecentlyUsed)

实现原理:

LRU 是一种应用广泛的缓存算法。该算法维护一个缓存项队列,队列中的缓存项按每项的最后被访问时间排序。当缓存空间已满时,将处于队尾,即删除最后一次被访问时间距现在最久的项,将新的区段放入队列首部。

请添加图片描述
缺点
LRU算法仅维护了缓存块的访问时间信息,没有考虑被访问频率等因素,当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命中率急剧下降。例如对于VoD(视频点播)系统,用户已经访问过的数据不会重复访问等场景。

LRU-K (LeastRecentlyUsed)

实现原理:
相比LRU,其核心思想是将“最近使用过1次”的判断标准扩展为“最近使用过K次”。具体来说它多维护一个队列,记录所有缓存数据被访问的历史。仅当数据的访问次数达到K次的时候,才将数据放入缓存。当需要淘汰数据时,LRU-K会淘汰第K次访问时间距当前时间最大的数据。
请添加图片描述
缺点
需要额外的空间来存储访问历史,维护两个队列增加了算法的复杂度,提升了CPU等消耗。

2Q(Two queues)

实现原理:

2Q算法类似于LRU-2,不同点在于2Q将LRU-2算法中的访问历史队列(注意这不是缓存数据的)改为一个FIFO缓存队列,即:2Q算法有两个缓存队列,一个是FIFO队列,一个是LRU队列。

请添加图片描述
缺点
需要两个队列,但两个队列本身都比较简单,2Q算法和LRU-2算法命中率、内存消耗都比较接近,但对于最后缓存的数据来说,2Q会减少一次从原始存储读取数据或者计算数据的操作。

MQ(Multi Queue)

实现原理:

MQ算法根据优先级(访问频率)将数据划分为多个LRU队列,其核心思想是:优先缓存访问次数多的数据。

请添加图片描述
缺点
多个队列需要额外的空间来存储缓存,维护多个队列增加了算法的复杂度,提升了CPU等消耗。

iOS端可供选择的数据持久化方案

内存缓存

实现内存缓存的技术手段包括苹果官方提供的NSURLCache,NSCache,还有性能和API上比较有优势的开源缓存库YYCache、PINCache等。

磁盘缓存

  • NSUserDefault

适合小规模数据,弱业务相关数据的缓存。

  • keychain

Keychain是苹果提供的带有可逆加密的存储机制,普遍用在各种存用户名、密码的需求上。另外,Keychain是系统级存储,还可以被iCloud同步,即使App被删除,Keychain数据依然保留,用户下次安装App,可以直接读取,通常会用来存储用户唯一标识串。所以需要加密、同步iCloud的敏感小数据,一般使用Keychain存取。

  • 文件存储
    • Plist:一般结构化的数据可以Plist的方式去持久化
    • archive:Archive方式可以存取遵循协议的数据,比较方便的是存取使用的都是对象,不过中间的序列化和反序列化需要花费一定的性能,可以在想要使用对象直接进行磁盘存取时使用。
    • Stream:指文件存储,一般用来存图片、视频文件等数据
  • 数据库存储

数据库适合存取一些关系型的数据;可以在有大量的条件查询排序类需求时使用。

    • Core Data:苹果官方封装的ORM(Object Relational Mapping)
    • FMDB:github最受欢迎的iOS sqlite 封装开源库之一
    • WCDB:微信团队在自己使用的sqlite封装基础上的开源实现,具有ORM(Object Relational Mapping)的特性,支持iOS、Android。
    • Realm:由Y Combinator孵化的创业团队开源出来的一款跨平台(iOS、Android)移动数据库。

应该用哪种缓存方案

根据需求选择:

  • 简单数据存储直接写文件、key-value存取即可。
  • 需要按照一些条件查找、排序等需求的,可以使用sqlite等关系型存储方式。
  • 敏感性高的数据,加密存储。
  • 不希望App删除后清除的小容量数据(用户名、密码、token)存keychain。

内存、磁盘数据持久化方案对比

可选方案详解

特性

  • 属性
    • 名称
    • delegate:obj从cache移除时,通知代理
    • countLimit:存储数限制
    • costLimit:存储空间开销值限制(不精确)
    • evictsObjectsWithDiscardedContent(自动回收废弃内容,没看到这个属性的使用场景)
  • 方法
    • 使用key同步存、取、删
    • 删除所有内容

实现

NSCacheEntry:内部类,将key-value转换成改实体,用来实现双向链表存储结构

    • key:键
    • value:值
    • cost:开销
    • prevByCost:上个节点
    • nextByCost:下个节点

NSCacheKey:对存取使用的key的封装,用于实现存取使用不支持NSCopy协议的object

  • value:存取使用的key的值

_entries:NSDictionary,使用它以键值对形式存取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,避免了线程切换带来的巨大开销,也避免了可能的死锁。

特性:

PINCaching(protocal)
属性

  • 名称

方法

  • 同步/异步使用key存、取、删、判断存在、设置ttl时长、存储空间消耗值
  • 同步/异步删除指定日期之前的数据(磁盘缓存指创建日期)
  • 同步/异步删除过期数据
  • 同步/异步删除所有数据

PINMemoryCache
属性

  • totalCost:已经使用的总开销
  • costLimit:开销(内存)使用限制(每次赋值时,触发trim)
  • ageLimit:统一生命周期限制(每次赋值时,触发trim;GCD timer循环触发)
  • ttlCache:是否ttl,配置此项,获取数据只会返回生命周期存活状态的数据
  • removeAllObjectsOnMemoryWarning
  • removeAllObjectsOnEnteringBackground
  • 将要/已经添加、移除缓存对象block监听
  • 将要/已经移除缓存所有对象block监听
  • 已经接收内存警告、已经进入后台block监听

方法

  • 同步/异步删除数据到指定的cost以下
  • 同步/异步删除在指定日期之前的数据,继续删除数据到指定的cost以下(trimToCostLimitByDate)
  • 同步/异步遍历所有缓存数据

内部实现

  • 通过NSMutableDictionary保存需要缓存的数据,通过额外的NSMutableDictionary来保存createdDates(创建时间)、accessDates(最近访问时间)、costLimit、ageLimit等信息
  • 使用互斥锁保证多线程安全
  • 使用PINOperationQueue实现异步操作
  • setObject触发costLimit trim时,对accessDates进行排序,实现LRU策略

PINDiskCache

  • prefix:缓存名前缀
  • cacheURL:缓存路径url
  • byteCount:硬盘已存储数据大小
  • byteLimit:最大硬盘存储空间限制,默认50M(每次赋值时,触发trim)使用时注意,丢数据时不清楚为什么
  • ageLimit:同PINMemoryCache;默认30天
  • writingProtectionOption:
  • ttlCache:同PINMemoryCache
  • removeAllObjectsOnMemoryWarning(同PINMemoryCache)
  • removeAllObjectsOnEnteringBackground(同PINMemoryCache)
  • 将要/已经添加、移除缓存对象block监听(同PINMemoryCache)
  • 将要/已经移除缓存所有对象block监听(同PINMemoryCache)
  • 已经接收内存警告、已经进入后台block监听(同PINMemoryCache)
  • 支持对key进行自定义编码和解码(默认移除特殊字符 . : / %)
  • 支持对数据进行自定义序列化和反序列化(默认NSKeyedArchiver,需要遵守NSCoding协议)

方法

  • lockFileAccessWhileExecutingBlockAsync、synchronouslyLockFileAccessWhileExecutingBlock:执行完所有文件写操作后回调block
  • fileURLForKey:获取指定文件的fileUrl
    同步/异步删除数据到指定的cost以下(同PINMemoryCache)
  • 同步/异步删除在指定日期之前的数据,继续删除数据到costLimit以下(同PINMemoryCache)
  • 同步/异步遍历所有缓存数据(同PINMemoryCache)

内部实现

  • 通过PINDiskCacheMetadata保存数据信息:createdDate、lastModifiedDate、size、ageLimit;初始化时,加载所有文件的metadata,保存在一个NSMutableDictionary中,通过fileKey存取;
  • 读取文件获取createdDate、lastModifiedDate、size等信息回写metadata;setxattr、removexattr、getxattr存储ageLimit信息,回写metadata
  • trimDiskToSize:按照文件大小降序排序删除,先删大文件
  • trimDiskToSizeByDate:按最近修改时间升序排序,先删较长时间未访问的(LRU)
  • trimToDate:删除创建日期在指定日期之前的文件(按修改时间倒序)
  • 使用互斥锁保证多线程安全:
  • 使用PINOperationQueue实现异步操作
  • 对accessDates进行排序,实现LRU策略

PINCache
属性

  • diskByteCount:设置diskCache,byteCount
  • diskCache:磁盘缓存
  • memoryCache:内存缓存

方法

  • 仅有初始化方法及 的实现

实现

  • 二级缓存实现:先取内存;后取磁盘,取磁盘同时更新内存
  • 使用同一个PINOperationQueue实现异步操作
  • PINOperationGroup来实现内存缓存和磁盘缓存结束回调

实现

PINOperationQueue(async任务通过自定义的PINOperationQueue实现)

  • pthread_mutex PTHREAD_MUTEX_RECURSIVE(添加operation,线程安全)
  • dispatch_queue:
    DISPATCH_QUEUE_SERIAL:并发数1时,直接使用串行队列执行;使用串行队列保证对信号量数据操作是安全的(修改并发数时,修改信号量数量)
    DISPATCH_QUEUE_CONCURRENT:执行block中的耗时操作
  • dispatch_group:阻塞当前线程,用来实现 waitUntilAllOperationsAreFinished
  • dispatch_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、time(CACurrentMediaTime,最近访问时间)信息保存
    • _YYLinkedMap:最终使用_YYLinkedMap的节点通过链表方式执行增、删、改操作
    • dic、totalCost、totalCount、head(MRU)、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_t:DISPATCH_QUEUE_CONCURRENT,异步线程执行trim、CRUD等
    • 注意:这导致所有的异步操作回调block都是在异步线程,没在主线程
    • _globalInstances:NSMapTable缓存了所有初始化的diskCache实例,key strong,value weak
      YYKVStorage
  • 属性
    • path:缓存路径
    • type:YYKVStorageTypeFile、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.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 创建一个NSMutableDictionary对象
        NSMutableDictionary *plistData = [[NSMutableDictionary alloc] init];
        
        // 添加一些示例数据到plistData字典中
        [plistData setObject:@"John Doe" forKey:@"Name"];
        [plistData setObject:@"john@example.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话我们就能通过打印的文件目录来查看写入的东西了请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索容器镜像安全管理之道

邓宇星&#xff0c;Rancher 中国软件架构师&#xff0c;7 年云原生领域经验&#xff0c;参与 Rancher 1.x 到 Rancher 2.x 版本迭代变化&#xff0c;目前负责 Rancher for openEuler(RFO)项目开发。 最近 Rancher v2.7.4 发布了&#xff0c;作为一个安全更新版本&#xff0c;也…

(二)安装部署InfluxDB

以下内容来自 尚硅谷&#xff0c;写这一系列的文章&#xff0c;主要是为了方便后续自己的查看&#xff0c;不用带着个PDF找来找去的&#xff0c;太麻烦&#xff01; 第 2 章 安装部署InfluxDB 1、linux 安装方式如下 通过包管理工具安装&#xff0c;比如apt 和yum直接下载可执…

PHP注册、登陆、6套主页-带Thinkphp目录解析-【强撸项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图主页注册&#xff0c;登陆 phpStudy 设置导数据库项目目录如图&#xff1a;代码部分&#xff1a;控制器前台的首页 其它配套页面展示直接给第二套方案的页面吧第三套…

不会编程也能做数据分析?奥威BI系统就这么任性

BI系统有强大的大数据计算分析能力&#xff0c;能在短时间内完成海量数据智能可视化分析&#xff0c;满足大数据时代企业精细化数据分析要求。早期BI系统要求使用者具备一定IT基础&#xff0c;导致业务无法自主分析&#xff0c;而随着零编程BI系统的出现&#xff0c;业务部门也…

vue中实现列表自由拖拽排序

元素的 dragable 属性设置 为 true &#xff08;文本 图片 链接 的draggable 属性默认为 true&#xff09;则元素可拖放 <template><transition-group class"list"><uldragstart"dragstart(index)"dragenter"dragenter($event, index)…

代码-【3 队列判断是否相同】

前提条件&#xff1a; int QueueEmpty(Queue Q); //判断队列空否&#xff0c;1为空&#xff0c;0为不空 int GetHead(Queue Q,ElemTypes &x); //通过x返回队头元素的值 void EnQueue(Queue &Q.ElemType x); //将新元…

网络—零拷贝

一、前言 磁盘可以说是计算机系统最慢的硬件之一&#xff0c;读写速度相差内存 10 倍以上。所以为了提高系统吞吐量&#xff0c;减少磁盘访问次数&#xff0c;有很多优化措施&#xff0c;比如直接IO、异步IO&#xff0c;但其实还有一种优化策略&#xff0c;那就是——零拷贝&am…

脉冲频率、转速计算(信捷PLC C语言FC编程应用)

转速、线速度、角速度转换和计算关系请查看下面文章链接: 转速/线速度/角速度计算FC_RXXW_Dor的博客-CSDN博客里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力控制相关应用和算法,关于绕线机的绕线算法,大家可以参看…

Python学习笔记-Django框架基础,APP,数据模型,后台管理,路由

一、Django框架简介 Django框架是Python的常用web框架&#xff0c;遵循 MVC 设计模式的框架&#xff0c;采用了MTV的框架模式&#xff0c;即模型M&#xff0c;视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的&#xff0c;即是CMS&…

趋动科技携手星辰天合,推出针对人工智能领域的两款联合解决方案

近日&#xff0c;趋动科技与 XSKY星辰天合联合宣布&#xff0c;结合双方优势能力和产品&#xff0c;携手推出高性能数据湖一站式方案及全协议存算一体化方案&#xff0c;帮助客户简化 AI 工作的 IT 基础设施部署&#xff0c;实现 AI 相关工作更加灵活和便捷。 全协议存算一体化…

银河麒麟服务器安装wireshark

安装 yum install -y wireshark 界面展示 双击打开即可 上图为抓包工作界面

kubernetes持久化存储卷

kubernetes持久化存储卷 kubernetes持久化存储卷一、存储卷介绍二、存储卷的分类三、存储卷的选择四、本地存储卷之emptyDir五、本地存储卷之 hostPath六、网络存储卷之nfs七、PV(持久存储卷)与PVC(持久存储卷声明)7.1 认识pv与pvc7.2 pv与pvc之间的关系7.3 实现nfs类型pv与pvc…

通过cmake工程生成visual studio解决方案

1、前言 visual studio是一个很强大的开发工具&#xff0c;这个工具主要是通过解决方案对我们的源码进行编译等操作。但是我们很多时候拿到的可能并不是一个直接的解决方案&#xff0c;可能是是一个cmake工程&#xff0c;那么这个时候我们就需要通过cmake工程生成解决方案&…

力扣题库刷题笔记75--颜色分类

1、题目如下&#xff1a; 2、个人Pyhon代码实现如下&#xff1a; 第一种思路是取巧&#xff0c;通过计数0、1、2的个数&#xff0c;去替换nums 备注第10行代码在本地可以跑过&#xff0c;但是力扣跑不过&#xff0c;所以就用了第10-16行代码进行替换 第二种思路是通过冒泡排序去…

智慧导诊系统源码:基于springboot+redis+mybatis plus和mysql开发

智慧导诊系统源码 智慧导诊小程序源码&#xff0c;智慧导诊APP源码 人们经常去医院以不知道挂什么科而烦恼&#xff0c;有些病人不方便问又不好意思问。在互联网医院中挂号且又不知该挂什么科&#xff0c;找什么类型的医生&#xff0c;这些不足&#xff0c;给患者带来了极大的…

chrome macos编译

下载工具包 git clone https://chromium.googlesource.com/chromium/tools/depot_tools/gitpwd export PATH"$PATH:/Users/lichengjun/Downloads/chrome_build/depot_tools" mkdir chromium cd chromium 如果想快的话直接: fetch --nohooks --no-history chromium (…

深度学习(二)

目录 一、神经网络 整体架构: 架构细节: 神经元个数的影响: 神经网络过拟合解决: 卷积网络 整体架构: 卷积层 边缘填充 特征尺寸计算 池化层 特征图变化 递归神经网络 一、神经网络 整体架构: 图中分别为输入层、隐层1、隐层2、输出层 通过输入层输入某数值&#xf…

【Java基础教程】(四十四)IO篇 · 上:解析Java文件操作——File类、字节流与字符流,分析字节输出流、字节输入流、字符输出流和字符输入流的区别

Java基础教程之IO操作 上 &#x1f539;本节学习目标1️⃣ 文件操作类&#xff1a;File2️⃣ 字节流与字符流2.1 字节输出流&#xff1a;OutputStream2.2 字节输入流&#xff1a;InputStream2.3 字符输出流&#xff1a;Writer2.4 字符输入流&#xff1a;Reader2.5 字节流与字符…

删除git关联,提交到新的仓库

要删除git关联并创建一个新的git库&#xff0c;可以按照以下步骤操作&#xff1a; 进入你要处理的本地git仓库目录。 删除与远程仓库的关联&#xff1a; git remote remove origin初始化一个新的git仓库&#xff1a; git init添加所有文件到本地仓库&#xff1a; git add …

Redis高级篇(三)

Redis高级篇之最佳实践 Redis键值设计 批处理优化 Redis服务端优化 一、Redis键值设计 1.1、优雅的key结构 Redis的Key虽然可以自定义&#xff0c;但最好遵循下面的几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id] 长度不超过44字节 不…