数据库--->Redis(1)【持久化、过期策略、穿透/击穿/雪崩】

文章目录

  • Redis概述
  • Redis基本数据类型
  • Redis与MySQL的区别以及使用场景
  • Redis持久化机制
    • RDB(redis database)
    • AOF(append only file)
  • 穿透、击穿、雪崩
  • Redis事务
  • key过期策略

Redis概述

Redis是一个基于C语言开发的开源数据库,与传统数据库不同的是,Redis的数据是存储在内存中的,读写速度非常快,广泛应用于缓存方向,Redis存储是KV对数值。

Redis基本数据类型

5种基本数据结构: String(字符串),List(列表),Set(集合),Hash(散列),Zset(有序集合)

3种特殊数据结构: HyperLogLogs(基数统计)、Bitmap (位存储)、Geospatial (地理位置)

Redis与MySQL的区别以及使用场景

Redis和MySQL的区别:

  1. MySQL属于关系型数据库,使用表格存储数据,Redis属于非关系型数据库,使用键值对存储数据
  2. MySQL将数据持久化存储在硬盘上,Redis数据存储在内存中,因此具有非常高的读写性能
  3. MySQL作为关系型数据库,拥有强大的SQL查询功能,能够进行复杂关系查询
  4. MySQL提供了严格的事务支持,能确保数据的一致性和完整性;MySQL还支持索引用于提高查询性能
  5. Redis中支持多种数据结构,每种数据结构都有相应的操作命令,方便进行存储和操作
  6. Redis支持分布式架构,可以通过分片来将数据分布在多个节点上,提高系统的可扩展性和容错性
  7. Redis的发布/订阅功能可以用来实现消息队列,用于在不同的应用程序或服务之间传递消息

Redis和MySQL两者的使用场景:

Redis是一个内存数据结构存储,常用于需要高速读写操作、缓存或作为消息代理的场景。主要用于实时分析、排行榜、发布/订阅消息系统、实时通信

MySQL是一个关系数据库管理系统,适用于需要存储大量数据、复杂查询和事务处理的场景。主要用于电子商务网站、客户关系管理系统、内容管理系统

Redis持久化机制

RDB(redis database)

RDB(快照)持久化是Redis默认的持久化机制,通过将Redis在某个时间点上的数据集快照保存到磁盘上的二进制文件(.rdb文件)来实现。默认情况下,Redis会定期清理快照,也可以手动创建。快照持久化可以更节约磁盘空间和更快速地进行数据恢复,因为它是通过将整个数据集写入磁盘来进行持久化。Redis还支持在指定的时间段内有多少个数据库键发生变化时进行快照持久化。

RDB创建快照会阻塞线程吗?

在Redis中创建了两个命令来生成RDB快照文件:

save: 同步保存操作,会阻塞 Redis 主线程

bgsave: fork 出一个子进程,子进程执行,不会阻塞 Redis 主线程,默认选项

AOF(append only file)

AOF(日志)持久化,它会将所有写操作追加到一个日志文件中,以日志的形式来记录每个写操作,这个日志文件可以用来重建数据库,只许追加文件不许改写文件,Redis启动之初就会读取该文件重新构建数据,也就是Redis重启的话就是根据日志文件的内容将写指令从前往后执行一次以完成数据的恢复工作,AOF持久化机制的优点是可靠性高,缺点是文件比较大,恢复速度比RDB慢。

穿透、击穿、雪崩

缓存穿透:key对应的数据在Redis中并不存在,每次的请求key从缓存获取不到,请求就会传到数据库,数据库也没有,当请求量达到一定程度就回压垮数据库。

解决方法: 1. 将这个空对象设置到缓存里面,下次请求的话直接从缓存里面拿,这种情况一般将空对象设置一个较短过期时间,2. 对参数进行校验,不合法参数进行拦截

缓存击穿:某个key对应数据库中存在,但是Redis缓存在某个时间节点过期,此时有大量请求发送过来,发现缓存过期,就会从后端数据库加载到缓存,这时候大量并发可能会将数据库压垮。

解决方法; 1. 热点数据设置永不过期 2. 加锁,当多个线程去查询数据库的这条数据时,我们可以在第一条查询语句加互斥锁,这样当其他线程拿不到锁就进行等待,当第一个线程查询到数据时,然后将数据返回到Reids缓存起来,后面线程进来发现有缓存,直接从缓存处拿取数据

缓存雪崩:高并发情况下,大量的缓存失效,或者缓存层出现故障,于是所有的请求都会到达数据库,数据库的调用量暴增,造成数据库宕机

解决办法: 1. 随机设置key失效时间,避免大量的key集体失效 2. 若是集群部署,可将热点数据均分在不同的Redis库中可能避免key全部失效 3. 不设置过期时间 4. 跑定时任务,在缓存失效前刷新新的缓存

总结:雪崩就是大面积的key缓存失效,穿透是Redis里不存在这个缓存key,击穿是Redis某个热点key突然失效,最终的受害者都是数据库,对于Redis宕机,请求数据全部去数据库这种情况,我们可以有以下思路

事发前: 实现Redis的高可用(主从架构+Sentinel(哨兵)),尽量避免Redis挂掉这种情况

事发中: 玩意Redis真的挂了,我们可以设置本地缓存(ehcache)+限流,尽量避免数据库被压垮(起码保证给服务正常运行)

事发后: Redis持久化,重启后从磁盘上加载数据,快速恢复缓存数据

Redis事务

Redis 事务提供了一种将多个命令请求打包的功能。然后,再按顺序执行打包的所有命令,并且不会被中途打断。 Redis 事务在运行错误的情况下,除了执行过程中出现错误的命令外,其他命令都能正常执行。并且,Redis 事务是不支持回滚(roll back)操作的。因此,Redis 事务其实是不满足原子性的。

key过期策略

Redis中的key过期策略是用于设置key的生存时间,并在时间到期后自动将过期的key删除。常见的有:

定时删除:当key的生存时间到期时,Redis会自动删除该key。这种策略可以保证资源的及时释放,但是在大量key同时过期时,会阻塞服务器,导致服务器暂时停止服务。

惰性/懒汉式删除:只有当客户端访问一个已过期的key时,Redis才会删除这个key。这种策略CPU开销小,但是如果过期key不被访问,那么这些key会一直存在于内存中,占用内存空间。

定期删除:Redis每隔一段时间,会随机测试一些key,删除其中已过期的key。这种策略是定时删除和惰性删除的折中方案,通过调整删除操作执行的频率和时长,可以在控制CPU开销和内存占用之间找到一个平衡。

你可能感兴趣的:(#,Redis,数据库,数据库,redis,缓存)