主从配置

bind作用

  • bind是绑定本地的一个网卡,只有来自这个网卡的请求才会处理,否则拒接连接。

主:
redis.config
bind :ip 本机ip
port:6379 默认端口
按照配置文件启动redis-server config
:可以有多个,从还可以有从,启动方法两种

  1. salve.config
    bind ip 本机ip,可以和 从服务 不属于同一机器
    port 6378 如果是同一机器就必须更改端口
    slaveof 47.100.179.209 6379 配置主的ip和端口号
  2. redis.config
    bind ip 本机ip,可以和从服务不属于同一机器
    port 6378 如果是同一机器就必须更改端口
    按照配置文件启动时,这个服务不是从redis-cli连接从服务
    slaveof 172.17.0.3 6379 现在就变成了从服务,这种比较方便
    slaveof no one

集群配置

  • 最少是3个,可以在不同的电脑,也可以有一部分在同一台电脑,也可以都在同一台电脑
port 7005
bind 本机ip
daemonize yes

pidfile 7005.pid
cluster-enabled yes
cluster-config-file 7000_node.conf
cluster-node-timeout 15000
appendonly yes

按照上面的配置文件做一些改动,端口号和ip,启动6个redis服务。

  • 启动集群
    redis-cli --cluster create ip1:port1 ip2:port2 ip3:port3 ip11:port11 ip22:port22 ip33:port33 --cluster-replicas 1 1 表示主从节点的比值,6个服务,比值为1,就是3主3从。
  • 成功!
  • 连接
    redis-cli -c -h ip -p port -c 表示集群模式,随便连接到一个就可以使用整个redis服务。
    集群将槽分为3部分,操作时通过一个算法来计算在那个节点的槽上,然后链接过去进行操作。

想要指定主从,需要选创建三个主节点,然后依次将从节点加到主节点上–cluster-slave

  • python连接集群
    pip install redis-py-cluster
# 导入类
from rediscluster import RedisCluster

# 构建主节点列表
startup_nodes = [
    {'host':'ip','port':'7000'},
    {'host':'ip','port':'7002'},
    {'host':'ip','port':'7001'},
]
# 连接
r = RedisCluster(startup_nodes=startup_nodes,decode_responses=True)
# 使用这个连接操作。
ret = r.set('name','gg')

哨兵

  1. 监控主服务,可以获取从节点的信息,当有新的从节点也会马上感知,当主服务出现问题会提醒
  2. 当主服务挂掉时,会选一个slave作为master,为挂掉的master代理所有工作,当挂掉的服务修好时,成为slave为master服务。
  • 怎么才算挂掉?

当某个哨兵ping不通自己的master时,会标记为主观下线,然后检测此master的所有哨兵去ping它,如果超过一定数量的哨兵不通时,则标记为客观下线,即挂掉。

配置:一般要配置多个哨兵,防止哨兵挂掉。

port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
daemonize yes

最后的2表示,当有2个哨兵主观认定master失效时,才会下线
./redis-sentinel sentinel.conf

缓存穿透

  • 当请求一个不存在的key时,redis数据库中没有,则到mysql中找,找不到就不会写入redis,当流量大时,mysql会挂

解决方案:

  1. 对key进行校验,是否符合规范,不符合在后端逻辑中就返回错误,或者抛出异常,符合规范(例如要以auth开头,或者长度为5,反正就是一种限制)交给缓存处理
  2. 在redis缓存找不到,在mysql也找不到时,将key写入redis,设置一个默认的值。下次在缓存中就可以找到了。

缓存击穿

  • 当某个key在缓存中没有,但是在数据库中有,并且此时的并发量较大,会造成大量的数据库查询,导致数据库宕机。某一条数据

解决方案:

  1. 设置热点数据永不过期
  2. 加互斥锁,其中一条数据查询,然后写在缓存中,其他访问会等待一小段时间,然后去缓存中就可以查询到了

缓存雪崩

  • 缓存雪崩是指缓存中数据大批量到过期时间,或者redis挂了,而查询数据量巨大,引起数据库压力过大甚至down机。
    在短时间内发生了大量的缓存击穿,就造成了缓存雪崩

解决方案

  1. 热点数据均匀分布在不同机器上,减少压力
  2. 创建redis集群,防止redis挂机产生缓存雪崩
  3. 发生缓存雪崩时,通过加锁的方式去访问数据库,例如某一个key只允许一个线程去查询数据库写缓存
  4. 发生大规模并发之前手动的去加载一下缓存,并设置不同的过期时间
  5. 热点数据每次访问都自动的更新过期时间

redis的持久化

RDB
redis默认使用RDB作为持久化策略,在配置文件中,

save 900 1
save 300 10
save 60 10000

即1次操作会在900s后完成持久化,10次操作会在300秒内持久化,如果10000次操作,那么60秒就会持久化
优缺点:数据量较大时,效率很高,但是在为写入磁盘时断电会造成数据丢失,数据一致性和完整性较差。


AOF

它采用日志的形式来记录每个写操作,并追加到文件中,通过再次执行一边文件中操作即可恢复
优缺点:数据一致性和完整性高,但是文件很大的话效率低。

redis做缓存的双写一致性

  • 延迟双删
    如果在写db之前,有请求访问数据库,然后写缓存,会造成redis删除失败,所以双删保证redis数据。