redis基础面试题1

Redis有哪些优缺点

优点

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

缺点

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

Redis为什么这么快

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

Redis有哪些数据类型

数据类型可以存储的值操作应用场景
STRING字符串、整数或者浮点数对整个字符串或者字符串的其中一部分执行操作,对整数和浮点数执行自增或者自减操作做简单的键值对缓存
LIST列表从两端压入或者弹出元素,对单个或者多个元素进行修剪,只保留一个范围内的元素存储一些列表型的数据结构,类似粉丝列表,文章的评论列表之类的数据
SET无序集合添加、获取、移除单个元素检查一个元素是否存在于集合中,计算交集、并集、差集从集合中随机获取元素交集、并集、差集的操作,比如交集,可以把两个人的粉丝列表进行交集
HASH包含键值对的无序散列表添加、获取、移除单个键值对,获取所有键值对,检查某个键是否存在结构化的数据,比如一个数据
ZSET有序集合添加、获取、删除元素,根据分数范围或者成员来获取元素,计算一个键的排名去重但可以排序,比如获取前几名的用户

Redis的应用场景

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

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

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

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

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

消息队列(发布/订阅功能):List 是一个双向链表,可以通过 lpush 和 rpop 写入和读取消息。不过最好使用 Kafka、RabbitMQ 等消息中间件。

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

Redis的持久化?

Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制

RDB:是Redis DataBase缩写快照,RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。

优点:

  1. 只有一个文件 dump.rdb,方便持久化。

  2. 容灾性好,一个文件可以保存到安全的磁盘。

  3. 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能

  4. 相对于数据集大时,比 AOF 的启动效率更高。

缺点:

  1. 数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)

  2. AOF(Append-only file)持久化方式:是指所有的命令行记录以 redis 命令请 求协议的格式完全持久化存储)保存为 aof 文件。

AOF:AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。

当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。

优点:

  1. 数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次。

  2. 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。

  3. AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))

缺点:

  1. AOF 文件比 RDB 文件大,且恢复速度慢。

  2. 数据集大的时候,比 rdb 启动效率低。

Redis的过期键的删除策略?

  • 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
  • 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
  • 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
下面为该资源的树壮目录。可以先确认是否有需要的版本dll或exe再进行下载。 VS2013REDIST运行库 │ 1.bat │ ├─2052 │ vcredist_arm.exe │ vcredist_x64.exe │ vcredist_x86.exe │ ├─arm │ ├─Microsoft.VC120.CRT │ │ msvcp120.dll │ │ msvcr120.dll │ │ vccorlib120.dll │ │ │ ├─Microsoft.VC120.CXXAMP │ │ vcamp120.dll │ │ │ └─Microsoft.VC120.OPENMP │ vcomp120.dll │ ├─Debug_NonRedist │ ├─arm │ │ ├─Microsoft.VC120.DebugCRT │ │ │ msvcp120d.dll │ │ │ msvcr120d.dll │ │ │ vccorlib120d.dll │ │ │ │ │ ├─Microsoft.VC120.DebugCXXAMP │ │ │ vcamp120d.dll │ │ │ │ │ └─Microsoft.VC120.DebugOPENMP │ │ vcomp120d.dll │ │ │ ├─x64 │ │ ├─Microsoft.VC120.DebugCRT │ │ │ msvcp120d.dll │ │ │ msvcr120d.dll │ │ │ vccorlib120d.dll │ │ │ │ │ ├─Microsoft.VC120.DebugCXXAMP │ │ │ vcamp120d.dll │ │ │ │ │ ├─Microsoft.VC120.DebugMFC │ │ │ mfc120d.dll │ │ │ mfc120ud.dll │ │ │ mfcm120d.dll │ │ │ mfcm120ud.dll │ │ │ │ │ └─Microsoft.VC120.DebugOpenMP │ │ vcomp120d.dll │ │ │ └─x86 │ ├─Microsoft.VC120.DebugCRT │ │ msvcp120d.dll │ │ msvcr120d.dll │ │ vccorlib120d.dll │ │ │ ├─Microsoft.VC120.DebugCXXAMP │ │ vcamp120d.dll │ │ │ ├─Microsoft.VC120.DebugMFC │ │ mfc120d.dll │ │ mfc120ud.dll │ │ mfcm120d.dll │ │ mfcm120ud.dll │ │ │ └─Microsoft.VC120.DebugOpenMP │ vcomp120d.dll │ ├─GraphicsDbgRedist │ ├─ARM │ │ │ VsGraphicsHelper.dll │ │ │ │ │ └─2052 │ │ VsGraphicsResources.dll │ │ │ ├─X64 │ │ │ VsGraphicsHelper.dll │ │ │ │ │ └─2052 │ │ VsGraphicsResources.dll │ │ │ └─X86 │ │ VsGraphicsHelper.dll │ │ │ └─2052 │ VsGraphicsResources.dll │ ├─x64 │ ├
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值