0
点赞
收藏
分享

微信扫一扫

数据库知识点整理(四)

程序员漫画编程 2022-04-02 阅读 89
c++面试

Redis

(一)概念

  • Redis是一个使用C语言编写的、基于内存的且可持久化key-value数据库。

(一) Redis有以下特点:

1、性能高

  • Redis 读数据速度能达到 110000 次/s,写数据速度是 81000 次/s ;而MySQL的读数据速度为5k/s,写数据速度为3k/s。

2、数据结构丰富

  • Redis支持string、 list,set,zset,hash等数据结构的存储。

3、原子性

  • Redis的所有操作是支持原子性的,要么成功,要么失败。

4、持久化存储

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候再次加载进行使用。

(二) Redis缓存穿透、缓存击穿、缓存雪崩

1、缓存穿透

  • 定义:key对应的数据源并不存在,每次针对此key的请求在缓存中获取不到,请求都会打数据源,这样的请求过多就会压垮数据库。
  • 解决方案:采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据就会被bitmap拦截掉,从而减小了对底层存储系统的查询压力。

2、缓存击穿

  • 定义: key对应的数据源存在,但在redis中过期,若有针对该key的大量请求并发过来,就会从后端DB加载数据并回设到缓存,从而造成数据库压力过大而崩溃。
  • 解决方案
    设置key永不过期。最安全可靠,但会一直占有内存且无法获取最新数据。
    加互斥锁。在读取数据为NULL的时候,将尝试获取锁,若成功就重新从数据库加载数据并回设缓存,若失败就睡眠一定时间(保证数据回设缓存已经完成)重新从缓存中获取数据。

3、缓存雪崩

  • 定义:当缓存服务器重启或大量缓存集中在某一个时间段失效,这样在失效的时候也会给数据库带来很大的压力。缓存雪崩是针对很多个key,而缓存击穿是针对某一个key来说的。
  • 解决方案
    ①将缓存过期时间设置为一个随机值,避免缓存在同一时间过期;
    ②使用双缓存策略,设置原始缓存和备用缓存,原缓存失效时,访问备用缓存,备用缓存的失效时间设置得长一些。直到原始缓存在后台更新完成后,才会返回新缓存。

(三) Redis持久化存储

1、 RDB(Redis Data Base):

(1)定义

  • 按照一定的时间周期执行快照,将内存中的数据保存到硬盘中。RDB是redis默认的持久化方式。

(2) 优点:

适合冷备份。RDB是按时间周期存储,可以快速恢复之前某个时间段的数据。
性能最大化。在同步数据的时候fork一个子进程去持久化,主进程继续处理命令。
RDB数据恢复时的速度比AOF更高

(3) 缺点:

数据安全性低。RDB是间隔一段时间做持久化,如果这段时间redis发生故障,会发生数据丢失。
②RDB在生成数据快照时,若文件很大,客户端会暂停几毫米甚至几秒,若此时正在进行秒杀操作,性能会受到影响

2、 AOF(Append Only File):

(1)定义

  • 将redis执行的每次写命令记录到单独的日志文件中,当redis重启时会从持久化的日志文件中恢复数据。
    

(2) 优点:

①**数据安全性高。AOF每进行一次命令操作就会异步将数据记录到AOF中一次,若数据丢失,也只会丢失这一次的数据。
rewrite模式。**如用flushall命令误操作清空了所有数据,在后台没开始重写AOF文件之前,可以拷贝AOF日志文件,并删除其中的flushall命令。

(3) 缺点:

①同样的数据,AOF文件比RDB文件更大,恢复速度更慢

3、 RDB与AOF混合持久化

(1)单独使用上述两者的问题

  • 若单独使用RDB,可能会丢失很多数据;
  • 若单独使用AOF,数据恢复没有RDB快。

(2)解决方法

  • Redis4.0之后提供了混合持久化方式,也就是:采用RDB快照以一定频率执行保存数据
  • 而在两次快照之间,使用AOF日志记录这期间的所有命令操作。

4、 两种持久化存储方式如何选择

①如果你的业务场景需要很高的性能,或者宕机之后能够尽快的恢复,而对数据完整性的要求不是那么高,那么可以采用RDB持久化的方式。
②如果你的业务场景对数据完整性的要求很高,那么可以采用AOF持久化方式,而至于采用哪种回写策略,则取决于你对数据完整性的要求程度。
③如果你的业务场景既要兼顾性能,又注重数据完整性,那么可以采用混合持久化的方式。
④如果你对数据丢失无所谓,追求性能最大化的情况下,甚至可以禁用持久化

(四) 过期key的删除策略

1、定时删除

  • 每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。
  • 优点:保证内存被尽快释放;
  • 缺点:若过期key很多,会需要占用大量CPU资源去处理过期数据,从而影响读取缓存的响应时间。

2、惰性删除

  • 只有当访问这个key的时候,才会判断key是否过期,过期就删除。
  • 优点:节省CPU资源;
  • 缺点:若出现大量过期的key没有被访问,会占用大量内存;

3、定期删除

  • 每隔一段时间,扫描一定数量设置了过期时间的key,并清除其中过期的key。
  • 定期删除的性能介于定时删除和惰性删除之间。
  • 内存占用方面,定期删除不如定时删除好;
  • CPU占用方面,定期删除不如惰性删除好。

(五) 内存淘汰策略

  • redis内存数据集大小上升到一定大小的时候,导致用于缓存的内存不足,就会施行数据淘汰策略。惰性删除+定期删除可能会残留大量的过期key,从而导致内存数据太大。

1、 全局的键空间选择性移除

  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用的)
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。

2、 设置过期时间的键空间选择性移除

  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

(六)请你说一下mysql引擎以及Redis区别

  • MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较
  • Redis是非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度,能够大大的提高运行效率,但是保存时间有限
举报

相关推荐

0 条评论