美文网首页
用户体系缓存调整

用户体系缓存调整

作者: LD_X | 来源:发表于2017-10-20 00:34 被阅读9次

APP一般都会保存用户数据(除银行类、政府某些及个别神奇的)
一个调整的过程

1.偏好设置

一开始很多同学都会喜欢使用偏好设置,存取通过Key,刚开始比较简单的情况下。简单的APP偷懒做法,不是很推荐,如需使用Key统一定义。
KV

2.YYCache

KV.
V直接对象

3.归档(接口稳定下修改,后期接口变动调整新增,无法满足后修改成数据库),但当时不记得什么原因,没有使用YYCache而使用了归档。

然后归档这边由于用户单例类赋值的问题(新增字段无法加入,删除文件再次写入存在风险,查看备注时这么写,具体那时候忘了,总之是新增属性,从接口取数据赋值存值有问题,有时候无法保存成功),然后修改成数据库缓存,兼容处理

image.png

4.数据库+伪单例

 + (instancetype)shareInstance {
    @synchronized(self) {
         if (instance == nil) {
             instance = [[UserProfile alloc] initWithSqlite];
             pthread_mutex_init(&(instance->lock), NULL);
         }
    }
     return instance;
 }

why伪单例?
数据库使用WHC_ModelSqliteKit
数据库模型映射,线程安全,模型层级,加密(注意不加密和加密不兼容,无法无缝过渡),问题是需要移除后再添加,不然会重复。

image.png
new方法创建一个或多个新实例,虽然这个实例一直没有使用,也没有赋值给给instance,instance也是正常的,项目也可以正常使用,迭代了十几个版本,但是今天才注意到这个无限创建了实例。发现了必须要改一下。

5.数据库+单例

image.png

存在问题

1.切换用户单例需要销毁
      解决线程dispatch_once线程的dispatch_once_t *predicate设置成0,就会再次执行。线程设置成0,实例置空,登录成功以后强制调用一次,防止get方法判断时会生成一次。+ (void)signOut里调用cleanShare.
image.png
2.数据库new方法没法改(数据库new方法以后重新赋值本地数据库的数据,单例重新读取本地数据,赋值无效)
        1.第三方库不推荐改动,影响后来者使用
        2.pod管理,项目类无法引用
        3.调度也不行,总要让他创建吧  
        那就创建吧,我把内存实例都占了呗,单例写法完整版,看上图。
3.allocWithZone方法,
    苹果说是历史原因的方法,但是确实是因为他,占了个新内存,新对象实例。然后重写以后,内存我占了,init以后,重新读取,把原来赋值的属性都清掉了,读取了上次数据库的数据,so不同步,临时字典保存,反转。临时解决一下。
    解决看下图。通过临时值保持,注意模型有数组,最好注释数组类型(名词忘了)。NSArray <YxModel*>* XXX; 解析映射。
image.png

由于开始支持门店和代理商登录,后期可能支持品牌商,忽悠API映射字典的缓存,省去一些兼容麻烦(坑吧),每个版本的映射修改,不需要再做什么兼容,根据plist文件读取。

续:上面数据库+单例的2.3问题思考一下会发现一个问题,数据库是数据库,单例是单例,为啥这么紧密?APP退出保存不行吗?
所以最后只有在APP退出时保存,就没有这些问题了。注意数据库只是为了下次打开的读取,单例是用户数据在APP打开后的读取,其实有时候不需要缓存那么多,就如,没网你上什么APP?。。。开个玩笑,夸张了一点点。。。缓存还是要做的,能多做点就多做点。

image.png

5.数据库部分迁移。原本是默认目录,添加uid目录

首先思考有二个方案,结合项目,发现原来表主键没设置,设置新组件的话,会自动更新掉原来主键,可以设置成不更新,但是下个版本具体有没有更新又不确定,在不影响用户为前提的情况下,只是使用1方案,当然可以在其他表外加添加uid字段(也没啥用)
1.用户表主键uid+uid目录
2.用户表+其他表一个uid字段
WHC_ModelSqliteKit库上添加了一个新方法(https://github.com/LDXu/WHC_ModelSqliteKit
做了修改自动处理兼容

+ (NSDictionary *)whc_SqlitePathAutoHandle {
    NSString *member_id = [UserProfile backMember_id];
    NSString *value = [WHC_ModelSqlite defaultPath];
    NSString *key = member_id.length?[NSString stringWithFormat:@"%@%@/", [WHC_ModelSqlite defaultPath], member_id]:value;
    return @{key: value};
}

+ (NSString *)whc_OtherSqlitePath {
    return [NSString stringWithFormat:@"%@UserProfile_v3.3.0.sqlite", [WHC_ModelSqlite defaultPath]];
}

外加一个3.4.0版本的兼容处理


image.png

相关文章

  • 用户体系缓存调整

    APP一般都会保存用户数据(除银行类、政府某些及个别神奇的)一个调整的过程 1.偏好设置 一开始很多同学都会喜欢使...

  • uni-app多个账号切换登录

    一、缓存用户信息 1. 用户登录成功后缓存下用户的账号,token等一些能识别出用户的信息 2.缓存用户信息的时候...

  • 详解积分体系搭建全过程,让你的会员运营不再难

    积分体系,又称用户成长体系、用户激励体系、会员体系等等(下文统称为积分体系),本质是平台通过激励手段,引导用户做出...

  • Mybatis的缓存

    一 Mybatis缓存体系图 Mybatis缓存的基础实现是perpetualCache,但是mybatis利用装...

  • 日访问量百亿级的应用如何做缓存架构设计

    微博日活跃用户1.6亿+,每日访问量达百亿级,面对庞大用户群的海量访问,良好架构且不断改进的缓存体系具有非常重要的...

  • 新浪微博应对日访问量百亿级的缓存架构设计

    微博日活跃用户1.6亿+,每日访问量达百亿级,面对庞大用户群的海量访问,良好的架构且不断改进的缓存体系具有非常重要...

  • 搭建用户成长体系--读书笔记

    《引爆用户增长》--读书笔记 第五章--搭建用户成长体系 1、什么是用户成长体系 1.1 用户成长体系的定义 ...

  • 用户成长体系分析(1):概述

    目录前言一、用户成长体系的意义二、如何设计用户成长体系1、设计原则1)从用户角度出发2)经验体系的分离3)体系应该...

  • 趣头条用户激励体系分析

    用户激励体系是用户运营体系关键的一部分,通过用户激励体系,可以触发用户发生关键行为,完成用户价值的提升,还可以进行...

  • 用户体系

    一.纬度 由于公司不同时期侧重发展方面不同,所以侧重的纬度也会不一样。现阶段我们的目的是提高用户的活跃度。目前...

网友评论

      本文标题:用户体系缓存调整

      本文链接:https://www.haomeiwen.com/subject/jkxmuxtx.html