0%

Redis 和 MySQL 数据不一致性

参考地址

具体如何去解决还得结合业务去综合考虑。

下面几个方式可能比较通用

1. 双删法

写流程

  1. 先删除缓存
  2. 写更新数据库
  3. 再次删除缓存 => 避免在第二步的时候有读请求访问数据库,然后把旧的值写入到缓存中
Read more »

Phoenix 异步创建索引

当表数据量过大的时候,创建索引会报错,可以修改服务器端的 hbase.rpc.timeout,默认是1分钟,可以自定义时间。也可以异步创建索引,通过在语句后面添加async 关键字。

需要注意的是:

  1. 异步创建索引只支持全局索引
  2. 执行async语句只是第一步,还需要通过执行jar包来保证索引真正的建立
Read more »

Redis中的跳表

参考网址1
参考网址2

redis 数据类型 zset 实现有序集合,底层使用的数据结构是跳表。

源码在 src/t_zset.c 文件中,相关数据结构的定义在 src/server.h 文件中。(4.0版本)

元素有序的时候,如果是数组,可以通过二分查找来提速;如果是链表,如何提速? => 跳表,插入/删除/搜索 都是O(logn)

Read more »

HBase WAL日志

参考网址1
参考网址2

每一个region servser维护一个或多个Hlog(1.X版本可以开启multiwal),而不是每一个region一个日志。这样不同 region(可能来自来自不同 table) 的日志会混在一起,这样做的目的是不断追加单个文件相对于同时写多个文件而言,可以减少磁盘寻址次数,因此可以提高对 table 的写性能。带来的麻烦是,如果一台 region server 下线,为了恢复其上的 region,需要将 region server 上的 log 进行拆分,然后分发到其它 region server 上进行恢复。

HLog文件基本结构

HLog中日志单元WALEntry表示一次行级更新的最小追加单元(图中红色/黄色小方框)。它由两部分组成:HLogKey和WALEdit,HLogKey中包含多个属性信息,包含table name、region name、sequenceid等;WALEdit用来表示一个事务中的更新集合,一次行级事务可以原子操作同一行中的多个列。上图中WALEdit包含多个KeyValue。

Read more »

JVM SafePoint

在多线程环境下,为了能正确回收不再使用的内存,安全回收需要满足以下两个条件

  1. 堆内存的变化是受控制的,最好所有的线程都停止
  2. 堆中的对象是已知的,不再使用的对象都可以找到

∴ JVM 是在 SafePoint 点时才进行回收,所谓 SafePoint 即Java线程执行到某个位置时,JVM能够安全可控地回收对象

如何到达 SafePoint

Read more »