2022年常问redis面试题

1.什么是Redis

Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库

Redis与其他key-value缓存产品有以下三个特点:

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

Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构存储。

Redis支持数据的备份,即master-slave模式的数据备份

Redis优势

性能极高-Redis能读的速度是110000次/s,写的速度是81000次/s。丰富的数据类型 -Redis支持二进制案列的Strings,Lists,Hasher,Sets及Ordered Sets数据类型操作。

原子 -Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过Multi和Exec指令包起来

丰富的特性 -Redis还支持publish通知,key过期等等性能

2.Redis与其他key-value存储有什么不同?

Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时在磁盘格式方面他们是紧凑的以追加的方式参数,因为他们并不需要进行随机访问

3.Reids的数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zsetsorted set:(有序集合),geospatial地理位置(继而四被搜),hyperloglog , bitmaps

4.使用Redis有哪些好处?

1.速度快,因为数据存在内存中, 类似于HashMap,hashMap的优势就是查找和操作的时间复杂度都是O1)

2.支持丰富数据类型,支持string,list,set,Zset,hash等

3.支持事务,操作都是原子性,原子性:对数据更改要么全部执行,要么全部不执行

4.丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

5.Redis相比Mencached有哪些优势?

1.Memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类

2.Redis的速度比Memcached快

3.Redis可以持久化其数据

6.Memcache与Redis的区别有哪些?

1.存储方式Memcache(摸nuok)把数据全部存在内存中,断电后会挂掉,数据不能超过内存大小。Redis有部分存在硬盘上,这样能保证数据的持久化

2.数据支持类型:Memcache对数据类型相对简单。Reids有复杂的数据类型

3.使用底层模型不同 它们之间底层实现方式以及与客户端之间通信的应用协议不一样。Reids直接自己构建VM机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求

7.Redis是单进程单线程的?

Reids是单进程单线程的,redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销

8.一个字符串类型的值能存储最大容量是多少?

512M

9.Reids持久化机制

Redis是一个支持持久化的内存数据库,通过持久化机制把内存中的数据同步到硬盘文件来保证数据持久化。当redis重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目的

实现:单独创建fork()一个子进程,将当前父进程的数据库数据复制到子进程的内存中,然后由子进程写入到临时文件中,持久化的过程结束了,再用这个临时文件替换上次的快照文件,然后子进程退出,内存释放

RDB是redis默认的持久化方式。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件。即Snapshot(四闹破上t)存储,对应产生的数据文件为dump.rdb(咋们破),通过配置文件中的save参数来定义快照的周期(快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品)

AOF:Redis会将每一个收到的写命令都通过Write函数追加到文件最后,类似于Mysql的binlog。当Redis重启是会通过重新执行文件中保存的写命令在内存中重建整个数据库内容。当俩种方式同时开启,数据恢复Redis优先选择AOF恢复

10.缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级、缓存击穿等问题

一、缓存雪崩

缓存中大量数据过期,查询数据量大,引起数据库压力过大甚至down机
解决方案:
1.设置热点数据永远不过期
2.定时更新缓存
3.springcache解决方案:
设置差别过期时间间隔
比如 CacheManager配置多个过期时间维度
配置文件time-to-live配置设置不同的过期时间
 cache:
   #使用的缓存类型
    type: redis
   #过时时间
    redis:
      time-to-live: 3600000
      # 开启前缀,默以为true
      use-key-prefix: true
      # 键的前缀,默认就是缓存名cacheNames
      key-prefix: XD_CACHE
      # 是否缓存空结果,防止缓存穿透,默以为true
      cache-null-values: true

二:缓存穿透

缓存和数据库中没有数据,而用户不断发起请求。每次查询这个值都会请求到数据库,给数据库压力过大
解决方案:
1.接口层增加效验,如用户鉴权效验,id做基础效验,id<=0的直接拦截
2.如果查询数据库为空,我们可以给缓存设置个默认值
3.使用布隆过滤器快速判断数据是否存在
SpringCache解决方案:
cache:
   #使用的缓存类型
    type: redis
   #过时时间
    redis:
      time-to-live: 3600000
      # 开启前缀,默以为true
      use-key-prefix: true
      # 键的前缀,默认就是缓存名cacheNames
      key-prefix: XD_CACHE
      # 是否缓存空结果,防止缓存穿透,默以为true
      cache-null-values: true

三:缓存预热

缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据
解决思路:
1.直接写个缓存刷新页面,上线时手工操作下
2.数据量不大
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qinꦿ.๓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值