0
点赞
收藏
分享

微信扫一扫

【redis学习以及常见问题】

Python百事通 2022-03-30 阅读 78

redis

redis持久化

redis 是存储在内存的-是内存型数据库

优点:内存存储快

缺点:断电易消失

解决办法:

  • RDB

    生成一个.rdb快照文件存储在磁盘上,是存储全部内容的。

    触发条件:save(此时线程阻塞处理不了任何请求)bgsave(生成子程序完成请求,可以处理其他情况)或者自动触发,比如:m秒内n次变化进行触发

  • AOF

    记录对redis数据所有的修改操作,发生事故的时候可以吧AOF文件全部执行一遍,来恢复数据。AOF进行重写和更新,好几条设置一个数的操作,最后可能只保存最后一条,因此AOF是只看最新文件。

    写入策略Always:同步写回只要更改就写回,写到硬盘文件中,性能太慢,数据可靠

    Everysec:每秒写回,每一秒内写入内存的缓存区,一秒后再写入磁盘(默认)

    NO:自己操作,十分不可靠

redis缓存内容相关

缓存淘汰机制

  • 先进先出FIFO
  • 最近最少使用LRU
  • 最近最不经常使用LFU

过期删除

  • 主动删除

    设置一个时间,一段时间定时删除,缺点就是当很忙的时候,redis负载比较大

  • 惰性删除

    当访问到某个数据的时候,看看它是否过期,如果过期删除,缺点就是可能有数据很长时间不更新

  • 定期删除

    上述两种结合,平时采用惰性删除,隔一段时间用主动删除

缓存一致

我们的数据比如在mysql中,redis缓存中也存在,当修改和查询同时发生后,我们希望在一段时间后能够返回缓存一致的数据

  • model1-先

缓存击穿

查询一个值,缓存中没有这个值,去数据库要数据

问题:如果对某个值的请求突然加大,redis设置了清理缓存的时间,就只能去数据库找数据

解决:

  • mysql,减少击穿后的直接流量,给它加一个锁
  • redis,首先设置热点数据永不过期,其次可以后台启动异步线程吧数据回填缓存中

缓存穿透

请求一个值,缓存中没有数据库也没有

  • 返回错误,比如查询了为负的id

  • 热点值返回空,为了减少数据库的压力给缓存设置空值

  • 布隆过滤器

    为了减少无效请求,设置个哈希表,用k个哈希函数来计算值,结果只能为0/1存储在哈希表中,当请求过来后再次用哈希函数计算。比较两次计算结果,有所不同则为无效请求。

缓存雪崩

一大批缓存过期了,缓存击穿是一个点,雪崩是多个点

  • mysql,减少击穿后的直接流量,给它加一个锁

  • redis,首先设置热点数据永不过期,其次可以后台启动异步线程吧数据回填缓存中

    分析失效时间,将其分散

    缓存预热,当刚开机的时候可能一大批数据都产生缓存雪崩,因此可以提前加到缓存中。

集群

主从复制

主库-写命令

丛库-读命令

首先我们为主库和丛库设置id和端口号,然后进行握手命令,丛库发送PSYN命令开启数据同步的过程,如果此刻断网,从库再发要发送主库id和偏移量offset(防止主库换人)。主库收到从库信息后判断是全量复制还是断网后复制

全量复制:刚开始的初次复制。过程:主库实行GBSAVE(此刻能够访问的操作),生成RDB文件,从库根据RDB恢复。

主从复制:断网后的恢复。过程:发送主库id和偏移量offset,查看消息队列缓冲区。否则进行全量复制。

哨兵机制

处理主库掉线情况,哨兵监控主从情况,每10秒钟向哨兵系统发送此刻情况,当某个哨兵发现主库异常认定为主观掉线,此时联系其他哨兵链接主库试一试当半数都链接不上,认定为主库客观掉线,选取新的主库出来。

当新选出的主库发送给其他从库新的主库id和ip地址,旧主库重新上线变为从库。

集群cluster

当数据特别多的时候,提供的分布式数据库解决方案,将数据切片。

分片策略:对16384取模,每个节点进行认领曹slot

查询策略:每个节点都存储集群的节点信息,这些信息为元信息。元信息包括各个节点的槽数据,各个节点的主从复制,节点存活状态

元数据的传播:使用gossip协议,周期性隔一段时间进行更新,病毒方式传播

举报

相关推荐

0 条评论