redis相关面试题

Redis:Remote Dictionary Server(远程数据服务),jedis.exists(token);//服务端判断redis中,是否存在token。

1.Redis怎么操作token

将token作为value,账户的id作为key,存储在redis中,设置key过期时间

每次登录都去redis中查询该账户的登录是否过期,没有过期则删掉原来的id,token,将新生成token作为value存入redis中。过期则没有该账户信息,则重新存入redis中

用户每次请求接口 都需要验证是否在登录状态。(这里需要一个filter或则intercepter)获取token。解析token。将id从token中解析出来去。然后将用户的id作为key去redis中查询token。 查询为空则表示登录过期。不为空则将解析出来的token和redis中的token作对比,如果相同,则用户状态正常则继续请求接口。如果不相同,则账号在其他设备登录.

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

过期时间expire 和 永久有效persist命令。

persist命令:移除某个键的过期时间,使其永久不过期

有效时间设置 四种处理策略

expire 将key的生存时间设置为ttl秒 [ɪkˈspaɪə(r)]

pexpire 将key的生成时间设置为ttl毫秒

expireat 将key的过期时间设置为timestamp所代表的的秒数的时间戳

pexpireat 将key的过期时间设置为timestamp所代表的的毫秒数的时间戳

过期时间

删除 过期时间的方法有三种:

1、删除这个key,使用del command

2、用set or getset 命令会将key的expiration清空,事实上set和getset命令是替换了key对应的value,所以key的过期时间也就不复存在。所以,需要注意的是:incr,LPUSH,HSET命令是不会改变key的过期时间的。原来是多久,这三条命令执行完之后还是多久。

3、使用persist命令 清楚key的过期时间。

刷新过期时间:

多次调用expire key 100 可以刷新key的过期时间。

 如何更新生存时间

可以对一个已经带有生存时间的 key 执行EXPIRE命令,新指定的生存时间会取代旧的生存时间。过期时间的精度已经被控制在1ms之内,主键失效的时间复杂度是O(1),

EXPIRE和TTL命令搭配使用,TTL可以查看key的当前生存时间。设置成功返回 1;当 key 不存在或者不能为 key 设置生存时间时,返回 0 。

最大缓存配置

在 redis 中,允许用户设置最大使用内存大小

server.maxmemory

默认为0,没有指定最大缓存,如果有新的数据添加,超过最大内存,则会使redis崩溃,所以一定要设置。redis 内存数据集大小上升到一定大小的时候,就会实行数据淘汰策略。

返回值:

返回值:1代表 过期时间 被设置。

返回值:0代表key不存在 或者timeout不能被设置。

过期键

过期键的处理就是把过期键删除,这里的操作主要是针对过期字段处理的。

Redis中有三种处理过期键 策略:定时删除、惰性删除和定期删除。

主从服务器 删除过期键:RDB持久化、AOF持久化和复制功能。

redis如何清除过期keys 方式:主动方式,和被动方式

1、主动方式:当client访问某一个key,redis会check key是否过期,如果已经过期,则被删除。定期删除

2、被动方式:不是所有的key都能被client访问。redis有一套默认的机制,如 惰性删除

2、处理过期keys的命令

2.1、expire [ɪkˈspaɪə(r)] : 设置过期时间。格式是:expire key值 秒数

2.2、expireat : 设置过期时间,格式是:expireat key值 到期的时间戳

2.3、ttl : 查看还有多少秒过期,格式是:ttl key值, -1表示永不过期,-2表示已经过期

2.4、persist : 设置成永不过期,格式是:persist key值 删除key的过期设置;

另外使用set或者getset命令为键赋值的时候,也会清除键的过期时间。

2.5、pttl:查看还有多少毫秒过期,格式是:pttl key值

2.6、pexpire : 设置过期时间,格式是:pexpire key值 毫秒数

2.7、pexpireat : 设置过期时间,格式是:pexpireat key值 到期的时间戳

3. 什么是缓存穿透?如何避免?

什么是缓存雪崩?何如避免?

缓存穿透:一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。

如何避免 缓存穿透?

1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。

2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

缓存雪崩

当 缓存服务器重启 或者 大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。

如何避免 缓存雪崩?

1:在 缓存失效 后,通过加锁或者队列来控制 读数据库 写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

2:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期

3:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

4.Redis是什么?端口号6379 ?简述优缺点

Redis 是一个基于内存的高性能key-value数据库。整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。

Ajax应用场景:数据验证 按需取数据 自动更新页面

Redis 优点4个:

1) redis具有快速和持久化的特征,速度快,因为数据存在内存中,

2) 支持丰富数据类型,支持string,list,set,sorted set,hash

*1.字符串(strings)*2.字符串列表(lists)*3.字符串集合(sets)*4.有序字符串集合(sorted sets*5.哈希(hashes)

3) 支持事务,操作都是原子性

4) 丰富的特性:可用于缓存 消息,按key设置过期时间,过期后将会自动删除

5)分布式 读写分离模式

6)单线程,用redis 队列技术并将访问变为串行访问,消除了传统数据库串行控制的开销

Redis的主要缺点是:

数据库容量受到 物理内存 的限制,不能用作 海量数据 的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

3.Redis的应用场景?

(1)会话缓存(2)全页缓存(FPC)(3)队列(4)排行榜/计数器(5)发布/订阅

Session共享(单点登录)

5.Redis相比memcached有哪些优势?区别是什么?

(1)redis支持更为丰富的数据类型 memcached所有的值均是简单的字符串,

(2) redis的速度比memcached快很多

(3) redis可以持久化其数据

redis与memcache区别

a.存储方式: memcache存在内存中,redis存在硬盘中,保证数据持久化

b.数据类型: memcache对数据类型支持相对简单,redis有复杂的数据类型

c.使用底层模型不同:底层实现方式以及客户端之间通信的应用协议不一样

d. memcache只有1MB .而redis最大可以达到1G

6、 什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么?

持久化 就是 把内存的数据 写到 磁盘中去,防止服务宕机了,内存数据丢失。

Redis 提供了两种持久化方式:RDB(默认) 和AOF

应用场景:RDB适合 数据备份 和 大规模的 数据恢复 , AOF 适合 保存数据

RDB优势:*用后,整个Redis数据库将只包含一个文件,方便进行备份

*RDB数据恢复速度 比 AOF数据恢复速度 快, 适合大规模的数据恢复。

RDB劣势: *1 RDB数据 比 AOF数据保存间隔较长

*2数据的 完整性 和 一致性 不高,

*3备份时占用内存

AOF 优势: *1 让 Redis 变得非常耐久 *2 数据的完整性和一致性更高

AOF缺点:因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。

内存与硬盘的区别和联系:

区别;

1、内存属于计算机 内存储器,硬盘属于计算机 外存储器,如C盘、D盘、E盘,

2、内存是计算机的工作场所,硬盘用来存放暂时不用的信息;

3、内存是半导体材料制作,硬盘是磁性材料制作;

4、内存中的信息会随掉电而丢失,硬盘中的信息可以长久保存。

内存与硬盘的联系也非常密切:这里只提一点:硬盘上的信息永远是暂时不用的,要用吗?请装入内存!CPU与硬盘不发生直接的数据交换,CPU只是通过控制信号指挥硬盘工作,硬盘上的信息只有在装入内存后才能被处理。

7、Redis官方为什么不提供Windows版本?

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

8、一个字符串类型的值能存储最大容量是多少?

512M

9、为什么Redis需要把所有数据放到内存中?

Redis为 达到最快的读写速度 将数据都读到内存中,并通过 异步的方式 将数据 写入 磁盘。

所以redis具有快速和数据持久化的特征。如果不将 数据 放在 内存 中,磁盘I/O速度会严重影响redis的性能。

10、Redis集群方案应该怎么做?都有哪些方案?

Redis 集群是一个可以在多个 Redis 节点之间 进行 数据共享的设施。

Redis集群方案 3个:官方Redis Cluster [ˈklʌstə(r)] ;通过Proxy分片[ˈprɒksi];客户端分片(Smart Client)。

Redis集群一共由四个角色组成:

Zookeeper

Redis实例

Sentinel [ˈsentɪnl]:redis自带的主从切换工具,我们通过sentinel实现集群高可用。

客户端(Smart Client)

1.codis目前用的最多。包括:Codis Proxy:CodisRedis,Codisconfig,ZooKeeper

支持在 节点数量改变情况下,旧节点数据可恢复到新hash节点。

2. redis cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。

3.在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key 进行hash计算,然后去对应的redis实例操作数据。 这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。

11、Redis集群方案什么情况下会导致整个集群不可用?

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

12、MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?

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

Redis有哪几种数据淘汰策略?

1、volatile-lru:只对设置了过期时间的key进行LRU(默认值(Least recently used,最近最少使用)) [ˈvɒlətaɪl]

2、allkeys-lru : 删除lru算法的key

3、volatile-random:随机删除即将过期key

4、allkeys-random:随机删除

5、volatile-ttl : 删除即将过期的

6、noeviction : 永不过期,返回错误 no- [ɪ'vɪkʃn]

redis和mysql的区别总结

(1)类型上:mysql是关系型数据库,redis是缓存数据库,是 非关系型数据库

(2)作用上:mysql用于持久化的存储数据到 硬盘,功能强大,但是速度较慢

redis用于存储 使用较为频繁的数据到缓存中,读取速度快

(3)需求上:mysql和redis因为需求的不同,一般都是配合使用。

13.redis连接数与最大连接数

查看

方法1:在redis-cli命令行使用:info clients [klaɪnts]可以查看当前的redis连接数

方法2:config get maxclients 可以查询redis允许的最大连接数10000

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

Jedis、Redisson、lettuce ['letɪs] 等等,官方推荐使用Redisson。

15、Redis和Redisson有什么关系?

Redisson是一个在Redis的基础上实现的Java驻内存数据网格。 它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。

16、Jedis与Redisson对比有什么优缺点?

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

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

17、Redis如何设置密码及验证密码?

设置密码:config set requirepass 123456

查看密码:config get requirepass

验证密码(授权密码):auth 123456

18、说说Redis哈希槽的概念?

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

19、Redis集群的 主从复制模型( Master-Slave模型是怎样的?

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型, 即Master-Slave模型 每个节点都会有1-N个复制品.其中一个为主节点,其余的为从节点,如果主节点下线了,集群就会把这个主节点的一个从节点设置为新的主节点,继续工作 Master以写为主,Slave以读为主。作用:1、读写分离;2、容灾恢复。

20、Redis集群会有写操作丢失吗?为什么?

集群 在 特定的条件下 可能会丢失写操作。因为Redis不能保证 数据的 强一致性

Redis Cluster写数据丢失的场景

场景有两种:1.异步复制 2. 主从切换

redis哨兵主备切换的数据丢失问题:异步复制、集群脑裂

解决异步复制和脑裂导致的数据丢失

min-slaves-to-write 1

min-slaves-max-lag 10

21、Redis集群之间是如何复制的?

异步复制

22、Redis集群最大节点个数是多少?

16384个。

23、Redis集群如何选择数据库?

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

24、怎么测试Redis的连通性?

ping

25、Redis中的管道Pipeline有什么用?

一次请求/响应服务器 能实现处理 新的请求,即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。

可以在 大量数据 需要 一次性操作 完成的时候,使用管道Pipeline进行批处理, 将一大堆的操作 合并成 一次操作,可以 减少链路层的时间消耗,

好处是极大的减少了网络IO的耗时,从而提高了效率。

26、怎么理解Redis事务?

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

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

27、Redis事务相关的命令有哪几5个?

discard命令 取消事务,发起执行事务块里的所有命令。

exec命令 执行所有事务块内的命令 [ɪgˈzek]

multi命令标记一个事务块的开始

unwatch命令 取消watch命令对所有key的监视

watch命令监视一个(或多个)key,如果在执行事务之前这个(这些)key被其他命令所改动,你们事务将被打断

redis事务的原理是先将属于一个事务的事务发送给redis,然后依次执行这些命令

redis事务注意点

1、redis不支持回滚,如果事务中有错误的操作,无法回滚到处理前的状态,需要开发者处理。

2、redis是单线程的服务,所以事务中不能将 等待资源的操作 立即返回,超时时间失效,因为事务如果等待,其他命令将无法执行。

29、Redis如何做内存优化?

尽可能使用 散列表(hashes),因为 散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的 数据模型 抽象到一个散列表里面。

30、Redis回收进程如何工作的?Redis回收使用的是什么算法?

一个客户端运行了新的命令,添加了新的数据。Redi检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收。Redis内存回收:LRU算法

31.Redis的并发竞争问题如何解决?

Redis为单进程单线程模式,采用 队列模式 将 并发访问 变为 串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。对此有2种解决方法:

1. 客户端角度,为保证每个客户端间正常有序与Redis进行通信,对 连接进行 池化,同时对客户端读写Redis操作,采用内部锁synchronized或 lock

 2.服务器角度,利用setnx实现锁。

32、Redis是单进程单线程的?Redis是单进程单线程的,Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。

33.Redis为什么是单线程的?

多线程处理会涉及到锁,而且多线程处理会涉及到线程切换而消耗CPU。因为CPU不是Redis的瓶颈,Redis的瓶颈最有可能是 机器内存 或者 网络带宽。单线程无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来解决。

©著作权归作者所有:来自51CTO博客作者浅嫣的原创作品,如需转载,请注明出处,否则将追究法律责任

转载地址:https://blog.51cto.com/14150615/2356953

相关推荐