Java-Redis-基础

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

一、Java-Redis-基础

1.1 基本数据结构

  渐进式rehash - 渐进式rehash会在rehash的同时,保留新旧两个hash结构,如上图所示,查询时会同时查询两个hash结构,然后在后续的定时任务以及hash操作指令中,循序渐进的把旧字典的内容迁移到新字典中。当搬迁完成了,就会使用新的hash结构取而代之。

image.png

渐进式Rehash

image.png

1.2 持久化

image.png

  两种机制全部开启的时候,Redis在重启的时候会默认使用AOF去重新构建数据,因为AOF的数据是比RDB更完整的。

  混合持久化:Redis 4.0 - 将rdb文件的内容和增量的AOF日志文件存在一起。这里的AOF日志不再是全量的日志,而是自持久化开始到持久化结束的这段时间发生的增量AOF日志,通常这部分AOF日志很小;于是在Redis重启的时候,可以先加载rdb的内容,然后再重放增量AOF日志就可以完全替代之前的AOF全量文件重放,重启效率因此大幅得到提升。

image.png

1.3 哨兵Sentinel

image.png

1.4 主从同步

  启动一台slave的时候,他会发送一个psync命令给master ,如果是这个slave第一次连接到master,他会触发一个全量复制。master就会启动一个线程,生成RDB快照,还会把新的写请求都缓存在内存中,RDB文件生成后,master会将这个RDB发送给slave的,slave拿到之后做的第一件事情就是写进本地的磁盘,然后加载进内存,然后master会把内存里面缓存的那些新命名都发给slave。

image.png

1.5 内存淘汰机制

  Redis的过期策略,是有定期删除+惰性删除两种。

public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int MAX_CACHE_SIZE;
 
    public LRUCache(int cacheSize) {
      // 容量为最大值/0.75,即最大负载容量为maxSize
      // accessOrder=true  根据查询排序,即最近被使用的放到后面
      super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
      MAX_CACHE_SIZE = cacheSize;
    }
 
    /**
     * 此方法为钩子方法,map插入元素时会调用此方法
     * 此方法返回true则证明删除最老的因子
    */
    @Override
    protected boolean removeEldestEntry(Map.Entry eldest) {
      return size() > MAX_CACHE_SIZE;
    }
}

LRU算法

1.6 穿透、击穿、雪崩

1.7 Bloom Filter

  布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。
  Bloom Filter跟单哈希函数Bit-Map不同之处在于:Bloom Filter使用了k个哈希函数,每个字符串跟k个bit对应。从而降低了冲突的概率。

image.png

1.8 Redis线程模型

  Redis线程模型:Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器(file event handler)。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型

1.9 高级用法

上一篇下一篇

猜你喜欢

热点阅读