主要功能点
主动缓存,无异常情况下只从redis中取数据,不走mysql
列表的分类、排序
缓存数据中区分正在进行、未开始、已结束
分析sql语句触发redis缓存系统中数据的更新
对关联数据进行同步更新(例 广告中的数据里面有商品信息,当商品发生改变时,触发把广告中的相关商品数据内容也进行同步更新)
针对单个表的缓存数据重建功能
原理
列表分页及排序主要依赖于redis 的sort 命令,通过配置来触发是否启用,是否同步关联数据等
数据存储结构
用redis 的 set (集合) 来保存ID号索引
用redis 的 hash(哈希) 来保存内容数据。Data为json结构化内容数据,同时hash内存入其它元素保存排序用的排序字段和内容
例: hset(data, json_encode($data)) hset(price, 100) hset(sort, 1)
Key的组成
一个表中正在进行的主索引的key set结构 (taobao_item 表示数据表表名, cate 表示存储的是主索引)
redisCache:taobao_item:cate
未开始ID号索引Key set结构
redisCache:taobao_item: notstartids
已结束ID号索引 key set结构
redisCache:taobao_item:endids
正在进行的分类索引Key set结构 cate_id表示分类的字段,最后面的1表示分类号,一个分类一个索引
redisCache:taobao_item:cate:cate_id:1
正在进行的内容Key (hash结构) 222表示是内容的ID号
redisCache:taobao_item:content:222
未开始的内容Key (hash结构)
redisCache:taobao_item:notstart:22
已结束的内容Key (hash结构)
redisCache:taobao_item:end:22
排序命令
Sort redisCache:appmarket_app_commend:cate:cate_id:2
BY redisCache:appmarket_app_commend:content:*->sort:sort
GET redisCache:appmarket_app_commend:content:*->data
DESC
LIMIT 0 10
BY用于排序的Key,因为是hash结构,所以采用元素sort作为排序依据
GET 获取主内容,hash元素中的data 存储的是主内容的json结构化数据
LIMIT 分页,与mysql 的 limit作用方法一至
DESC 存在的话,为倒序,不存在的话为顺序
同步关联表数据
通过配置里的callback_sync_content 方法例如通过sql分析。监控到taobao_item发生update操作,因为设置了关联同步更新taobao_ad中的商品信息,所以触发,先从tabao_ad中通过回调配置中的get_id方法传入taoboa_item的主键ID号,得到tabao_ad中的主键ID,然后执行taobao_ad缓存的updateContent方法,从而实现关联更新taboa_ad中的相关数据
当数据过期时转存到已过期区域
基于用户触发
hash key也就是内容key会有一个过期时间,当内容key过期,但索引key中是没法设定过期的
当用户获取列表时,rediscache要对data进行处理(json_decode),同时,因为已过期的内容key不存在,通过sort命令获取的列表中存在false值,正常情况下是一个json结构化数据,
如果存在false值,触发转存动作,对索引key进行同样的sort,但不传get参数,得到ID号索引数据,从而对比得到需要删除的ID号,先删除正在进行中区域的索引数据
同时触发add动作,由rediscache再次存储数据,会自动根据源数据来进行入缓存作用
未开始数据转存正在进行中原理与正在进行的数据转存到已结束中
未开始的数据,添加时存入未开始内容key和未开始排序Key中,同时给未开始内容Key设定过期时间,也就是什么时候开始!
使用sort获取未开始列表的方法,因为未开始索引里的ID号是不会过期的,但内容有过期时间,所以一对比就知道哪个ID的数据由未开始转入已开始
在未开始索引key中删除,同时再次触发添加数据,由add方法自动判断数据存入的区域
支持多条件(AND)
因为每个条件都有一个索引key
分析多条件,得到多个索引key
使用sinterstore命令把多个索引key做交集并存入一个临时key中
使用这个临时索引key取列表数据命令原型 sinterstore key key1 key2 key3
缓存数据的重建
因为在rediscache中触发更新比较频繁,所以有可能会出现缓存数据与源数据不一致的情况
所以在管理后台做了缓存的重建功能
有待优化注意事项
数据重建时会自动加锁,防止多个操作,同时rediscache中这个表的缓存失效,自动从回调中的源数据中取数据
转存功能目前是基于用户触发,以后可以做异步,减少中间过程,优化用户获取列表的速度
因为rediscache做主动缓存内存代价太高,同时为了更高的性能,所以希望在缓存系统中存在的数据都是有效数据,尽量把该下架的下架,该删除的删除 (下架和删除,数据都会在rediscache中清除)
Redis做持久化,避免redis挂掉的情况下,需要对全部的数据做重建
第三方的解决方案还是你自己实现的类?
自己实现的,目前在测试环境中跑跑,还没上线使用!