想必正在看这边文章的你,不知道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的分布式锁:原因是支持有效期!