持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第31天,点击查看活动详情
缓存穿透:
黑客随机生成大量redis不存在的key,跳过了reids,每次查询数据库,造成reids没有起到减轻db的作用,造成缓存穿透。
解决方法:
1、接口实现api的限流,防御ddos、接口频率限制 在网关实现黑名单。
2、从数据库和redis如果都查询不到数据的情况下,将数据库的空值写入到缓存中,加上短时间的有效期(只适合单个key,不适合随机生成不同的key、影响正常key的使用)
3、布隆过滤器
缓存击穿:
热点key:经常使用到的key
在高并发的情况下,当一个热点key过期时,因为访问该key请求过多,多个请求同时发现该缓存key过期,这时候发送同时发送同时查询数据库,同时将数据库内容放入我们的redis缓存里,对我们数据库压力非常大。
解决方法:
1、使用分布式锁,多个请求同时请求,只要谁能获取到锁,谁就能从数据库查询将数据查询结果放入redis中,没有获取到锁的请求先等待,获取到锁的请求将数据写入成功到redis中,通知没有获取到锁的请求从redis获取数据即可(服务器集群)
2、本地锁和分布式锁一样
3、软过期,对热点key设置无限的有效期或者延长时间
缓存雪崩:
指的是redis服务器重启(没有持久化)或者是大量的key集中失效,突然对我们的数据库压力是非常大。
解决方法:
过期时间随机或者设置不一样的过期时间。集群化分摊部署key(hash取余数)
穿透 key不存在
击穿 单个热点key失效,并发查询
雪崩 多个key失效的情况
传统的哨兵集群方式存在那些缺陷?
1、redis的哨兵集群方式,每个节点都保存想通过的同步的数据,可能存在冗余的数据。只能允许一个主的节点,属于中心化的集群。
去中心化集群方式,数据均摊到每个节点。
reids cluster集群 从3.0开始,redis官方去中心化的集群方式。采用hash槽分片的将数据存放到多个不同的redis中。
核心原理:采用hash卡槽,预先分配16384个卡槽,并且将卡槽分配到具体redis的节点,通过key进行crc16(key)%16384=卡槽,可以根据卡槽存到具体redis节点,注意一个卡槽可以存放多个不同的key,只有主节点才会分配卡槽,从节点只能读,所以没有卡槽。
卡槽作用:决定key存放具体的服务器位置,从而实现均摊存放数据。
优点:动态实现扩容和缩容。
每个配置文件内容
daemonize yes #后台启动
protected-mode no ; ## 允许外部访问
port 7005 #修改端口号,从7000到7005
cluster-enabled yes #开启cluster,去掉注释
cluster-config-file 7000nodes.conf #自动生成,不能重复
cluster-node-timeout 15000 #节点通信时间
logfile /usr/rediscluster/redis7005/redis.log
启动我们的redis
/usr/redis/bin/redis-server /usr/rediscluster/redis7000/redis.conf
/usr/redis/bin/redis-server /usr/rediscluster/redis7001/redis.conf
/usr/redis/bin/redis-server /usr/rediscluster/redis7002/redis.conf
/usr/redis/bin/redis-server /usr/rediscluster/redis7003/redis.conf
/usr/redis/bin/redis-server /usr/rediscluster/redis7004/redis.conf
/usr/redis/bin/redis-server /usr/rediscluster/redis7005/redis.conf
/usr/redis/bin/redis-server /usr/rediscluster/redis7006/redis.conf
/usr/redis/bin/redis-server /usr/rediscluster/redis7007/redis.conf
连接一个redis
/usr/redis/bin/redis-cli -h 192.168.212.148 -p 7000
(error) CLUSTERDOWN Hash slot not served 说明没有分配hash槽
/usr/redis/bin/redis-cli --cluster create 192.168.212.148:7000 192.168.212.148:7001 192.168.212.148:7002 192.168.212.148:7003 192.168.212.148:7004 192.168.212.148:7005 --cluster-replicas 1
(replicas 1 表示主从比例1:1)
(建议最好使用服务器的ip地址搭建)
分配我们hash操作
/usr/redis/bin/redis-cli -h 192.168.212.148 -p 7000
修改为Redis的集群方式连接/usr/redis/bin/redis-cli -h 192.168.212.148 -p 7000 –c
(最后加–c 表示集群连接)
/usr/redis/bin/redis-cli --cluster help