面试问答总结之Redis

🐒个人主页

🏅JavaEE系列专栏

📖前言:

本篇博客主要以总结Redis在面试中常考察点

🐕什么是Redis?它有哪些功能?

redis是一款非关系型数据库,它通常是以键值对的形式将数据存储在内存中,由于数据在内存中,所以查询非常快,常常被用作缓存减轻数据库访问压力。

常见的功能有:

缓存、排行榜、去重、排序、计数器、消息队列、分布式锁…

🐕redis是单线程模型还是多线程模型?

在redis.6x之前是单线程的,网络请求、连接、认证,数据读写都是由一个线程执行。

在redis.6x之后,网络请求那些让一些线程执行,而读写数据仍然采用单线程模型来保证线程安全。

🐕为什么设计单线程,速度也很快?

1.基于内存操作,数据读写速度快。

2.单线程没有线程切换,减少了时间开销。

3.底层设计为哈希表结构,键值对存储,时间复杂度低。

🐕 来讲一下Redis数据持久化

(“数据持久化”:将数据存储在硬盘文件中,进行持久化保存)

(背景:redis数据存储在内存中,可能会因断电、系统故障等原因造成数据丢失!所以需要将一些数据进行持久化保存。)

redis数据持久化有两种方式,(可在.conf文件中配置)

🪀RDB方式:是Redis默认的持久化方式,它是指定间隔将数据以快照的形式写入.rdb文件中来做到持久化保存。

🪀AOF方式:追加文件,是将Redis执行的增加、删除、修改操作连同数据存储到.aof文件中,在Redis故障/重启后生效,从头到尾执行一遍,来保证数据不会丢失。

🐕redis与数据库如何保持数据一致?

这里提供三种方法:(目的:保持数据最终一致性

1.先更新数据库,在更新redis,但如果Redis更新失败,仍然会造成数据不一致。

2.先删除redis,在更新mysql,但在高并发的情况下,在Redis已经删除后而MySQL没有更新完成,有请求过来,此时Redis中会更新成旧数据,仍然会造成数据不一致。

3.延时双删,先删除redis数据,在更新mysql,停顿几百毫秒后,再删除redis数据。(停顿几百毫秒是为了让mysql数据更新完毕,然后再重新删除Redis。来保证Redis与MySQL最终的数据一致性)

其实还有一种…(但是也有问题,最好用延时双删)

4.先更新MySQL,再删除redis,在高并发的情况下,有多个更新MySQL的请求同时来,一个请求更新完了,还在等redis删除数据,而下一个请求更新好了,可能会造成数据覆盖的情况,仍然存在数据不一致。

🐕Redis事务

Redis事务是一组命令的集合,保证这些命令有先后顺序来执行,且不能有其他线程来干扰(一次性执行)。它与MySQL事务不同的是如果有命令出错了,其他命令不受影响、仍会执行。

🐕主从复制(也是保证数据完整性的方式)

开启多个Redis,一个充当主机,其它充当从机。数据写入主机,主机与从机数据共享,在从机中查询数据。
好处
🪀可以使数据读写分离,提高Redis响应速度。
🪀查询时从机负载均衡,均摊redis访问压力
🪀故障恢复(主机挂了,不影响从机继续工作,通过“哨兵机制”,可以在从机中,选举一位从机充当“代理主机”,直至主机恢复正常)
弊端
🪀数据冗余,主机数据会自动备份到多个从机中,
🪀要求硬件配置高,需要多态电脑来搭建集群,管理繁琐。

🐕Key的过期策略(Redis采用“惰性删除+定期删除”的方式)

🪀立即删除:当key过期后,立即删除key。(大量同时删除)对CPU不友好,对内存友好
🪀惰性删除:当key过期后不会立即删除,而是会等到下一次使用此key时判断key是否过期。(过期再删除)
对CPU友好,对内存不友好
🪀定期删除:将过期的key记录下来(字典k-v),定期的把过期的key删除

🐕缓存穿透、缓存击穿、缓存雪崩

🪀缓存穿透:大量虚假的key访问,Redis与MySQL中没有此key,但仍会查询
🪀缓存击穿:热点key访问时,redis中存储key恰好过期,此时大量的访问会到达数据库
🪀缓存雪崩:在大量的key访问时,redis中大量key恰好同时过期或redis缓存故障,导致大量请求到达数据库

解决办法:
1.设置一个key值为null ,设置一个较短的过期时间。或来一个参数验证,key :-1(缓存穿透)
2.设置恰当的key的过期时间, (缓存击穿)
3.随机设置key的过期时间,避免大量key集体失效 或定时任务,来查看key是否快要过期,延长key过期时间(缓存雪崩)

🐕持续更新…

相关推荐

  1. 面试问答总结Redis

    2024-02-19 18:28:01       62 阅读
  2. 面试问答总结ElasticSearch

    2024-02-19 18:28:01       69 阅读
  3. Redis面试高频问题

    2024-02-19 18:28:01       34 阅读
  4. Redis面试总结5.3

    2024-02-19 18:28:01       29 阅读
  5. 软件测试面试问题总结—CTO面试

    2024-02-19 18:28:01       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-19 18:28:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-19 18:28:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-19 18:28:01       87 阅读
  4. Python语言-面向对象

    2024-02-19 18:28:01       96 阅读

热门阅读

  1. 备战蓝桥杯 Day8(最长上升子序列LIS模型)

    2024-02-19 18:28:01       30 阅读
  2. 微信小程序按需注入和用时注入

    2024-02-19 18:28:01       59 阅读
  3. html5播放 m3u8

    2024-02-19 18:28:01       49 阅读
  4. Leetcode-1041. 困于环中的机器人

    2024-02-19 18:28:01       49 阅读
  5. Hexo删除主题

    2024-02-19 18:28:01       41 阅读
  6. 深度学习的进展

    2024-02-19 18:28:01       48 阅读
  7. devc++跑酷小游戏3.0.0 Dev-c++跑酷小游戏 1.0.0

    2024-02-19 18:28:01       45 阅读
  8. sql语句创建数据库

    2024-02-19 18:28:01       54 阅读