数据库Redis

1.缓存

1.1 缓存原理以及优缺点

  • 原理:先查询缓存中有没有要的数据,如果有,就直接返回缓存中的数据。如果缓存中没有目标数据,才去查询数据库,将得到数据先存放到缓存中,然后再返回给客户端。
  • 优点

1、减少了对数据库的读操作,数据库的压力降低
2、加快了响应速度

  • 缺点

1、因为内存断电就清空数据,存放到内存中的数据可能丢失
2、 缓存中的数据可能与数据库中数据不一致
3、 内存容量较小而且成本高

1.2 缓存穿透描述和解决方案

  • 描述:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为-1的数据或id为不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
  • 解决方案

1)接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
2)从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用),这样样可以防止攻击用户反复用同一个id暴力攻击

1.3 缓存击穿描述和解决方案

  • 描述:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间过大
  • 解决方案

1)设置热点数据永远不过期。
2)加互斥锁。

1.4 缓存雪崩描述和解决方案

  • 描述:缓存雪崩是指缓存中数据大批量过期,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期,很多数据都查不到从而查数据库。
  • 解决方案

1)缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2)如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
3)设置热点数据永远不过期

1.5 一致性哈希和缓存雪崩

1.5.1 一致性哈希定义

1.5.1.1 图解一致性哈希

1.5.1.2 公用哈希函数和哈希环
  • 设计哈希函数Hash(key),要求取值范围为[0, 2^32)。各哈希值在上图 Hash 环上的分布:时钟12点位置为0,按顺时针方向递增,临近12点的左侧位置为2^32-1。
1.5.1.3 节点(Node)映射至哈希环
  • 如图哈希环上的绿球所示,四个节点 Node A/B/C/D,其IP地址或机器名,经过同一个Hash()计算的结果,映射到哈希环上。
1.5.1.4 对象(Object)映射于哈希环
  • 如图哈希环上的黄球所示,四个对象Object A/B/C/D其键值,经过同一个 Hash()计算的结果,映射到哈希环上。
1.5.1.5 对象(Object)映射至节点(Node)
  • 在对象和节点都映射至同一个哈希环之后,要确定某个对象映射至哪个节点,
    只需从该对象开始,沿着哈希环顺时针方向查找,找到的第一个节点即可。可见,Object A/B/C/D 分别映射至 Node A/B/C/D。

1.5.2 虚拟节点解决缓存雪崩

2.redis数据库备份

2.1 RDB模式持久化

  • save命令阻塞当前Redis服务器,知道RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用
  • bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化操作由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间比较短。显然bgsave命令是针对save阻塞问题做的优化。因此Redis内部所有涉及RDB的操作均采用bgsave的方式。
  • RDB配置文件

1)save 900 10 #900s内至少达到10条写命令。
2)save 300 5 #300s内至少达到5条写命令。

2.2 AOF模式持久化

  • 开启AOF功能需要设置配置appendonly yes,默认不开启。AOF文件名通过appendfilename配置设置,默认文件名为appendonly.aof。保存路径同RDB持久化方式一样,通过dir配置指定。
  • 手动触发:直接调用bgrewriteaof命令。
  • 自动触发:根据auto-aof-rewrite-min-sizeauto-aof-rewrite-percentage参数确定自动触发时机。

1)auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为64MB。
2)auto-aof-rewrite-percentage:代表当前AOF文件空间(aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值。

2.3 混合模式持久化

  • 主要是对于aof的补充:因为aof的流程中对于Redis所有数据库中的内容读取并重写为命令,而重写过程中会存在这命令写入的可能,aof的处理是先放在缓冲区中积累,由子进程重写回收,主进程会通过管道的方式发送给子进程并直到子进程结束;但是子进程结束之后也还是会存在没有写入的命令,就会被回收。
  • 先以RDB命令重写,后用AOF追加命令。
  • AOF配置说明

1)appendonly yes #启动aof持久化方式
2)appendsync everysec #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐。
3)aof-use-rdb-preamble no 开启混合模式。

3.相关面试题

1.为什么redis快?

  • 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
  • 数据结构简单,对数据操作也简单
  • 采用单线程,避免不必要的上下文切换和竞争条件,也不存在多进程(多线程)导致的上下文切换而消耗 CPU,不存在加锁解锁操作,不可能出现死锁。
  • 使用I/O多路复用模型中非阻塞IO
  • 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去请求

.redis除了作为缓存,还可以用来做什么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值