分享redis基础知识(七)

93 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第31天,点击查看活动详情

image.png

缓存穿透:

黑客随机生成大量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