redis面试宝典

1.什么是redis

Redis本质上是一个Key-Value类型的内存数据库,整个数据库统统加载在内存当中作进行操作,定期通过一部操作吧数据库数据flush到硬盘进行保存。因为是纯内存操作,Redis的性能非常的出色,每秒可以处理超过10万次读写操作,是已知性能最快的Key-Value DB。
Redis是支持保存多种数据结构,此外单个value的最大限制是10GB,,因此Redis可以用来实现很多有用的功能,如:用它的List做FIFO双向链表,实现一个轻量级的高性能消息队列服务,用它的Set可以做高性能你的tag系统等等。另外Redis可以对存入的Key-Value设置expire时间,因此也可以当做一个功能加强版的memcached来用。
Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量的高性能读写,因此Redis适合的常见主要局限在较小数据量的高性能操作和运算上。

2.Redis支持哪几种数据类型

String、List、Set、Sorted Set、hashes

3.Redis主要消耗什么物理资源

内存

4.Redis全称是什么

Remote Dictionary Server。

5.Redis有哪几种数据淘汰策略

**noeviction:**返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入口令,但DEL和几个例外)
**allkeys-lru:**尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
**volatile-lru:**尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
**volatile-ttl:**回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得心态你家的数据有空间存放。

6.Redis官方为什么不提供Windows版本

因为目前Linux版本已经相当稳定,而且用户量很大,无需开发Windows版本,反而会带来兼容性问题

7.一个字符串类型的值能存储最大容量是多少

512M

8.为什么Redis需要把所有数据放到内存中

redis为了达到最快读写速度将数据都读取到内存中个,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度会严重影响Redis性能。在内存越来越便宜的今天,redis将会越来越受欢迎。
如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。

9.redis集群方案应该怎么做,都有哪些方案

1.twemproxy,它类似于一个代理方式,使用方法和普通redis无任何区别,设置好它下属的多个redis实例后,使用时在本需要连接redis的地方改为连接twemproxy,它将会以一个代理的身份接收请求并使用一致性hash算法,将请求转接到具体redis,将结果再返回twemproxy。使用方式渐变(只需要修改连接端口),对就项目扩展的首选。问题:twemproxy自身单短开口实例的压力,使用一致性hash后,对redis节点数量改变时候的计算值的改变,数据无法自动移动到新的节点。
2.codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在节点数量改变情况下,旧节点数据可恢复到新hash节点。
3**.redis cluster3.0自带的集群**,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。(具体看官方介绍)
4. 在业务代码层实现 ,起几个毫无关联的redis实例,在代码层,对key进行hash计算,然后去对应的redis实例操作数据。这中方式对hash层代码要求较高,考虑部分包括节点失效后的替代算法方案,数据震荡后的自动脚本回复,实例的监控等等。

10.redis集群方案什么情况下会导致整个集群不可用

有A、B、C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。

11.MySQL有2000w数据,redis只存20w的数据,如何保证redis中的数据都是热点数据

redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

12.redis有哪些适合的场景

1.会话缓存(session cache):最常用的一种使用redis的情景是会话缓存。用redis缓存会话比其他存储(如Memcached)的优势在于:redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在他们还会这样吗?(随着Redis 这些年的改进,很容易找到怎么恰当的使用 Redis 来缓存会话的文档。甚至广为人知的商业平台 Magento 也提供 Redis 的插件。)
2.全页缓存(FPC):除基本的会话token之外,redis还提供很简便的FPC平台。回到一致性问题,即使重启了redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。(再次以 Magento 为例,Magento 提供一个插件来使用 Redis 作为全页缓存后端。此外,对 WordPress 的用户来说,Pantheon 有一个非常好的插件 wp-Redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。)
3.队列:redis在内存存储引擎领域的一大优点是提供list和set操作,这使得redis能作为一个很好的消息队列披平台来使用。redis作为队列使用的操作,就类似于本地程序语言(Python)对list的push/pop操作。
4.排行榜/计数器:redis在内存中对数字进行递增或递减的操作实现的非常好。集合(set)和有序集合(sorted set)也使得我们在执行这些操作的时候变得非常简单,redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获得到排名最靠前的10个用户-我们称之为“user_scores”;我们只需要下面一样执行即可:
当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你
需要这样执行:ZRANGE user_scores 0 10 WITHSCORES Agora Games 就是一个很好的例子,用 Ruby 实现的,它的排行榜就是使用 Redis 来存储数据的,你可以在这里看到。
5.发布/订阅

13.redis支持的java客户端都有哪些,官方推荐用哪个

Redisson、Jedis、lettuce等等,官方推荐使用Redisson

14.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)。

15.Jedis与Redisson对比有什么优缺点

Jedis 是 Redis 的 Java 实现的客户端,其 API 提供了比较全面的 Redis 命令的支持;
Redisson 实现了分布式和可扩展的 Java 数据结构,和 Jedis 相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等 Redis 特性。Redisson 的宗旨是促进使用者对 Redis 的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

16.Redis如何设置密码及验证密码

设置密码:config set requirepass 123456
授权密码:auth 123456

17.说说Redis哈希槽的概念

Redis集群没有使用一致性hash,而是引入哈希槽的概念。Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。

18.Redis集群的主从复制模型是怎样的

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品

19.redis集群会有写操作丢失吗,为什么

redis并不能保证数据的强一致性,这意味着在实际中集群在特定的条件下可能会丢失写操作。

20.redis集群之间是如何复制的

异步复制

21.redis集群最大节点个数是多少

16384个

22.redis集群如何选择数据库

redis集群目前无法做数据库选择,默认在0数据库。

23.怎么测试redis的连通性

ping

24.redis中的管道有什么y用

一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。
这就是管道,是一种几十年来广泛使用的技术,例如许多POP3协议已经实现支持这个功能,大大加快了从服务器下载新邮件的过程。

25.怎么理解redis事务

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

26.Redis事务相关的命令有哪个

MULTI、EXEC、DISCARD、WATCH

27.Redis key 的过期时间和永久有效分别怎么设置?

EXPIRE 和 PERSIST 命令。

28.Redis如何做内存优化?

尽可能使用散列表(hashes),散列表(散列表里存储的数少)使用的内存非常小,所以应该尽可能的将你的数据模型抽象抽象到一个散列表里面。如你的web系统中有一个用户对象,不要为这个用户名称、姓氏、邮箱】密码设置单独的key,而是应用于把这个用户的所有信息存储到一张散列表里。

29.redis回收进程如何工作的

一个客户端运行了新的命令,添加了新的数据
Redis检查内存使用情况,如果大于maxmemory的限制,则根据设定好的策略进行回收。
一个新的饿命令被执行,等等。
所以我们不断的穿越内存限制的边界,通过不断到边界然后不断的护手到边界以下。
如果一个命令的结果导致大量内存被使用(如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。

30.Redis回收使用的是什么算法

LRU算法

31.为什么要做redis分区?

分区可以让redis管理更大的内存,redis将可以使用所有机器内存。如果没有分区,你最多只能使用一台机器的内存,分区使redis的计算能力通过简单的增加计算机得到成倍提升,redis的网络宽带也会随着计算机和网卡的增加而成倍的增加。

32.你知道哪些redis分区实现方案?

客户端分区:就是在客户端就已经决定数据会别存储到哪个redis节点或者从哪个redis节点读取。大多数客户端已经实现了客户端分区。
代理分区:意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分区规则决定请求哪些redis实例,然后根据redis的响应结果返回客户端。redis和memcached的一种代理实现就是TwemProxy
查询路由:客户端随机请求任意一个redis实例,然后由redis将请求转发给正确的redis节点。redis Cluster实现了一种混合形式的查询路由,但并不是直接将请求从一个redis转发到另一个redis节点,而是在客户端的帮助下直接redisrected到正确的redis节点。

33.Redis 如何做大量数据插入?

redis2.6开始Redis支持一种新的,称之为pipe mode的新模式,用于执行大量数据插入工作。

34.Redis 持久化数据和缓存怎么做扩容?

如果redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。
如果redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即redis节点需要动态变化的情况),必须使用可以在运行是进行数据再平衡的一套系统,而当前只有redis集群可以做到这样。

35.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 节点,能做到最大程度对用户透明地数据再平衡,但其他一些客户端分区或者代理分区方法则不支持这种特性。然而,有一种预分片的技术也可以较好的解决这个问题。

36.分布式 Redis 是前期做还是后期规模上来了再做好?为什么

既然redis是如此的轻量(单实例只使用1M内存),为防止以后的扩容,做好的办法就是一开始就启动较多实例。几遍你只有一台服务器,你也可以一开始就让redis以分布式的方式运行,使用分区,在同一台服务器上启动多个实例。
一开始就多设置几个redis实例,例如32或 64个实例,对大多数用户来说这操作起来可能比较麻烦,但是从长久来看做这点牺牲是值得。
这样的话,当你的数据不断增长,需要更多的redis服务器时,你需要做的就是仅仅将redis实例从一台服务器迁移到另外一台服务器而已(而不用考虑重新分区问题)。一旦你添加了另一台服务器,你需要将你一半的redis实例从第一台服务器迁移到第二台服务器。

37.Twemproxy 是什么?

Twemproxy 是 Twitter 维护的(缓存)代理系统,代理 Memcached 的 ASCII 协议和 Redis协议。它是单线程程序,使用 c 语言编写,运行起来非常快。它是采用 Apache 2.0 license的开源软件。
Twemproxy 支持自动分区,如果其代理的其中一个 Redis 节点不可用时,会自动将该节点排除(这将改变原来的 keys-instances 的映射关系,所以你应该仅在把 Redis 当缓存时使用 Twemproxy)。
Twemproxy 本身不存在单点问题,因为你可以启动多个 Twemproxy 实例,然后让你的客户端去连接任意一个 Twemproxy 实例。
Twemproxy 是 Redis 客户端和服务器端的一个中间层,由它来处理分区功能应该不算复杂,并且应该算比较可靠的。

38.支持一致性哈希的客户端有哪些?

Redis-rb、PRedis 等。

39.Redis 与其他 key-value 存储有什么不同?

Redis 有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis 的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis 运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,应为数据量不能大于硬件内存。在内存数据库方面的另一个优点是, 相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样 Redis 可以做很多内部复杂性很强的事情。 同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

40.Redis 的内存占用情况怎么样?

给你举个例子: 100 万个键值对(键是 0 到 999999 值是字符串“hello world”)在我的32 位的 Mac 笔记本上 用了 100MB。同样的数据放到一个 key 里只需要 16MB, 这是因为键值有一个很大的开销。 在 Memcached 上执行也是类似的结果,但是相对 Redis的开销要小一点点,因为 Redis 会记录类型信息引用计数等等。
64 位的系统比 32 位的需要更多的内存开销,尤其是键值对都较小时,这是因为 64 位的系统里指针占用了 8 个字节。 但是,当然,64 位系统支持更大的内存,所以为了运行大型的 Redis 服务器或多或少的需要使用 64 位的系统。

41.都有哪些办法可以降低 Redis 的内存使用情况呢?

如果你使用的是 32 位的 Redis 实例,可以好好利用 Hash,list,sorted set,set 等集合类型数据,因为通常情况下很多小的 Key-Value 可以用更紧凑的方式存放到一起。

42、查看 Redis 使用情况及状态信息用什么命令?

info

43、Redis 的内存用完了会发生什么?

如果达到设置的上限,Redis 的写命令会返回错误信息(但是读命令还可以正常返回。)或者你可以将 Redis 当缓存来使用配置淘汰机制,当 Redis 达到内存上限时会冲刷掉旧的内容。

44、Redis 是单线程的,如何提高多核 CPU 的利用率?

可以在同一个服务器部署多个 Redis 的实例,并把他们当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的,所以,如果你想使用多个 CPU,你可以考虑一下分片(shard)。

45、一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set 他们最多能存放多少元素?

理论上 Redis 可以处理多达 232 的 keys,并且在实际中进行了测试,每个实例至少存放了 2亿 5 千万的 keys。我们正在测试一些较大的值。任何 list、set、和 sorted set 都可以放 232 个元素。
换句话说,Redis 的存储极限是系统中的可用内存值。

46、Redis 常见性能问题和解决方案?

(1) Master 最好不要做任何持久化工作,如 RDB 内存快照和 AOF 日志文件
(2) 如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性,Master 和 Slave 最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2<- Slave3… 这样的结构方便解决单点故障问题,实现 Slave 对 Master 的替换。如果 Master 挂了,可以立刻启用 Slave1 做 Master,其他不变。

47、Redis 提供了哪几种持久化方式?

RDB 持久化方式能够在指定的时间间隔能对你的数据进行快照存储. AOF 持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF 命令以 Redis 协议追加保存每次写的操作到文件末尾.Redis 还能对AOF 文件进行后台重写,使得 AOF 文件的体积不至于过大. 如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式. 你也可以同时开启两种持久化方式, 在这种情况下, 当 Redis 重启的时候会优先载入 AOF文件来恢复原始的数据,因为在通常情况下 AOF 文件保存的数据集要比 RDB 文件保存的数据集要完整. 最重要的事情是了解 RDB 和 AOF 持久化方式的不同,让我们以 RDB 持久化方式开始。

48、如何选择合适的持久化方式?

一般来说, 如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失,那么你可以只使用 RDB 持久化。有很多用户都只使用 AOF 持久化,但并不推荐这种方式:因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快,除此之外, 使用 RDB 还可以避免之前提到的 AOF 程序的 bug。

49、修改配置不重启 Redis 会实时生效吗?

针对运行实例,有许多配置选项可以通过 CONFIG SET 命令进行修改,而无需执行任何形式的重启。 从 Redis 2.2 开始,可以从 AOF 切换到 RDB 的快照持久性或其他方式而不需要重启 Redis。检索 ‘CONFIG GET *’ 命令获取更多信息。但偶尔重新启动是必须的,如为升级 Redis 程序到新的版本,或者当你需要修改某些目前CONFIG 命令还不支持的配置参数的时候。

你可能感兴趣的:(java面试宝典,redis,面试,java)