redis面试题

1.什么是redis?

Redis本质是一个Key_Value类型的内存数据库,整个数据库系统加载在内存当中进行操作,

定期通过异步操作把数据库数据使用Copy_on_write技术持久化到硬盘中保存。

2.redis的优点:

支持多种数据结构,单个value的最大限制是1GB

每秒超过10万次的读写操作。

3.redis的缺点:

数据库容量受到物理内存的限制。

不能用作海量数据的高新能读写。

因此,redis适合的场景主要局限在较小数据量的高性能的操作和运算。

4.redis支持的数据类型:

String , List, Set.Sorted Set .hashes

5.redis主要消耗什么物理资源?

redis是一种基于内存高性能的数据库,主要依赖于内存。

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

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

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

8.为什么redis需要把所有数据放在内存中?

redis为了达到最快的读写速度将数据都读到内存中,并通过异步将数据写入磁盘。所以redis具有数据持久化的特征,

如果不将数据放入内存中,磁盘I/O速度会影响redis性能。如果设置了最大使用的内存,则数据已有记录数达到内存

限值后不能继续再插入新值。

9.mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?

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

redis 提供 6种数据淘汰策略:

voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

    volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

    volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

    allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

    allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

    no-enviction(驱逐):禁止驱逐数据

10.Redis支持的Java客户端都有哪些?官方推荐用哪个?

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

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

Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;

Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,

不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,

从而让使用者能够将精力更集中地放在处理业务逻辑上。

13.Redis如何设置密码及验证密码?

设置密码:config set requirepass 123456

        授权密码:auth 123456

14.Redis哈希槽的概念?

Redis集群没有使用一致性hash,而是引入了哈希槽的概念

Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,

集群的每个节点负责一部分hash槽。

15.Redis集群会有写操作丢失吗?为什么?

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

16.怎么理解Redis事务?

事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。

事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

16.Redis事务相关的命令有哪几个?

MULTI(开始)、EXEC(结束)、DISCARD(撤销)、WATCH(乐观锁)

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

EXPIRE和PERSIST命令。

18.Redis如何做内存优化?

尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,

所以你应该尽可能的将你的数据模型抽象到一个散列表里面。

比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,

邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面.

19.Redis回收进程如何工作的?

一个客户端运行了新的命令,添加了新的数据。

Redi检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收。

一个新的命令被执行,等等。

所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。

如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键)

,不用多久内存限制就会被这个内存使用量超越。

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

Redis2.6开始redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工作。

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

如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。

    如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。

否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,

而当前只有Redis集群可以做到这样。

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

如果你使用的是32位的Redis实例,可以好好利用Hash,list,sorted set,set等集合类型数据

,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起。

23.Redis的内存用完了会发生什么?

如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)

或者你可以将Redis当缓存来使用配置淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。


1.什么是redis?Redis本质是一个Key_Value类型的内存数据库,整个数据库系统加载在内存当中进行操作,定期通过异步操作把数据库数据使用Copy_on_write技术持久化到硬盘中保存。2.redis的优点:支持多种数据结构,单个value的最大限制是1GB每秒超过10万次的读写操作。3.redis的缺点:数据库容量受到物理内存的限制。不能用作海量数据的高新能读写。因此,redis适合的场景主要局限在较小数据量的高性能的操作和运算。4.redis支持的数据类型:String , List, Set.Sorted Set .hashes5.redis主要消耗什么物理资源?redis是一种基于内存高性能的数据库,主要依赖于内存。6.Redis官方为什么不提供Windows版本?因为目前Linux版本已经相当稳定,而且用户量很大,无需开发windows版本,反而会带来兼容性等问题。7.一个字符串类型的值能存储的最大容量是512MB8.为什么redis需要把所有数据放在内存中?redis为了达到最快的读写速度将数据都读到内存中,并通过异步将数据写入磁盘。所以redis具有数据持久化的特征,如果不将数据放入内存中,磁盘I/O速度会影响redis性能。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续再插入新值。9.mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰    volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰    volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰    allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰    allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰    no-enviction(驱逐):禁止驱逐数据10.Redis支持的Java客户端都有哪些?官方推荐用哪个?Redisson、Jedis、lettuce等等,官方推荐使用Redisson。12.Jedis与Redisson对比有什么优缺点?Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。13.Redis如何设置密码及验证密码?设置密码:config set requirepass 123456        授权密码:auth 123456
14.Redis哈希槽的概念?Redis集群没有使用一致性hash,而是引入了哈希槽的概念Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。
15.Redis集群会有写操作丢失吗?为什么?     Redis并不能保证数据的一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作
16.怎么理解Redis事务?事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。16.Redis事务相关的命令有哪几个?MULTI(开始)、EXEC(结束)、DISCARD(撤销)、WATCH(乐观锁)
17.Redis key的过期时间和永久有效分别怎么设置?EXPIRE和PERSIST命令。
18.Redis如何做内存优化?尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面.19.Redis回收进程如何工作的?一个客户端运行了新的命令,添加了新的数据。Redi检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收。一个新的命令被执行,等等。所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。20.Redis如何做大量数据插入?Redis2.6开始redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工作。
21.Redis持久化数据和缓存怎么做扩容?如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。    如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。22.都有哪些办法可以降低Redis的内存使用情况呢?如果你使用的是32位的Redis实例,可以好好利用Hash,list,sorted set,set等集合类型数据,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起。23.Redis的内存用完了会发生什么?如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)或者你可以将Redis当缓存来使用配置淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。


























原文地址:https://www.cnblogs.com/zhanggguoqi/p/10663843.html