Redis面试七连问,你知道哪些?

Redis常用面试题

  1. 使用Redis有哪些好处?
  2. MySQL里有2000w的数据,Redis只存20w的数据,如何保证Redis中的数据都是热点数据?
  3. 请用Redis和Python实现一段恶意登录保护的代码,限制1小时内每用户id最多只能登录5次。
  4. Redis持久化的几种方式?
  5. Redis的并发竞争问题如何解决?
  6. 如果使用Redis做缓存,出现缓存雪崩问题如何解决?
  7. 最后请解释一下Redis的集群?

参考答案

  1. 使用Redis有哪些好处?
    解析:好处嘛,可以回答Redis的特性。
  • 速度快:因为数据存在内存中,类似于HashMap,查找和操作的时间复杂度都是O(1)(指定下标的查找,时间复杂度为O(1))。
  • 支持丰富数据类型:支持string、list、set、sorted set、hash。
  • 支持事务:操作都是原子性。
  • 丰富的特性:可用于缓存、消息,按key设置过期时间,过期后将会自动删除。

  1. MySQL里有2000w的数据,Redis只存20w的数据,如何保证Redis中的数据都是热点数据?
    解析:当MySQL有2000w的数据时,Redis应该设置数据淘汰策略,也是这道题的关键,考察的是Redis的6种数据淘汰策略。
  • no-eviction:当内存不足以容纳新写入数据时,新写入操作会报错。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

  1. 请用Redis和Python实现一段恶意登录保护的代码,限制1小时内每用户id最多只能登录5次。
    使用列表实现:列表中每个元素代表登录时间,只要最后的第5次登录时间和现在时间差不超过一小时就禁止登录,代码如下:
import redis
import sys
import time

r = redis.StrictRedis(host="127.0.0.1", port="6379", db=0)
try:
    id = sys.argv[1]
except:
    print('input argument error')
    sys.exit(0)
if r.llen(id) >= 5 and time.time() - float(r.lindex(id, 4)) <= 3600:
    print("你登录频繁,请在一小时后再登录")
    r.lpush(id, time.time())
# login_func()

  1. Redis持久化的几种方式?
    持久化不清楚从的请参考这篇文章:传送门
  • 一种是RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(通俗讲是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化)。
  • 另一种是AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集(通俗讲是将Reids的操作日志以追加的方式写入文件)。

  1. Redis的并发竞争问题如何解决?
    Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没锁的概念,Redis对于多个客户端连接并不存在竞争,但是在Jedis客户端对Redis进行并发访问时会发生连接超时、阻塞、客户端关闭连接的问题,解决如下:
  • 客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。
  • 服务器角度,利用setnx实现锁。

  1. 如果使用Redis做缓存,出现缓存雪崩问题如何解决?
  • 给缓存加上一定区间内的随机生效时间,不同的key设置不同的失效时间,避免同一时间集体失效。比如以前是设置10分钟的超时时间,那每个Key都可以随机8-13分钟过期,尽量让不同Key的过期时间不同。
  • 采用多级缓存,不同级别缓存设置的超时时间不同,及时某个级别缓存都过期,也有其他级别缓存兜底。
  • 利用加锁或者队列方式避免过多请求同时对服务器进行读写操作。

  1. 最后请解释一下Redis的集群?
  • Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation)。
  • Redis 集群不支持那些需要同时处理多个键的 Redis 命令,因为执行这些命令需要在多个 Redis 节点之间移动数据,并且在高负载的情况下,这些命令将降低 Redis 集群的性能,并导致不可预测的行为。
  • Redis 集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。
  • Redis 集群提供了以下两个好处:
    在多个节点之间自动分割数据集的能力
    当节点子集发生故障或无法与集群的其他部分通信时,继续操作的能力
发布了53 篇原创文章 · 获赞 69 · 访问量 1963
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览