没有合适的资源?快使用搜索试试~ 我知道了~
Redis常见面试题和答案(最新版).pdf
需积分: 5 0 下载量 93 浏览量
2024-03-13
14:47:33
上传
评论
收藏 2.81MB PDF 举报
温馨提示
试读
20页
redis面试题 最新常见面试题和答案
资源推荐
资源详情
资源评论
Redis常见⾯试题( 最新版)
概述
什么是 Redis
Redis(Remote Dictionary Server) 是⼀个使⽤ C 语⾔编写的,开源的(BSD许可)⾼性能⾮关系型(NoSQL)的键值对数据库。
Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值⽀持五种数据类型:字符串、列表、集合、散列表、有序集
合。
与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度⾮常快,因此 redis 被⼴泛应⽤于缓存⽅向,每秒可以处理超过 10万
次读写操作,是已知性能最快的Key-Value DB。另外,Redis 也经常⽤来做分布式锁。除此之外,Redis ⽀持事务 、持久化、LUA脚本、
LRU驱动事件、多种集群⽅案。
优点
读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
⽀持数据持久化,⽀持AOF和RDB两种持久化⽅式。
⽀持事务,Redis的所有操作都是原⼦性的,同时Redis还⽀持对⼏个操作合并后的原⼦性执⾏。
数据结构丰富,除了⽀持string类型的value外还⽀持hash、set、zset、list等数据结构。
⽀持主从复制,主机会⾃动将数据同步到从机,可以进⾏读写分离。
缺点
数据库容量受到物理内存的限制,不能⽤作海量数据的⾼性能读写,因此Redis适合的场景主要局限在较⼩数据量的⾼性能操作和运算
上。
Redis 不具备⾃动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者⼿动切换前端的IP才能恢
复。
主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引⼊数据不⼀致的问题,降低了系统的可⽤性。
Redis 较难⽀持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这⼀问题,运维⼈员在系统上线时必须确保有⾜够的
空间,这对资源造成了很⼤的浪费。
为什么要⽤ Redis /为什么要⽤缓存
主要从“⾼性能”和“⾼并发”这两点来看待这个问题。
⾼性能:
假如⽤户第⼀次访问数据库中的某些数据。这个过程会⽐较慢,因为是从硬盘上读取的。将该⽤户访问的数据存在数缓存中,这样下⼀次再
访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同
步改变缓存中相应的数据即可!
⾼并发:
直接操作缓存能够承受的请求是远远⼤于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样⽤户的⼀部分
请求会直接到缓存这⾥⽽不⽤经过数据库。
为什么要⽤ Redis ⽽不⽤ map/guava 做缓存 ?
缓存分为本地缓存和分布式缓存。以 Java 为例,使⽤⾃带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,⽣命周
期随着 jvm 的销毁⽽结束,并且在多实例的情况下,每个实例都需要各⾃保存⼀份缓存,缓存不具有⼀致性。
使⽤ redis 或 memcached 之类的称为分布式缓存,在多实例的情况下,各实例共⽤⼀份缓存数据,缓存具有⼀致性。缺点是需要保持
redis 或 memcached服务的⾼可⽤,整个程序架构上较为复杂。
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,满⾜⼤部分的使⽤要求
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 分布式锁实现。
其它
Set 可以实现交集、并集等操作,从⽽实现共同好友等功能。ZSet 可以实现有序性操作,从⽽实现排⾏榜等功能。
总结⼆
Redis相⽐其他缓存,有⼀个⾮常⼤的优势,就是⽀持多种数据类型。
数据类型说明string字符串,最简单的k-v存储hashhash格式,value为field和value,适合ID-Detail这样的场景。list简单的list,顺序列
表,⽀持⾸位或者末尾插⼊数据set⽆序list,查找速度快,适合交集、并集、差集处理sorted set有序的set
其实,通过上⾯的数据类型的特性,基本就能想到合适的应⽤场景了。
如上所述,虽然Redis不像关系数据库那么复杂的数据结构,但是,也能适合很多场景,⽐⼀般的缓存数据结构要多。了解每种数据结构适
合的业务场景,不仅有利于提升开发效率,也能有效利⽤Redis的性能。
持久化
剩余19页未读,继续阅读
资源评论
shandongwill
- 粉丝: 3397
- 资源: 406
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功