黑客攻防 Redis缓存穿透

192 阅读2分钟

想必正在看这边文章的你,不知道07的周杰伦有多强,这首死亡风车听听看! www.bilibili.com/video/BV1ii…

问题背景:

频繁访问mysql,建立数据库连接

解决方案:

分库分表
mysql集群
加缓存Redis

Redis缓存:(数据同步)

缓存穿透是无法避免,降低穿透机会

黑客攻击:

用一个固定的非法请求攻击数据库,可以采用null值缓存的解决方案
但如果用uuid攻击,这时候Redis不断缓存null,Redis内部的Lru,Lfu算法就会失效。布隆过滤器应用而生!

布隆过滤器:

内存中存储查询的id,过滤出正常的id值查询mysql,但如果id很多,会导致**内存紧张**
    
    内存紧张:
    布隆算法
        可以通过一定的错误率换取空间,id通过开源Hash算法或者自定义Hash算法得到散列值,填入Byte数组,
        由于hash碰撞导致的错误率一般是可以接受的,
        毕竟byte真的非常节省内存啊!!1GB内存可以存百亿的byte数诶亲!
        这样如果id算出来在byte位数组中存在,那就放行到redis,否则拒绝连接哦
        
        加大数组长度和增加Hash函数的个数(多个函数结果同时作为约束条件,但也不是越多越好,极端情况下,所有hash函数的计算结果刚好填满Byte位数组,就是100%碰撞)
    

缓存穿透:包括雪崩和击穿 缓存雪崩:缓存在某个时候大量失效,大量数据涌入mysql 原因:

    1.redis的数据有效期一致(设置每条数据随机有效期)
    
    2.reids挂了,(分布式缓存,切片集群/副本集群)

缓存击穿:只缓存了一条数据,还失效了 Redis集群的hash一致性算法是什么 解决集群扩展问题,hash取模,要从原来已经分发的redis中取出数据重新取模,扩容比较费时费力

用Hash环可以解决 (hash(ip)%2)的32次方,落在[0,2的32次方)区间内,数据转到最靠近的顺时针redis,这样每个redis都有不同的顺序数据,新增结点就只需要顺时针的最近redis之间取模数据

问题:数据倾斜 解决:增加一模一样的现存的虚拟结点

解决缓存击穿:

分布式锁

    共享资源
    资源互斥
    多任务环境

基于mYsql Insert的分布式锁 insert后释放,其他可以继续争夺

基于zookeeper的分布式锁【分布式一致性服务框架 最终一致性 弱一致性】

reids的分布式锁:原因是支持有效期!