八股第四天——redis+MySQL

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实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fufu121380

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值