Redis面试题——第一篇

1. Redis使用场景有哪些

与传统数据库不同的是Redis的数据是存在内存中的,也就是说他是内存数据库,所以读写速度非常快,因此Redis被广泛用于缓存方向。
Redis的使用场景除了做缓存外,也经常用来做分布式锁,甚至是消息队列。 Redis提供了多种数据类型来支持不同的业务场景。

2. Redis和Memcache的区别和共同点

共同点:

  1. 都是基于内存的数据库,一般都用来当作缓存使用。
  2. 都有过期策略
  3. 两者性能都非常高。

区别:

  1. Redis支持 更丰富的数据类型(支持更复杂的应用场景)。Redis不仅支持简单的k/v类型的数据,同时还提供list、set、zset、hash等结构的存储。Memcache只支持最简单的k/v数据类型。
  2. Redis支持数据的持久化, 可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而Memcache把数据全部存在内存中。
  3. Redis有灾难恢复机制,可以把缓存中的数据持久化到磁盘上。
  4. Memcache没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是Redis目前是原生支持cluster模式。
  5. Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的多路IO复用模型。
  6. Redis支持发布订阅模型,Lua脚本、事务等。
  7. Memcached过期数据的删除策略只用了惰性删除,而Redis同时使用了惰性删除+定期删除。

3. Redis BitMap的用法

bitMap存储的是连续的二进制数字(0和1),通过bitmap,只需要一个bit位来表示某个元素对应的值或者状态。key就是对应元素本身。因为8个bit可以组成一个byte,所以bitmap本身会极大的节省存储空间。
常用命令:setbit、getbit、bitcount、bitop
应用场景:适合需要保存状态信息(比如是否签到、是否登录。。。)
例如,很多网站为了分析用户的喜欢,需要研究点赞过的内容
setbit beauty_girl_oo1 uid 1 //记录喜欢过001号小姐姐

4. 说一下Redis哈希槽的概念

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

5. Redis为什么是单线程的

  1. Redis的性能瓶颈不在CPU、主要在内存和网络
  2. 多线程就会存在死锁、线程上下文切换等问题,甚至会影响性能。

6. Redis6.0之后为何引入了多线程

Redis6.0引入多线程主要是为了提高网络IO读写性能,因为这个算是Redis中的性能瓶颈(Redis中的性能瓶颈主要受限于内存和网络)。
虽然,Redis6.0引入了多线程,但是Redis的多线程只是在网络数据的读写这类耗时操作上使用了,执行命令仍然是单线程顺序执行。

7. 过期数据的删除策略

常用的过期数据的删除策略就两个

  1. 惰性删除:只会在取出key的时候才对数据进行过期检查。这样对CPU友好,但是可能会造成太多过期key没有被删除。
  2. 定期删除:每隔一段时间抽取一批key执行删除过期key操作。并且,Redis底层会通过限制删除操作执行的时长和频率来减少操作删除对CPU时间的影响。

定期删除对内存更加友好,惰性删除对CPU更加友好。两者各有千秋,所以Redis采用的是定期删除+惰性删除策略。

8. Redis淘汰策略有哪些

Redis提供6种数据淘汰策略

  1. volatile-lru:从已经设置过期时间的数据集中挑选出最近最少使用的数据淘汰。
  2. volatile-random:从已经设置过期时间的数据集中随机淘汰。
  3. volatile-ttl: 从已经设置过期时间的数据集中挑选将要过期的数据淘汰。
  4. allkeys-lru: 从所有的key中,选择最近最少使用的淘汰
  5. allkeys-ttl:从所有key中,选择即将过期的淘汰
  6. allkeys-random:从所有key中,随机选择数据淘汰。

9. Redis持久化有几种方式

Redis不同于Memcache的重要一点是,Redis支持持久化,且提供两种持久化方式,分别是快照(RDB)、追加写入(AOF)。

  • 快照持久化(RDB):Redis可以通过创建快照来获得存储在内存中的数据在某个时间点上的副本。Redis创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本。还可以将快照留在原地以便重启服务器的时候使用。
    快照持久化是Redis默认采用的持久化方式,在Redis.conf配置文件中默认有以下配置
save 900 1. # 900s以后,如果至少有一个key发生变化,Redis就会自动触发BGSAVE
save 300 10  # 300s以后,如果至少有10个key发生变化,Redis就会自动触发BGSAVE
save 60 10000 # 60s以后,如果至少有10000个key发生变化。
  • AOF:与快照持久化相比,AOF持久化的实时性更好,因此已经成为主流的持久化方案。默认情况下Redis没有开启AOF方式的持久化,可以通过appendonly参数开启。开启AOF持久化每执行一条会更改Redis中数据的命令,Redis就会将该命令写入磁盘中的AOF文件。
appendonly yes

在Redis的配置文件中存在三种不同的AOF持久化方式,他们分别是:

appendfsync always.   #每次有数据修改时都会写入AOF文件
appendfsync everysec.  #每秒钟同步一次,显示的将多个写命令同步到磁盘
appendfsync no. # 让操作系统决定何时进行同步

为了兼顾数据和写入性能,用户可以考虑appendfsync everysec选项,让Redis每秒同步一次AOF文件,Redis性能几乎没受到任何影响,而且,这样即使出现系统崩溃,用户最多只会丢失一秒之内的数据。

10. pipeline有什么好处,为什么要用pipeline

Redis中的pipeline可以将多次IO往返的时间缩减为1次

11. 缓存穿透和缓存击穿和缓存雪崩

缓存击穿是指缓存中 某个热点数据 在过期或者被删除后,突然失效,导致大量请求同时到达数据库。
缓存穿透:是指请求缓存中根本不存在的数据。同时在数据库中也不存在,导致每次请求都需要去数据库查询一遍。
缓存雪崩:指缓存中大量数据同时失效。

12. 怎么保证缓存和数据库数据的一致性

合理设置缓存的过期时间
新增、更改、删除数据库操作时同步更新Redis,可以使用事务机制保证数据的一致性。

13. Redis如何做延迟队列

使用SortedSet,拿时间戳作为score,消息内容作为key,调用zadd来生产消息, 消费者使用zrangebyscore指令获取N秒之前的数据轮询进行处理。

`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值