Java-Redis-进阶

2021-12-08  本文已影响0人  GIT提交不上

一、Java-Redis-进阶

1.1 SDS(动态字符串)

struct sdshdr{
 int len;
 int free;
 char buf[];
}
image.png

1.2 skiplist(跳跃表)

  每一个节点的层数(level)是随机出来的,而且新插入一个节点并不会影响到其他节点的层数,因此,插入操作只需要修改节点前后的指针,而不需要对多个节点都进行调整,这就降低了插入操作的复杂度。

image.png image.png
int zslRandomLevel(void) {
    int level = 1;
    while ((random()&0xFFFF) < (ZSKIPLIST_P * 0xFFFF))
        level += 1;
    return (level<ZSKIPLIST_MAXLEVEL) ? level : ZSKIPLIST_MAXLEVEL;
}

  直观上期望的目标是50%的概率被分配到Level 1,25%的概率被分配到Level 2,12.5%的概率被分配到Level 3,以此类推。每一层的晋升率都是 50%Redis 跳跃表默认允许最大的层数是32

1.3 Redis慢日志

# 命令执行耗时超过 5 毫秒,记录慢日志
CONFIG SET slowlog-log-slower-than 5000
# 只保留最近 500 条慢日志
CONFIG SET slowlog-max-len 500
# 查看
SLOWLOG get 5

1.4 bigKey

--bigkeys -i 0.01

1.5 fork耗时严重

# 上一次 fork 耗时,单位微秒
latest_fork_usec:59477
image.png

1.6 缓存一致性问题

  先删缓存,再更新数据库:先删除缓存,数据库还没有更新成功,此时如果读取缓存,缓存不存在,去数据库中读取到的是旧值,缓存不一致发生。

image.png

  延时双删的方案的思路是,为了避免更新数据库的时候,其他线程从缓存中读取不到数据,就在更新完数据库之后,再sleep一段时间,然后再次删除缓存

image.png

  先更新数据库,再删除缓存:更新数据库成功,如果删除缓存失败或者还没有来得及删除,那么,其他线程从缓存中读取到的就是旧值,还是会发生不一致。

image.png image.png

1.7 其他

一个架构师的缓存修炼之路

上一篇 下一篇

猜你喜欢

热点阅读