Redis(面试篇)

目录

什么是Redis?

Redis有哪些优缺点

Redis为什么这么快

Redis有哪些数据类型

Redis的应用场景

持久化

什么是事务?

如何保证缓存与数据库双写时的数据一致性?

Redis有哪些功能

什么是缓存穿透?这么解决?

Redis支持的数据类型有哪些?

Redis支持的Java客户端有哪些?

怎么保存缓存和数据库的一致性?

Redis持久化有几种方式?

RDB

AOF

Reids怎么实现分布式锁

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

Redis主要消耗什么物理资源?


一起努力,加油,!!!

什么是Redis?

Redis是一个使用C语言写成的,开源的高新能key-value非关系缓存数据库。它支持存储的value类型相对跟多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。Redis的数据都基于缓存的,所以很快,每秒可以处理超过10万次读写操作,已知性能最快的key-valueDB。Redis也可以实现数据写入磁盘中,保证数据的安全不丢失,而且Redis的操作是原子性的。

Redis有哪些优缺点

优点

  • 读写性能优异,Redis能读的速读是110000次/s,写的速度是81000次/s
  • 支持数据持久化,支持AOF和RDB两种持久化方式。
  • 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
  • 数据结构丰富,除了支持string类型的hash,set,zset,list等数据结构。
  • 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。

缺点

  • 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高新能操作和运算上。
  • Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的ip才能恢复。
  • 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了胸痛的可能性
  • Redis较难支持在线扩容,在集群容量达到上线时在线扩容会变很复杂。为避免这一问题,运维人员在系统上线时必须确保足够的空间,这对资源照成很大的浪费。

Redis为什么这么快

  1. 完全基于内存,绝大部分请求时存储的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
  2. 数据结构简单,对数据操作也简单,Redis中数据结构是专门进行设计的;
  3. 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多线程或者多进程的切换而消耗CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。
  4. 使用多路I/O复用模型,非阻塞IO;
  5. 使用底层模型不同,他们之间底层实现方法以及与客户端之间通信的应用协议不一样,Redis直接自己构建VM机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

Redis有哪些数据类型

Redis主要有5种数据类型,包括String,List,Set,Zset,Hash,满足大部分的使用要求

数据类型

可以存储的值

操作

应用场景

String

字符串,整数或者浮点数

对整个字符串或者字符串的其中一部分执行操作

对整数和浮点数执行自增或则自减操作

做简单的键值对缓存

List

列表

从两端压入或则弹出元素
对单个或者多个元素进行修剪,保留一个范围内的元素

存储一些列表型的数据结构,类似粉丝列表,文章的评论列表之类的数据

Set

无序集合

添加,获取,移除单个元素
检查一个元素是否存在于集合中
计算交集,并集,差集

从集合里面随机获取元素

交集,并集,差集的操作,比如交集,可以把来共呢个人的分时列表整一个交集

Hash

包含键值对的无序散列表

添加、获取、移除单个键值对
获取所有键值对检查某个键是否存在

结构化的数据,比如一个对象

ZSet

有序集合

添加、获取、删除元素

根据分值范围或者成员来获取元素计算一个键的排名

去重但可以排序,如获取排名前几名的用户

Redis的应用场景

计数器:

可以对String进行自增自减运算,从而实现计数器功能。Redis这种内存数据的读写性能非常高,很适合存储频繁读写的计数量。

缓存:

将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。

会话缓存:

可以使用Redis来统一存储多台应用服务器的会话信息。当应用服务器不再存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一个应用服务器,从而更容易实现高可用、高可性以及可伸缩性。

全页缓存(FPC)

除基本的会话token之外,Redis还提供很简单的FPC平台。以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。此外,对WordPress的用户来说,Pantheon有一个非常好用的插件wp-redis,这个插件能帮助你以最快的速读加载你曾浏览过的页面。

查找表

例如DNS记录就很适合使用Redis进行存储。查找表和缓存类似,也是利用Redis快速查找特性。但是查找表的内容不能失效,而缓存的内容可以失效,因此缓存不作为可靠的数据来源。

消息队列(发布/订阅功能)

List是一个双向链表,可以通过plush和rpop写入和读取消息。不过最好使用kafka、RabbitMQ等消息中间件。

分布式锁

在分布式场景下,无法使用单机环境下的锁来对多个结点上的进程进行同步。可以使用Redis自带的SETNX命令实现分布式锁,除此之外,还可以使用官方提供的RedLock分布式锁实现。

其他

Set可以实现交集、并集等操作,从而实现共同好友等功能。ZSet可以实现有序性操作,从而实现排行榜等功能。

持久化

什么是Redis持久化?持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

什么是事务?

  • 事务时一个单独的隔离操作:事务中所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

如何保证缓存与数据库双写时的数据一致性?

  • 你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要时双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?
  • 一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔不一致的情况,最好不要做这个方案,读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况
  • 串行话之后,就会导致系统的吞吐量会大幅度的降低,用比正常情况下多几倍的机器去支持线上的一个请求。
  • 还有一种方式及时可能会暂时产生不一致的情况,但是发生的几率特别小,就是先更新数据库然后再删除缓存

问题场景

描述

解决

先写缓存,再写数据库,缓存写成功,数据库写失败

缓存写成功,但写数据失败或则响应延迟,则下次读取(并发度)缓存时,就出现脏读

这个写缓存的方式,本身就是错误的,需要改为先写数据库,把旧缓存置为失效;读取数据的时候,如果缓存不存在,则读取数据库再写缓存

先写数据库,再写缓存,数据库写成功,缓存写失败

写数据库成功,但写缓存失败,则下次读取(并发读)缓存时,则读不到数据

缓存使用时,假如读缓存失败,先读数据库,再回写缓存的方式实现

需要缓存异步刷新

指数据库操作和写缓存不再一个操作步骤中,不如再分布式场景下,无法做到同时写缓存或需要异步刷新(补救措施)时候

确定哪些数据适合此场景,根据经验值确定合理的数据不一致时间,用户数据刷新的时间间隔

Redis有哪些功能

1. 数据缓存功能

2. 分布式锁的功能

3. 支持数据持久化

4. 支持事务

5. 支持消息队列

什么是缓存穿透?这么解决?

缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

解决方案:最简单粗暴的方法如果一个查询返回的数据为空(不管时数据不存在,还是系统故障),我们就把这个空结果进行缓存,但它的过期时间会很短,最长不超过5分钟。

Redis支持的数据类型有哪些?

Redis 支持的数据类型:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。

Redis支持的Java客户端有哪些?

支持的Java客户端Redisson、jedis、lettuce

怎么保存缓存和数据库的一致性?

合理设置缓存的过期时间。

新增、更改、删除数据库操作时同时更新Redis,可以使用事务机制来保证数据的一致性。

Redis持久化有几种方式?

Redis持久化有两种方式,或者说有两种策略:

RDB(Redis Database):指定的时间间隔能对你的数据进快照存储。

AOP(Append Only File):每一个收到的写命令都通过write函数追加到文件中。

RDB

  1. RDB(Redis DataBase)持久化方式:是指用数据集快照的方式半持久化模式记录redis数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,这个临时文件替换上次持久化的文件,达到数据恢复。
  2. 优点
    1. 只有一个文件dump.rdb方便持久化
    2. 容灾性好,一个文件可以保存到安全的磁盘。
    3. 新能最大化,fork子进程来完成写操作,让主进程继续处理命令,所以是IO最大化。使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证redis的高性能,
    4. 相对于数据集大时,比AOF的启动效率更高
  1. 缺点
    1. 数据安全性低。RDB时间隔一段时间进行持久化,如果持久化直接按redis发生故障,会发生数据丢失,所以这种方式更适合要求不严谨的时候

AOF

  1. AOF(Append-only file) 持久化方式:是指所有命令行记录以redis命令请求协议的格式完全持久化存储,保存为aof文件。
  2. 优点
    1. 优点数据安全,aof持久化可以配置appendfsync属性,有always,每经行异常命令操作就记录到aof文件中一次。
    2. 通过append模式写文件,即使中途服务器宕机,也可通过redis-check-aof工具解决数据一致性问题。
    3. AOF机制rewrite模式。AOF文件没被rewrite之间(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)
  1. 缺点
    1. AOF文件比RDB文件大,且恢复速度慢。
    2. 数据集大的时候,比rdb启动效率低。

Reids怎么实现分布式锁

Redis分布式不能解决超时问题,分布式有一个超时时间,程序的执行如果超出锁的超出时间就会出现问题

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

512M

Redis主要消耗什么物理资源?

内存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进制转换计算幸运数出现次数(华为od机考题)

一、题目 1.原题 有位客人来自异国&#xff0c;在该国使用m进制计数。 该客人有个幸运数字n(n<m)&#xff0c;每次购物时&#xff0c; 其总是喜欢计算本次支付的花费(折算为异国的价格后)中存在多少幸运数字。 问&#xff1a;当其购买一个在我国价值k的产品时&#xff0c;…

【jvm】虚拟机栈是如何运行的

目录 1. 说明2. 栈的创建与线程绑定3. 栈帧的结构4. 栈帧的入栈与出栈5. 异常处理 1. 说明 1.虚拟机栈是Java程序运行时环境中的一个重要组成部分&#xff0c;它主要负责存储线程执行方法时的局部变量、操作数栈、动态链接、方法出口等信息。2.JVM虚拟机栈是Java程序运行时环境…

UE管理内容 —— FBX Asset Metadata Pipeline

随着实时3D制作大小和复杂程度的增加&#xff0c;以及构成现代制作流程的工具数量的不断增加&#xff0c;增加智能自动化来提高美术效率变得越发重要&#xff1b;这种智能自动化通常主要依靠元数据&#xff1a;有关资源的自定义数据&#xff0c;在项目中为资源赋予意义&#xf…

【Nginx】快速入门

概述 Nginx(engine x)是一个高性能的HTTP和反向代理web服务器。 特点是占有内存小&#xff0c;并发能力强&#xff0c;简单易配置&#xff0c;支持高达 50000 个并发连接数的响应。 作用 代理 正向代理&#xff1a; 反向代理&#xff1a; 负载均衡 Nginx提供的负载均衡策…

8.4 数据库基础技术-SQL

大数据 SQL语言 真题 1

I2C总线中的时钟延长和死锁

1. I2C总线的基本工作原理 I2C(Inter-Integrated Circuit)是一种用于在设备之间进行短距离通信的串行总线协议,常用于微控制器与外围设备(如传感器、存储器)之间的数据传输。I2C总线上有两条信号线: SDA(数据线):用于发送和接收数据。SCL(时钟线):由主设备控制,用…

07:极限-零点定理和介值定理

1、零点定理 定义&#xff1a;f(x)在[a, b]上连续&#xff0c;且f(a)f(b) <0.则存在 ξ ∈ \xi ∈ ξ∈[a,b],使 f ( ξ ) 0 f(\xi)0 f(ξ)0 1.1.介值定理&#xff08;最大最小值定理&#xff09; 定义&#xff1a;f(x)在[a,b]上连续&#xff0c;则f(x)在[a, b]上有最大…

[C语言]一、C语言基础

G:\Cpp\C语言精讲 1. C语言入门 1.1 初识计算机语言 计算机编程语言&#xff0c;就是人与计算机交流的方式。人们可以使用编程语言对计算机下达命令&#xff0c;让计算机完成人们需要的功能。 计算机语言有很多种。如&#xff1a;C 、C、Java、Go、JavaScript、Python&#x…

21.3 Netty终章

21.3 Netty终章 一. 聊天消息1. 发送消息给某用户多端设备2. 多端同步自己的消息2.1 `UserChannelSession`会话管理2.2 `WSHandler`中处理本人的消息同步2.3 表情类型消息收发二.====================================================一. 聊天消息 1. 发送消息给某用户多端设…

【Spring】初识Spring MVC

文章目录 前言一、MVC是什么&#xff1f;二、学习Spring MVC建立连接RequestMapping注解注解的使用细节 三、传递参数的情况传递单个参数1.传递String2.传递包装类/基本类型3.参数重命名(RequestParam) 传递多个参数传递对象传递数组传递集合参数为变量传递文件小细节 四、JSON…

【数据结构篇】~二叉树(堆)

【数据结构篇】~二叉树&#xff08;堆&#xff09; 二叉树1.树2.树的组成3.二叉树4.堆1.向上调整算法2.向下调整算法3.堆排序 4.topk问题源码 二叉树 1.树 树的概念与结构​ 树是一种非线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成一个…

Redis管道(Pipeline)

Pipeline是为了解决RTT&#xff0c;仅仅是将命令打包一次性发送&#xff0c;对整个Redis的执行不造成其它任何影响。是批处理命令变种优化措施&#xff0c;类似Redis的原生批命令&#xff08;如mset和mget&#xff09;。 问题由来 Redis是一种基于客户端-服务端模型以及请求/响…

【机器学习】特征工程的基本概念以及LASSO回归和主成分分析优化方法

引言 特征工程是机器学习中的一个关键步骤&#xff0c;它涉及到从原始数据中提取和构造新的特征&#xff0c;以提高模型的性能和预测能力LASSO&#xff08;Least Absolute Shrinkage and Selection Operator&#xff09;回归是一种用于回归分析的线性模型&#xff0c;它通过引入…

Spring中事务传播机制

Spring事务传播机制是指在一个事务方法调用另一个事务方法时&#xff0c;Spring如何管理这些方法之间的事务边界。Spring在TransactionDefinition接口中定义了七种事务传播行为&#xff0c;以满足不同的业务需求。以下是对这七种传播机制的详细解释及举例说明&#xff1a; 1. …

Java力扣练习

需求&#xff1a; 给你两个字符串s和t&#xff0c;每个字符串中的字符都不重复&#xff0c;且t是s的一个排列。 排列差定义为s和t中每个字符在两个字符串中位置的绝对差值之和 返回s和t之间的排列差 solution package JavaExercise20240824;public class JavaExercise1 {publ…

HTTP 之 HTTP/1.0、HTTP/1.1和HTTP2的缓存策略(六)

HTTP/1.0 缓存策略&#xff1a; Expires 头部&#xff1a;HTTP/1.0 使用 Expires 头部来指定资源的过期时间。浏览器将根据这个时间来判断是否需要从服务器重新获取资源。 Pragma 头部&#xff1a;Pragma: no-cache 用于告诉浏览器或代理服务器不要使用本地缓存的版本。 HTTP…

【以太坊基础】以太坊的基本概念与工作原理

以太坊基础 以太坊的基本概念与工作原理 引言 以太坊&#xff08;Ethereum&#xff09;是继比特币之后&#xff0c;最受关注的区块链平台。它不仅仅是一种加密货币&#xff0c;而是一个支持去中心化应用&#xff08;dApps&#xff09;和智能合约的平台。本文将深入探讨以太坊…

leetcode刷题之二分算法

目录 简介 第一个错误的版本 算法思路 代码实现 两个数组的交集 算法思路 代码实现 两个数组的交集2 算法思路 代码实现 有效的完全平方数 算法思路 代码实现 猜数字大小 算法思路 代码实现 排列硬币 算法思路 代码实现 寻找比目标字母大的最小字母 代码实…

深入理解C++中的协程(Coroutines):概念与使用

深入理解C中的协程&#xff08;Coroutines&#xff09;&#xff1a;概念与使用 在现代编程中&#xff0c;协程&#xff08;coroutines&#xff09;是一种强大的异步编程工具&#xff0c;它允许我们以更简洁和可读的方式编写异步代码。C20引入了协程的概念&#xff0c;使得C程序…

Redis系列之事务

概述 Redis事务提供一种将多个命令打包&#xff0c;然后一次性、按顺序地执行的机制&#xff0c;在事务执行的期间不会主动中断&#xff0c;服务器在执行完事务中的所有命令之后&#xff0c;才会继续处理其他客户端的其他命令。 三个重要的保证&#xff1a; 批量操作在发送E…