Redis是什么? 如何数据持久化? 有哪些架构模式? 缓存穿透,缓存雪崩,缓存击穿 是怎么回事,怎么避免?

1.Redis 是什么

Redis是一种支持Key-Value等多种数据结构的存储系统。
可用于缓存,事件发布或订阅,高速队列等场景。
该数据库使用ANSI C语言编写.
支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化.

2.Redis如何持久化数据:

1).通过rdb方式持久化

Redis会定期fork子进程,将保存数据快照至一个rbd文件中,并在启动时自动加载rdb文件,恢复之前保存的数据。
可以在配置文件中配置Redis进行快照保存的时机.

定时执行: Save [seconds][changes]
手动执行: 通过BGSAVE手动触发RDB快照

优点:

1.对性能影响最小. redis在保存RDB快照时会fork出子进程进行,几乎不影响Redis处理客户端请求的效率。
2.恢复效率比aof文件快

缺点:

1.快照是定期生成的,所以在Redis crash时或多或少会丢失一部分数据.
2.如果数据集非常大且CPU不够强(比如单核CPU),Redis在fork子进程时可能会消耗相对较长的时间,影响Redis对外提供服务的能力。

2).通过AOF方式持久化

	把每一个请求都记录在一个日志文件里。在Redis重启时,会把AOF文件中记录的所有写操作顺序执行一遍,确保数据恢复到最新.
	AOF默认是关闭的,如要开启,进行如下配置.
	Appendfsync配置项:
		no:不进行fsync,将flush文件的时机交给OS决定
		always:没写入一条日志就进行一次, sync操作,数据安全性最高,但速度最慢
		everysec: 折中的做法,交由后台线程每秒fsync一次

优点:
1.最安全,在启用appendfsync always时,任何已写入的数据都不会丢失,使用在启用appendfsync everysec也至多只会丢失1秒的数据。AOF文件在发生断电等问题时也不会损坏,即使出现了某条日志只写入了一半的情况,也可以使用redis-check-aof工具轻松修复。
2.AOF文件易读,可修改,在进行了某些错误的数据清除操作后,只要AOF文件没有rewrite,就可以把AOF文件备份出来,把错误的命令删除,然后恢复数据。
缺点:
1.AOF文件通常比RDB文件更大性能消耗比RDB高
2.数据恢复速度比RDB慢

3.Redis有哪些架构模式

1).单机版

缺点:
内存容量有限
处理能力有限
无法高可用
在这里插入图片描述

2).主从复制:

Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。 只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步给从服务器,从而一直保证主从服务器的数据相同。
master写入
slave读取
缺点:
无法高可用
没有解决master写入的压力
在这里插入图片描述

3).哨兵:

Redis sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移。
监控,提醒,自动故障迁移.
优点:
保证高可用
监控各个节点
自动故障迁移
缺点:
主从模式,切换需要时间,丢失数据
没有解决master写的压力
在这里插入图片描述

4).集群proxy型

Twemproxy 是一个 Twitter 开源的一个 redis 和 memcache 快速/轻量级代理服务器;
优点:
1.多种hash算法:MD5
2.支持失败节点自动删除
3.后端 Sharding 分片逻辑对业务透明,业务方的读写方式和操作单个Redis一致
缺点:
增加了新的 proxy,需要维护其高可用.

在这里插入图片描述

5).集群直连型

从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
优点:
1.无中心架构(不存在哪个节点影响性能瓶颈),少了 proxy 层。
2.可扩展性,可线性扩展到 1000 个节点,节点可动态添加或删除
3. 高可用性,部分节点不可用时,集群仍可用。

缺点:
1.资源隔离性较差,容易出现相互影响的情况。
2. 数据通过异步复制,不保证数据的强一致性

在这里插入图片描述

4.什么是缓存穿透?缓存雪崩?缓存击穿?如何避免?

1).缓存穿透:

正常使用缓存的流程是,先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的结果放进缓存.如果数据库的查询对象为空,则不放进缓存.
大量请求查询不存在的数据,而又不生成缓存,那么将对数据库造成压力,甚至击垮数据库,这就是缓存穿透。

解决办法:
缓存空值的方式,也就是从数据库查询对象为空,也放进缓存,只是设定缓存过期的时间比较短,比如设置60秒

2).缓存雪崩:

缓存雪崩,是指在某一个时间段,缓存集中过期失效。
产生原因:
比如双十一 零点迎来一波抢购,商品比较集中地放进了缓存,假设缓存失效时间为1h,那么到了凌晨一点钟,商品缓存都过期了,这样商品的访问查询就落到了数据库上, 对于数据库而言,就会产生周期性的压力波峰.
解决办法:
1.不同商品分类不同的缓存周期
2.同一商品分类,加上一个随机因子.尽可能分散缓存失效时间
3.热门的商品缓存时间长一些,冷门商品缓存时间短一些,节省缓存服务的资源

个人见解:
集中过期倒不是非常致命,比较致命的是缓存服务器的某个节点宕机或者断网,
因为自然形成的雪崩,一定是集中在某个时间段进行缓存,对服务器的压力是周期性 的.而缓存服务节点的宕机,对服务器的压力是不可预知的,可能瞬间把数据库击垮

3).缓存击穿:

缓存击穿,是一种特殊的缓存穿透.比如一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
解决办法:
1.爆点产品缓存永不失效
2.或者将过期时间存在key对应的value里, 如果发现要过期了,通过一个后台的异步线程进行缓存的构建,也就是“逻辑”过期.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值