redis限制set⼤⼩_整理了⼀份⽐较全⾯的Redis⾯试题(附答
案)
整理了⼀份Redis⾯试题,⽐较全,有基础的也有⾼级的。搬运⼯建议你先看下这些⾯试题,尝试⾃⼰看是否能回答,先有思考,再看答案,这样能检验⾃⼰是否真正理解redis,也能对⾃⼰是否掌握redis有⼀个⼤概的认识。
1、什么是Redis?
redis支持的数据结构Redis本质上是⼀个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进⾏操作,定期通过异步操作把数据库数据flush到硬盘上进⾏保存。因为是纯内存操作,Redis的性能⾮常出⾊,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。 Redis的出⾊之处不仅仅是性能,Redis最⼤的魅⼒是⽀持保存多种数据结构,此外单个value的最⼤限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以⽤来实现很多有⽤的功能,⽐⽅说⽤他的List来做FIFO双向链表,实现⼀个轻量级的⾼性 能消息队列服务,⽤他的Set可以做⾼性能的tag系统等等。另外Redis也可以对存⼊的Key-Value设置expire 时间,因此也可以被当作⼀ 个功能加强版的memcached来⽤。 Redis的主要缺点是数据库容量受到物理内存的限制,不能⽤作海量数据的⾼性能读写,因此Redis适合的场景主要局限在较⼩数据量的⾼性能操作和运算上。
2、Redis有哪些数据结构?
字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。
如果你是Redis中⾼级⽤户,还需要加上下⾯⼏种数据结构HyperLogLog、Geo、Pub/Sub。
如果你说还玩过Redis Module,像BloomFilter,RedisSearch,Redis-ML,⾯试官得眼睛就开始发亮了。
3、Redis相⽐memcached有哪些优势?
(1) memcached所有的值均是简单的字符串,redis作为其替代者,⽀持更为丰富的数据类型
(2) redis的速度⽐memcached快很多
(3) redis可以持久化其数据
4、Redis有哪些适合的场景?
(1)、会话缓存(Session Cache)
(2)、全页缓存(FPC)
(3)、队列
(4),排⾏榜/计数器
(5)、发布/订阅
5、Redis有哪⼏种数据淘汰策略?
noeviction:返回错误当内存限制达到并且客户端尝试执⾏会让更多内存被使⽤的命令(⼤部分的写⼊指令,但DEL和⼏个例外) allkeys-lru: 尝试回收最少使⽤的键(LRU),使得新添加的数据有空间存放。
volatile-lru: 尝试回收最少使⽤的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
allkeys-random: 回收随机的键使得新添加的数据有空间存放。
volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
6、使⽤过Redis分布式锁么,它是什么回事?
先拿setnx来争抢锁,抢到之后,再⽤expire给锁加⼀个过期时间防⽌锁忘记了释放。
这时候对⽅会告诉你说你回答得不错,然后接着问如果在setnx之后执⾏expire之前进程意外crash或者要重启维护了,那会怎么样?
这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓⼀抓⾃⼰得脑袋,故作思考⽚刻,好像接下来的结果是你主动思考出来的,然后回答:我记得set指令有⾮常复杂的参数,这个应该是可以同时把setnx和expire合成⼀条指令来⽤的!对⽅这时会显露笑容,⼼⾥开始默念:摁,这⼩⼦还不错。
7、假如Redis⾥⾯有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部出来?
使⽤keys指令可以扫出指定模式的key列表。
8、接着7追问:如果这个redis正在给线上的业务提供服务,那使⽤keys指令会有什么问题?
这个时候你要回答redis关键的⼀个特性:redis的单线程的。keys指令会导致线程阻塞⼀段时间,线上
服务会停顿,直到指令执⾏完毕,服务才能恢复。这个时候可以使⽤scan指令,scan指令可以⽆阻塞的提取出指定模式的key列表,但是会有⼀定的重复概率,在客户端做⼀次去重就可以了,但是整体所花费的时间会⽐直接⽤keys指令长。
9、如果有⼤量的key需要设置同⼀时间过期,⼀般需要注意什么?
如果⼤量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。⼀般需要在时间上加⼀个随机值,使得过期时间分散⼀些。
10、如何处理redis集中big key和hot key?
11、MySQL⾥有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
redis内存数据集⼤⼩上升到⼀定⼤⼩的时候,就会施⾏数据淘汰策略。
12、使⽤过Redis做异步队列么,你是怎么⽤的?
⼀般使⽤list结构作为队列,rpush⽣产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep⼀会再重试。 如果对⽅追问可不可以不⽤sleep呢?list还有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来。
如果对⽅追问能不能⽣产⼀次消费多次呢?使⽤pub/sub主题订阅者模式,可以实现1:N的消息队列。
如果对⽅追问pub/sub有什么缺点?在消费者下线的情况下,⽣产的消息会丢失,得使⽤专业的消息队列如rabbitmq等。
13、如果对⽅追问redis如何实现延时队列?
我估计现在你很想把⾯试官⼀棒打死如果你⼿上有⼀根棒球棍的话,怎么问的这么详细。但是你很克制,然后神态⾃若的回答道:使⽤sortedset,拿时间戳作为score,消息内容作为key调⽤zadd来⽣产消息,消费者⽤zrangebyscore指令获取N秒之前的数据轮询进⾏处理。
14、说说Redis哈希槽的概念?
Redis集没有使⽤⼀致性hash,⽽是引⼊了哈希槽的概念,Redis集有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集的每个节点负责⼀部分hash槽。
15、Redis中的Pipeline有什么好处,为什么要⽤pipeline?
可以将多次IO往返的时间缩减为⼀次,前提是pipeline执⾏的指令之间没有因果相关性。使⽤redis-benchmark进⾏压测的时候可以发现影响redis的QPS峰值的⼀个重要因素是pipeline批次指令的数⽬。
16、Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原⼦性操作,这是⼀个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,⽆需进⾏额外的抽象。
Redis运⾏在内存中但是可以持久化到磁盘,所以在对不同数据集进⾏⾼速读写时需要权衡内存,应为数据量不能⼤于硬件内存。在内存数据库⽅⾯的另⼀个优点是, 相⽐在磁盘上相同的复杂的数据结构,在内存中操作起来⾮常简单,这样Redis可以做很多内部复杂性很强的事情。 同时,在磁盘格式⽅⾯他们是紧凑的以追加的⽅式产⽣的,因为他们并不需要进⾏随机访问。
17、Redis和Redisson有什么关系?
Redisson是⼀个⾼级的分布式协调Redis客服端,能帮助⽤户在分布式环境中轻松实现⼀些Java的对象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe,
HyperLogLog)。
18、Jedis与Redisson对⽐有什么优缺点?
Jedis是Redis的Java实现的客户端,其API提供了⽐较全⾯的Redis命令的⽀持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相⽐,功能较为简单,不⽀持字符串操作,不⽀持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使⽤者对Redis的关注分离,从⽽让使⽤者能够将精⼒更集中地放在处理业务逻辑上。
19、⽀持⼀致性哈希的客户端有哪些?
Redis-rb、Predis等。
20、Twemproxy是什么?
Twemproxy是Twitter维护的(缓存)代理系统,代理Memcached的ASCII协议和Redis协议。它是单线程程序,使⽤c语⾔编写,运⾏起来⾮常快。它是采⽤Apache 2.0 license的开源软件。 Twemproxy⽀持⾃动分区,如果其代理的其中⼀个Redis节点不可⽤时,会⾃动将该节点排除(这将改变原来的keys-instances的映射关系,所以你应该仅在把Redis当缓存时使⽤Twemproxy)。
Twemproxy本⾝不存在单点问题,因为你可以启动多个Twemproxy实例,然后让你的客户端去连接任意⼀个Twemproxy实例。
Twemproxy是Redis客户端和服务器端的⼀个中间层,由它来处理分区功能应该不算复杂,并且应该算
⽐较可靠的。
21、怎么理解Redis事务?
事务是⼀个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执⾏。事务在执⾏的过程中,不会被其他客户端发送来的命令请求所打断。
事务是⼀个原⼦操作:事务中的命令要么全部被执⾏,要么全部都不执⾏。
22、Redis回收进程如何⼯作的?
⼀个客户端运⾏了新的命令,添加了新的数据。
Redi检查内存使⽤情况,如果⼤于maxmemory的限制, 则根据设定好的策略进⾏回收。
⼀个新的命令被执⾏,等等。
所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。
如果⼀个命令的结果导致⼤量内存被使⽤(例如很⼤的集合的交集保存到⼀个新的键),不⽤多久内存限制就会被这个内存使⽤量超越。
23、Redis回收使⽤的是什么算法?
LRU算法。
24、Redis如何做⼤量数据插⼊?
Redis2.6开始redis-cli⽀持⼀种新的被称之为pipe mode的新模式⽤于执⾏⼤量数据插⼊⼯作。
25、为什么要做Redis分区?
分区可以让Redis管理更⼤的内存,Redis将可以使⽤所有机器的内存。如果没有分区,你最多只能使⽤⼀台机器的内存。分区使Redis的计算能⼒通过简单地增加计算机得到成倍提升,Redis的⽹络带宽也会随着计算机和⽹卡的增加⽽成倍增长。
26、你知道有哪些Redis分区实现⽅案?
客户端分区就是在客户端就已经决定数据会被存储到哪个redis节点或者从哪个redis节点读取。⼤多数客户端已经实现了客户端分区。
代理分区 意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分
区规则决定请求哪些Redis实例,然后根据Redis的响应结果返回给客户端。redis和memcached的⼀种代理实现就是Twemproxy
查询路由(Query routing) 的意思是客户端随机地请求任意⼀个redis实例,然后由Redis将请求转发给正确的Redis节点。Redis Cluster实现了⼀种混合形式的查询路由,但并不是直接将请求从⼀个redis节点转发到另⼀个redis节点,⽽是在客户端的帮助下直接redirected到正确的redis节点。
27、Redis分区有什么缺点?
涉及多个key的操作通常不会被⽀持。例如你不能对两个集合求交集,因为他们可能被存储到不同的Redis实例(实际上这种情况也有办法,但是不能直接使⽤交集指令)。
同时操作多个key,则不能使⽤Redis事务.
分区使⽤的粒度是key,不能使⽤⼀个⾮常长的排序key存储⼀个数据集(The partitioning granularity is the key, so it is not possible to shard a dataset with a single huge key like a very big sorted set).
当使⽤分区的时候,数据处理会⾮常复杂,例如为了备份你必须从不同的Redis实例和主机同时收集RDB / AOF⽂件。
分区时动态扩容或缩容可能⾮常复杂。Redis集在运⾏时增加或者删除Redis节点,能做到最⼤程度对⽤户透明地数据再平衡,但其他⼀些客户端分区或者代理分区⽅法则不⽀持这种特性。然⽽,有⼀种预分⽚的技术也可以较好的解决这个问题。
28、为什么Redis需要把所有数据放到内存中?
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的⽅式将数据写⼊磁盘。所以redis具有快速和数据持久化的特征。
如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。 如果设置了最⼤使⽤的内存,则数据已有记录数达到内存限值后不能继续插⼊新值。
29、Redis的内存占⽤情况怎么样?
给你举个例⼦: 100万个键值对(键是0到999999值是字符串“hello world”)在我的32位的Mac笔记本上 ⽤了100MB。同样的数据放到⼀个key⾥只需要16MB, 这是因为键值有⼀个很⼤的开销。 在Memcached上执⾏也是类似的结果,但是相对Redis的开销要⼩⼀点点,因为Redis会记录类型信息引⽤计数等等。 当然,⼤键值对时两者的⽐例要好很多。
30、都有哪些办法可以降低Redis的内存使⽤情况呢?
如果你使⽤的是32位的Redis实例,可以好好利⽤Hash,list,sorted set,set等集合类型数据,因为通常情况下很多⼩的Key-Value可以⽤更紧凑的⽅式存放到⼀起。
31、Redis的内存⽤完了会发⽣什么?
如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)或者你可以将Redis当缓存来使⽤配置淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。
32、Redis如何做内存优化?
尽可能使⽤散列表(hashes),散列表(是说散列表⾥⾯存储的数少)使⽤的内存⾮常⼩,所以你应该尽可能的将你的数据模型抽象到⼀个散列表⾥⾯。⽐如你的web系统中有⼀个⽤户对象,不要为这个⽤户的名称,姓⽒,邮箱,密码设置单独的key,⽽是应该把这个⽤户的所有信息存储到⼀张散列表⾥⾯.
33、Redis如何做持久化的?
bgsave做镜像全量持久化,aof做增量持久化。因为bgsave会耗费较长时间,不够实时,在停机的时候会导致⼤量丢失数据,所以需要aof来配合使⽤。在redis实例重启时,会使⽤bgsave持久化⽂件重新构建内存,再使⽤aof重放近期的操作指令来实现完整恢复重启之前的状态。
对⽅追问那如果突然机器掉电会怎样?取决于aof⽇志sync属性的配置,如果不要求性能,在每条写指令时都sync⼀下磁盘,就不会丢失数据。但是在⾼性能的要求下每次都sync是不现实的,⼀般都使⽤定时sync,⽐如1s1次,这个时候最多就会丢失1s的数据。
34、对⽅追问bgsave的原理是什么?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论