timzaak / blog

8 stars 1 forks source link

缓存处理 #9

Closed timzaak closed 5 years ago

timzaak commented 7 years ago

一级缓存

放本机内存,对jvm来讲就是放heap堆,然后加个时间戳的HashMap。

二级缓存

其实也是全局缓存,主要存共享Session等,多台机子都用到的场景。

缓存结构

目前已知的大都是KV形式的,顶多在存取V的api加上自动序列化。

当然还有队列,BitMap 等。但不太常用。

缓存问题

方案介绍一

方案介绍二

Redis 分布式

scalacache提供了优秀的cache api设计,但目前还不成熟,只能用它的PUT,GET函数, 也没解决上述问题,需要在它基础上再封装。目前看来,上述问题解决主要是参数设置、二次缓存和锁的使用,而且这些都是并发量上去后的问题。

另外,缓存在项目的中位置,我觉得应该和 Dao 内。由 Dao 提供统一的数据访问接口,并处理 Cache 是要问题。但这样,会造成一个问题,缓存过来的数据,需要在程序中重新组装一遍,但这个带来了数据一致性的好处。我觉得是可以接受的。

timzaak commented 6 years ago

J2Cache 二级缓存框架,稍微看了一下,到时候估计根据其 cache 接口自己改造 scala cache 吧。

目前的这个 SingleRedis Client 没有实现 ArrayByte, 所以所有序列化都要走String(UTF-8) 再转换成 ArrayByte. for performance! add arraybyte wrapper. then add avro case class transform.

根据最新的 J2Cache 的实现,发现还有一级缓存状态同步的问题。 ehcache 有三套。目前直接用 ehcache 就可以了。

timzaak commented 5 years ago

scalacache 目前已熟。并自带 Bytes 序列化。外加 Flag 设计,看看其思路能不能用来做AB 测试。

timzaak commented 5 years ago

最近看了一篇在 tikv 上实现 redis 接口的文章。初始感觉牛逼,就细细了解了一tikv。 性能上挂靠rocksdb, 牛逼。 从 tikv 接口上看,提供了带有Transcation 可遍历的 分布式 SortedMap 接口。

怪不得文章里的 benchmark 就只放出了 Get Set 的测试。在此基础上封装其他的 redis 数据结构接口,不得xx。

所以这个东西的价值在于工程中依赖的 redis 老代码太多,而 redis 实现 PB 级别的 kv 缓存成本过高。所以做个中间件出来。

假如这样的话。将 redis 接口转化成 sql 语句,直接对接 tidb 上会怎么样。性能会差好几个档次应该。毕竟涉及到sql解析以及更多余的索引+空间使用。