redis面试题
Posted zhanggguoqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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达到内存上限时会冲刷掉旧的内容。
以上是关于redis面试题的主要内容,如果未能解决你的问题,请参考以下文章