32个java面试考点:高并发架构基石 - 缓存

知识点汇总

 

一、缓存类型

1.1 本地缓存

就是进程中的缓存,比如在jvm堆中,最简单可以使用LRUMap来实现,也可以使用Ehcache来实现。

优点:内存访问,没有远程开销,性能最好。

缺点:受单机容量,内存较小,无法扩展。

1.2 分布式缓存

优点:提供良好的水平扩展能力,支持大容量 。

缺点:远程请求,性能不如本地缓存。

1.3 多级缓存

本地缓存+分布式缓存;本地缓存存储最热点数据,其他热点数据交给分布式缓存。

 

二、淘汰策略

FIFO:先入先出

LRU:最近最少使用

LFU:最近使用频率最低

 

三、Memcache

3.1 特点

  1. 多线程
  2. 异步IO
  3. KV存储
  4. 内存存储,没有持久化

3.2 内存结构

MC会把内存分为不同类型的slab(深绿),每种类型的slab会保存不同大小的对象 ,每个slab分成同等大小(1MB)的page(浅绿),每个page划分许多的chunk(橙色),chunk就是用来保存实际对象的空间,不同类型slab的chuuk大小是不同的,保存对象时会根据对象的不同大小来选择最合适的chunk来存储,来减少空间浪费。

3.2 钙化问题

问题描述:初始用户数据大小300字节,内存产生大量的384字节的chunk,后期用户增加字段,产生部分768字节大小的chunk,由于LRU剔除策略会经常剔除768字节的chuuk,导致MC剔除率升高,命中率降低,这就是MC钙化问题。

解决办法:

  1. 开启MC的auto move机制,每十秒调整slab;
  2. 也可以分批重启MC缓存,不过要注意重启时要进行一定时间的预热,防止雪崩的问题;
  3. 另外,使用MC时提前计算数据的使用长度,调整group 已获得最恰当的设置,避免内存的大量浪费。

3.3 失效与剔除机制

失效:设置失效期,过期数据会被清除,清除策略采用延迟失效,即当再次使用数据时检查是否失效。

剔除:容量存满时进行剔除,剔除方式:

  1. 剔除过期key
  2. LRU(最近最少使用)策略

3.4 使用限制

  1. key小于250B
  2. value小于1MB
  3. 过期时间小于30天
  4.  

四、Redis

4.1 特点

  1. 单线程异步IO
  2. 支持持久化
  3. 多数据结构 
  4. 主从模式

4.2 数据结构

Redis内部使用字典(dictht)来存储不同类型的数据,字典有一组dictEntry组成,每一个dictEntry都有指向key、value的指针和指向下一个dictEntry的指针next组成。在Redis中,所有的对象都被封装成了redisObject,内部包括type(对象类型)和encoding(存储方式)。

五种数据结构(type):

  1. string:存储通过SDS实现,类似于java中的ArrayList。
  2. hash:通过ziplist和hashtable实现,当hash表中所有的key和value长度都小于64字节,且键值对的数量都小于512个时使用ziplist,否则使用hashtable。
  3. list:通过ziplist(压缩链表)和linkedlist(双链表)实现,。
  4. set:通过intset和hashtable实现,当集合中的元素数小于512,且所有数据类型都是数值类型时,使用intset,否则使用hashtable。
  5. zset(sorted set):通过ziplist和skiplist(跳表),当有序集合中元素数量小于128时,并且所有元素长度都有小于64字节时,使用ziplist,否则使用skiplist。

编码方式(encoding):

  1. raw
  2. int
  3. hashtable
  4. zipmap
  5. linkedlist:插入操作复杂度地,但内存开销很大,地址不连续,容易产生内存碎片
  6. ziplist:存储在连续的内存上,存储效率高,不利于修改操作,适合较少数据
  7. intset
  8. quicklist:3.2版本后,双向无环链表,每个节点都是一个ziplist。

内存分配:

Redis将内存分为小、大、巨大划分范围,并在范围内划分许多内存块,将数据按照大小最合适进行分配,较少内存碎片。

4.3 功能

  1. bitmap:按bit位来存储信息,来实现布隆过滤器的功能。
  2. hyperLog:提供不精确的去重统计功能,比较适合做大规模数据的去重统计。
  3. geospatial:保存地理位置,用于位置计算,或根据半径计算位置等。
  4. pub/sub:订阅/发布功能,实现简单的消息队列。
  5. pipeline:批量执行一组指令,一次返回全部结果,减少频繁应答。
  6. lua脚本:可以执行lua脚本。
  7. 事务:串行执行命令,保证全部执行,命令失败不会回滚,而是会继续执行下去。

4.4 数据持久化

介绍:

RDB:将数据集以快照方式写入磁盘,实际操作是通过fork子进程执行的,采用二进制压缩存储。

AOF:是以文本日志的形式,记录Redis处理的每一次写入、删除操作。

两者区别:

RDB:

  1. 将整个文件数据保存在单一文件中,比较适合做灾备;
  2. 缺点是保存文件之前如果宕机,这段时间的数据会丢失,保存快照时可能会导致这段时间服务不可用。

AOF:

  1. 对日志的写入操作使用追加模式,有灵活的同步策略,支持每秒同步,每次修改同步和不同步;
  2. 缺点是相同规模的数据集,AOF比RDB要大。
  3. 运行效率要慢于RDB

4.5 数据主从

采用 redis cluster方式进行主从配置。

4.6 key失效机制

redis key可以设置过期时间,过期之后,可以采用主动删除和被动删除结合的方式。

  1. 主动删除:定期主动删除
  2. 被动删除:访问时被动删除

4.7 淘汰策略

  1. voltite-lru:针对设置了失效期的key,LRU剔除。
  2. voltite-ttl:针对设置了失效期的key,最小生存时间剔除。
  3. voltite-random:针对设置了失效期的key,随机剔除。
  4. allkeys-lru:针对所有key,LRU剔除。
  5. allkeys-random:针对所有key,,随机剔除。
  6. no-eviction:不剔除,容量满时,再存储对象会返回异常,但是已经存储的key可以继续读取。

4.8 4.0、5.0版本新特性

  1. 5.0版本的stream是一个支持多播,也就是一写多读的消息队列
  2. 4.0的模块机制实现定制功能扩展等

 

五、缓存常见问题

 

考察点

 

手机扫码登录

fastdfs文件下载显示正确的文件名和文件大小

redis实现分布式锁

redis bitmap实现布隆过滤器

5、主从读写分离、多从库、多端口实例,cluster集群部署支持水平扩展

6、使用sorted set实现消息队列

分布式锁使用set nx实现,px设置超时时间,详细百度

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值