Redis面试问题归纳.壹
- 一、说说redis是什么?
- 二、大致讲下redis的特点(好处)?
- 三、比较redis和memcached区别/优势?
- 四、如何保证redis的数据都是热点数据?
- 五、redis高并发和快速的原因
- 六、redis集群方案在什么情况会导致整个集群不可用?
- 七、redis支持的Java客户端有哪些呢?官方推荐是用哪个?
- 八、redis与Redisson有什么关系?
- 九、简单描述下redis哈希槽的概念吧?
- 十、redis的管道有什么用?
- 十一、怎么测试redis的连通性?
- 十二、redis事务相关的命令有哪些?
- 十三、你对redis内存优化的建议是什么?
- 十四、redis回收进程工作流程是怎样的?
- 十五、如何将redis的key设置成过期时间或永久有限?
- 十六、怎么设置redis的密码和验证密码?
一、说说redis是什么?
- redis (远程字典服务)是一个由C语言编写、支持网络、一般基于内存也可以持久化存盘的日志型,key-value数据库。
- 它本质就是一个key-value类型的内存数据库,类似于memcached。
二、大致讲下redis的特点(好处)?
- redis把数据都加载在内存当中操作,并且会通过异步操作把数据库的数据一般定期flush到硬盘上保存下来(半持久化),当然也可以实时存储(全持久化),文件名为dump.rdb。
- 由于是在内存中操作,类似于HashMap,优势就是查找和操作的时间复杂度都是O(1)【1次就能找到相关数据】,因此性能很出色,可达到10万次/秒的操作,是目前最快的key-value数据库。
- redis也能支持保存多种数据类型,如:hash、sorted set(有序集合)、list、string、set。
- 支持事务,操作皆原子性(原子性即对数据的更改要么全部执行,要么全部不执行)。
- 特性丰富,用于缓存、消息,可以对key设置过期时间,过期自动删除。
三、比较redis和memcached区别/优势?
- 对于单个value的存储,redis最大保存限制是1GB,而memcached只能保存1MB,这也是redis保存数据类型丰富的主要原因。
- redis的数据类型比memcached丰富【也是使它的功能比memcached丰富的原因】如list类型可以做FIFO双向链表,实现一个轻量级的高性能消息队列服务,也可以做高性能的tag系统等。而且redis也可以对存入的key-value设置过期时间,所以生产中习惯性地把它当成加强版的memcached来用。
- redis可以持久化存储数据,memcached则全部存到内存且数据不能超过内存的大小。
- 底层模型、与客户端的通信的应用协议都不同,redis直接自己构建VM机制【因为一般系统调用函数会浪费一定时间去移动和请求】。
四、如何保证redis的数据都是热点数据?
redis内存数据集上升到一定大小时会有一套回收策略来保证数据是热点数据,也就是redis的数据淘汰策略,共有6种类型:
五、redis高并发和快速的原因
- redis是基于内存的,内存的读写速度非常快。
- redis是单进程单线程的,省去了很多上下文切换线程的时间,利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。
- 使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。
六、redis集群方案在什么情况会导致整个集群不可用?
- 有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。
七、redis支持的Java客户端有哪些呢?官方推荐是用哪个?
- 有Redisson、Jedis、lettuce等。
- 官方推荐使用Redisson
八、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。
九、简单描述下redis哈希槽的概念吧?
- redis集群没有使用一致性hash,而是引入了哈希槽的概念。
- redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。
- 集群的每个节点负责一部分hash槽。
十、redis的管道有什么用?
- 一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。【这就是管道(pipelining),是一种几十年来广泛使用的技术。例如许多POP3协议已经实现支持这个功能,大大加快了从服务器下载新邮件的过程。】
十一、怎么测试redis的连通性?
- 用ping命令
十二、redis事务相关的命令有哪些?
- MULTI、EXEC、DISCARD、WATCH。
十三、你对redis内存优化的建议是什么?
- 尽可能多的使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。【例如web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面。】
十四、redis回收进程工作流程是怎样的?
- 一个客户端运行了新的命令,添加了新的数据 。
- redis会检查内存使用情况,如果大于MAXMEMORY的限制, 则根据设定好的策略进行回收。
- 一个新的命令被执行,不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。
- 如果一个命令的结果导致大量内存被使用【(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。】
十五、如何将redis的key设置成过期时间或永久有限?
- 过期失效:用EXPIRE命令。
- 永久有效:用PERSIST命令。
十六、怎么设置redis的密码和验证密码?
- 设置密码: config set requirepass your_passwd。
- 验证密码: auth your_passwd。