最近有出去面试,问到的知识点较多较杂,然后感觉在面试过程中,老是回答的不好.就是这个知识点我是知道的,但是有一些细节忽略了,或者我知道是怎么回事,但是组织话术的时候老是有问题.咨询了很多大佬之后,都建议采用博客和github来记录自己的这个过程,所以写下这篇总结. 如果有大佬看到,有写的不对的地方,麻烦指出,不尽感激!
话不多说,进入正题.面试回来总结后,发现redis涉及的点还真比较多,所以我先对redis下手了.
-
redis是什么?
redis是使用c语言编写一款开源,高性能的内存数据库,可以用作数据库,缓存,队列.
使用c语言开发,基于内存,所以非常快速,qps能达到10w,是单线程的采用的多路IO复用模式.
支持丰富的数据类型.(String,hash,set,list,sorted set)
支持持久化(aof,rdb).
支持分布式锁.
2. redis为什么这么快?
redis是基于内存的读写,非常迅速.
redis是单线程的,避免了上下文切换.
redis采用的io多路复用IO模型.
redis的数据结构简单,对数据的操作也十分简单.
3. redis数据类型
String ---- 基于key-value value支持字符串和数字.二进制安全,可以存储jpg等.最大存储512M
使用场景: ----
Hash ---- 是一个String的key和value的映射表 ,适合存储对象.
使用场景: 用户信息等.
Set ---- 和list一样是一个列表,实现基于hashtable,无序,无重复.
使用场景: 共同好友,利用唯一性,统计访问网站的ip
List ---- 简单的字符串列表,按照插入顺序排序,双向链表.
使用场景: 最新消息排行等.
SortedSet ---- 和set类似,增加score,可以按照score进行有序排列.实现方式 hashmap 跳跃表.
使用场景: 需要排序的列表.
4. redis使用问题?
缓存一致性: 缓存和数据库中的数据保持一致性.(先更新数据库,再删除缓存)
高可用: 单机宕机导致整个缓存服务崩溃,考虑redis集群和哨兵(实现故障自动转移)
5. 缓存击穿,缓存穿透,缓存雪崩?
缓存击穿: 有key的数据存在,但是由于key刚刚失效,导致请求数据库.
解决方案: 使用互斥锁,比如setnx ,锁住一定时间,用返回值来进行操作,比如当setnx成功时,进行查数据库, 并设置回缓存中,此时其他请 求无法加锁.进行适当的sleep重试, setnx只有在不存在的时候才能成功设置值.
缓存穿透: 没有key的数据存在,导致大量请求会请求到数据库.
解决方案: 1.设置一个集合用于存储一些一定不会存在的key值, 当请求到达时,先通过此集合进行过滤,如果值在集合中存在,就直接返回, 不再进行缓存查找和数据库查找.
2. 使用布隆过滤器(不能删除,占空间. 存在误判几率), 布谷鸟过滤器等
缓存雪崩: 同一时刻有大量key同时失效,导致大量请求会请求到数据库.
解决方案: 1.让key的过期时间不要在同时失效,可以在过期时间上,加上一个随机1-5分钟失效
2. 高并发下,考虑加锁或者队列的方式保证不会有大量请求对数据库进行一次性读写
6. redis和memcached的区别?
存储方式: memcached的数据只存在内存中,没有持久化.而且存储数据基于内存. 而redis有自己的持久化(aof和rdb),断电不会导致数据丢 失,且有部分数据会持久化到硬盘.
数据类型支持: memcached对数据类型的支持简单,只支持简单的key-value,而redis有丰富的数据类型.
value的大小: redis的value可以达到1GB,而memcached只能达到1MB.
底层模型不同: 两者底层实现方式不同,通讯协议也不同.redis自身构建了VM机制,可以大幅减少系统函数调用时间.
7. 淘汰策略:
六种: 1.从设置了过期时间优先淘汰最少使用的数据
2.从设置了过期时间优先淘汰距离过期时间最近的数据.
3.从设置了过期时间随机进行淘汰数据.
4.从所有key中优先淘汰最少使用的数据.
5.从所有key中随机淘汰数据.
6.不淘汰数据
(redis 4.0后新增LFU淘汰策略包括 volitile-lfu 和 allkeys-lfu) :通过统计访问频率 .将访问频率最少的数据进行淘汰.
8. redis的持久化(aof rdb)
rdb:物理持久化,代表某一时间节点时,redis中所有数据得一份快照,把内存中的数据存入dump文件中,定时保存.
工作流程: Redis会以快照'RDB'的形式,将数据持久化到磁盘的二进制文件dump.rdb中.,当redis需要持久化时,redis会fork一个子进程,子进程来将数据写到临时rdb文件中,写完后,将原有的rdb文件进行替换. 好处是copy-on-write.恢复数据时,也是采用fork一个子进程来进行数据恢复.
优点: 适用于数据备份,定时备份,可以随时将数据恢复到不同的版本.
缺点: redis意外宕机时,可能会丢失数据.
aof:逻辑持久化,将数据操作的命令都保存在一个文件中.
工作流程: redis工作时,每一个写命令都会写入aof文件,通过redis的命令可以开启aof持久化,默认的缺省策略是 everysec (如果这时候redis宕机,最多丢一秒数据.碰过一个面试题:如果我一秒数据也不想丢怎么办? 修改aof策略为always,但是及其损耗性能).
优点: 1. 可以做到全程持久化,开启aof后,redis每次的写命令都会放到aof文件中, redis重启后会通过重放aof文件,将数 据恢复到redis关闭前.
2. 因为aof是写入命令,所以aof文件可读性更高.
缺点: 1.因为aof相比于rdb是使用命令重放,所以导致aof的文件会比rdb文件更大
2.aof的恢复速度比rdb慢.
今天先总结到这,继续学习,下次再进行redis主从,哨兵, 集群的总结,希望有大佬看到有写的不对的地方可以帮忙指出,不胜感激!