2025.03.19面试总结(一)

中软:
1:redis的缓存击穿是怎么回事儿?怎么预防?
缓存击穿就是当某一个热点Key在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,导致数据库存在被打挂的风险。
        预防手段:
(1)加互斥锁:当大量请求进来之后,只有第一个请求可以获得锁并阻塞其他请求,此时该亲求查询数据并将结果写入到redis里面之后释放锁,后续的请求就都会从redis中获取结果。
(2)给缓存设置永不过期或者通过后台线程去根本更新缓存的过期时间。

        ----延申:
        redis的雪崩和穿透:
        redis的雪崩是指的是大面积的缓存过期或者失效的情况下,请求直接访问数据库,造成数据库宕机,跟雪崩的场景一样
预防方法:
(1)配置redis集群,避免出现的单个redis出现问题而导致所有的redis都不能用
(2)对接口请求进行限流
(3)给缓存的过期时间加上随机数,随机设置缓存的失效时间
(4)针对热点数据的缓存设置永不失效

       redis的穿透指的是在缓存中大量的key根本不存在,直接导致请求落在数据库上,导致数据库宕机
预防方法:|
(1)对请求传入的参数进行校验,不合法的参数直接抛异常
(2)针对缓存中没有的key(无效的key),我们可以将这无效的key先存入缓存中,但是缓存的过期时间可以设置的短一点。
(3)通过布隆过滤器;我们先将数据库的数据预加载到布隆过滤器中,这样请求进来的时候我们先判断请求的key是否存在于布隆过滤器中,如果不存在直接报错,存在的话接着走下面的业务代码。(布隆过滤器:布隆过滤器它实际上是一个很长的二进制向量和一系列随机映射函数)


2:分布式锁的概念
        分布式锁一般用于分布式集群,并发操作共享资源的数据安全问题
        分布式锁的几种实现方式:
(1)手动实现:通过setnx命令来实现
                      给锁加上过期时间,来预防死锁问题;给锁延长过期时间来预防所释放后的并发问题
                      set lockname value EX timeout NX
(2)通过redis的分布式锁来实现(
Redission:基于看门狗机制,实现锁过期时间的刷新)
                基于 Lua 脚本语言实现的,可以保证操作的原子性。           

          加锁请求:
                 如果key不存在,说明锁没有被占用,则直接执行加锁逻辑。获取锁成功
                 如果key存在:判断hash中的field是否存在
                 如果存在,说明是当前持有锁的线程,再次加锁,此时 将value值 +1,表示重入次数+1
                 如果不存在,说明不是持有锁的线程的操作,那么就获取锁失败。
          释放锁请求:           
                 如果key不存在,说明没有锁,啥事不干。
                 如果key存在:判断hash中的field是否存在
                 如果存在,说明是当前持有锁的线程,则将当前的重入次数-1,即 将value-1
              判断减1后的值 :
                 > 0 , 只是刷新锁的过期时间
                 <=0 , 释放锁,del key
                 如果不存在,说明不是锁的持有者,不进行任何操作。
        可能存在的问题:如果redis挂了,锁就没用了;这个时候就需要配置redis主从集群。
(3)通过zookeeper来实现(这块不熟悉,后面补)
3.优化方面
        数据库查询优化:
        (1)给必要的查询字段加上索引,通过explain命令来查看该查询时候有被优化
        (2)分库分表(并发量大时分库,单表数据量大时分表)
        (3)读写分离,提高性能
        (4)设置缓存机制
        接口耗时性能优化:
        (1)批量处理数据
        (2)确认索引起效,优化索引结构
        (3)对于调用的请求做异步处理
        (4)预处理,相当于提前加载数据,放到缓存中
        (5)深分页
        (6)接口拆分(垂直拆分和水平拆分)
        (7)微服务架构或者做负载均衡
        (8)..........(后续了解了写上去)
        


                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值