1.介绍一下Redis的缓存击穿、穿透和雪崩?以及对应怎么解决?
- 缓存击穿:某个热点数据过期,大量请求从数据库中读取,容易被高并发请求冲垮。
- 互斥锁:保证同一时间只有一个业务线程更新缓存;不给热点数据设置过期时间
- 缓存穿透:用户访问的数据既不在缓存中也不在数据库中,大量这样的请求,数据库就会压力过大。
- 非法请求的限制;缓存空值或者默认值;使用布隆过滤器迅速判断数据是否存在,避免经过数据库。
- 缓存雪崩:大量数据同时过期或者redis故障宕机
- 大量数据同时过期:均匀设置过期时间;互斥锁;双key策略;后台更新缓存
2.如何使用redis实现分布式锁?
- 使用SETNX命令,只有插入的key不存在才插入,若存在就失败,插入成功表示加锁成功;
- 解锁就是将key删除,保证执行操作的客户端就是加锁的客户端,加锁要设置unique_valu,解锁时判断锁的unique_value是否为加锁客户端,是才将lock_key键删除
- 给锁设置过期时间,以免客户端拿到锁后异常,锁无法释放,可以指定EX/PX
3.介绍一下redis的Zset的底层数据结构?
跳表:
- 一种多层的有序链表,能快速定位数据
- 节点:元素值,元素权重,后向指针(指向前一个结点,为了倒叙查找的方便)
- Zset数组中的一个属性是level,一个level数组就代表跳表的一层,定义了指向下一个节点的指针和跨度
- 相邻两层节点的数量比例理想为2:1,此时查询复杂度为O(logN)
- 创建节点时,会生成范围【0-1】的随机数,小于0.25就增加一层,继续生成随机数,随机数大于0.25结束,最终确定该节点的层数
4.如何保证数据库和缓存的一致性?
- Cache Aside
- Read/Write Through
- Write Behind
- 2PC或者Paxos
5.Redis有哪些数据结构?
- SDS
- 链表
- 压缩列表
- listpack
- quicklist
- 哈希
- 整数集合
- 跳表
6.MySQL的默认隔离级别是什么?
可重复读
7.重复读和幻读的区别是什么?
幻读是指事务开始以后,其他事务插入删除数据影响了此事务的读。
重复读就是一个事务从一开始到执行结束,所看到的任何一条数据都是和一开始一致的。
8.什么是前缀索引?
局部索引,对文本的前几个字符建立索引,索引小,查询效率更高。
9.什么是最局部索引左匹配原则?
- 联合索引,按照最左优先的方式进行索引的匹配
- 不遵循,索引失效
10.事务的持久性是如何实现的?
通过redolog实现