知识点汇总
一、缓存类型
1.1 本地缓存
就是进程中的缓存,比如在jvm堆中,最简单可以使用LRUMap来实现,也可以使用Ehcache来实现。
优点:内存访问,没有远程开销,性能最好。
缺点:受单机容量,内存较小,无法扩展。
1.2 分布式缓存
优点:提供良好的水平扩展能力,支持大容量 。
缺点:远程请求,性能不如本地缓存。
1.3 多级缓存
本地缓存+分布式缓存;本地缓存存储最热点数据,其他热点数据交给分布式缓存。
二、淘汰策略
FIFO:先入先出
LRU:最近最少使用
LFU:最近使用频率最低
三、Memcache
3.1 特点
- 多线程
- 异步IO
- KV存储
- 内存存储,没有持久化
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钙化问题。
解决办法:
- 开启MC的auto move机制,每十秒调整slab;
- 也可以分批重启MC缓存,不过要注意重启时要进行一定时间的预热,防止雪崩的问题;
- 另外,使用MC时提前计算数据的使用长度,调整group 已获得最恰当的设置,避免内存的大量浪费。
3.3 失效与剔除机制
失效:设置失效期,过期数据会被清除,清除策略采用延迟失效,即当再次使用数据时检查是否失效。
剔除:容量存满时进行剔除,剔除方式:
- 剔除过期key
- LRU(最近最少使用)策略
3.4 使用限制
- key小于250B
- value小于1MB
- 过期时间小于30天
四、Redis
4.1 特点
- 单线程异步IO
- 支持持久化
- 多数据结构
- 主从模式
4.2 数据结构
Redis内部使用字典(dictht)来存储不同类型的数据,字典有一组dictEntry组成,每一个dictEntry都有指向key、value的指针和指向下一个dictEntry的指针next组成。在Redis中,所有的对象都被封装成了redisObject,内部包括type(对象类型)和encoding(存储方式)。
五种数据结构(type):
- string:存储通过SDS实现,类似于java中的ArrayList。
- hash:通过ziplist和hashtable实现,当hash表中所有的key和value长度都小于64字节,且键值对的数量都小于512个时使用ziplist,否则使用hashtable。
- list:通过ziplist(压缩链表)和linkedlist(双链表)实现,。
- set:通过intset和hashtable实现,当集合中的元素数小于512,且所有数据类型都是数值类型时,使用intset,否则使用hashtable。
- zset(sorted set):通过ziplist和skiplist(跳表),当有序集合中元素数量小于128时,并且所有元素长度都有小于64字节时,使用ziplist,否则使用skiplist。
编码方式(encoding):
- raw
- int
- hashtable
- zipmap
- linkedlist:插入操作复杂度地,但内存开销很大,地址不连续,容易产生内存碎片
- ziplist:存储在连续的内存上,存储效率高,不利于修改操作,适合较少数据
- intset
- quicklist:3.2版本后,双向无环链表,每个节点都是一个ziplist。
内存分配:
Redis将内存分为小、大、巨大划分范围,并在范围内划分许多内存块,将数据按照大小最合适进行分配,较少内存碎片。
4.3 功能
- bitmap:按bit位来存储信息,来实现布隆过滤器的功能。
- hyperLog:提供不精确的去重统计功能,比较适合做大规模数据的去重统计。
- geospatial:保存地理位置,用于位置计算,或根据半径计算位置等。
- pub/sub:订阅/发布功能,实现简单的消息队列。
- pipeline:批量执行一组指令,一次返回全部结果,减少频繁应答。
- lua脚本:可以执行lua脚本。
- 事务:串行执行命令,保证全部执行,命令失败不会回滚,而是会继续执行下去。
4.4 数据持久化
介绍:
RDB:将数据集以快照方式写入磁盘,实际操作是通过fork子进程执行的,采用二进制压缩存储。
AOF:是以文本日志的形式,记录Redis处理的每一次写入、删除操作。
两者区别:
RDB:
- 将整个文件数据保存在单一文件中,比较适合做灾备;
- 缺点是保存文件之前如果宕机,这段时间的数据会丢失,保存快照时可能会导致这段时间服务不可用。
AOF:
- 对日志的写入操作使用追加模式,有灵活的同步策略,支持每秒同步,每次修改同步和不同步;
- 缺点是相同规模的数据集,AOF比RDB要大。
- 运行效率要慢于RDB
4.5 数据主从
采用 redis cluster方式进行主从配置。
4.6 key失效机制
redis key可以设置过期时间,过期之后,可以采用主动删除和被动删除结合的方式。
- 主动删除:定期主动删除
- 被动删除:访问时被动删除
4.7 淘汰策略
- voltite-lru:针对设置了失效期的key,LRU剔除。
- voltite-ttl:针对设置了失效期的key,最小生存时间剔除。
- voltite-random:针对设置了失效期的key,随机剔除。
- allkeys-lru:针对所有key,LRU剔除。
- allkeys-random:针对所有key,,随机剔除。
- no-eviction:不剔除,容量满时,再存储对象会返回异常,但是已经存储的key可以继续读取。
4.8 4.0、5.0版本新特性
- 5.0版本的stream是一个支持多播,也就是一写多读的消息队列
- 4.0的模块机制实现定制功能扩展等
五、缓存常见问题
考察点
手机扫码登录
fastdfs文件下载显示正确的文件名和文件大小
redis实现分布式锁
redis bitmap实现布隆过滤器
5、主从读写分离、多从库、多端口实例,cluster集群部署支持水平扩展
6、使用sorted set实现消息队列
分布式锁使用set nx实现,px设置超时时间,详细百度