Redis (高频)面试题

# 1 Redis基础篇

> ### 1、简单介绍一下Redis优点和缺点?

优点:

1、本质上是一个 Key-Value 类型的内存数据库,很像memcached

2、整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬盘上进行保存

3、因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10 万次读写操作,是已知性能最快的Key-Value DB

4、Redis最大的魅力是支持保存多种数据结构(string,list,set,hash,sortedset),此外单个 value 的最大限制是 1GB,

不像memcached只能保存 1MB 的数据

5、Redis也可以对存入的 Key-Value 设置 expire 时间,因此也可以被当作一个功能加强版的memcached 来用

缺点:

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

运算上。

> ### 2、系统中为什么要使用缓存?

主要从“高性能”和“高并发”这两点来看待这个问题。

高性能:

假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的

时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!

<img src="images/image-20220218134011125.png" alt="image-20220218134011125" style="zoom:50%;" /> 

高并发:

直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓

存这里而不用经过数据库。

<img src="images/image-20220218134126349.png" alt="image-20220218134126349" style="zoom:50%;" /> 

> ### 3、常见的缓存同步方案都有哪些?(高频)

同步方案:更改代码业务代码,加入同步操作缓存逻辑的代码(数据库操作完毕以后,同步操作缓存)

异步方案:

1、使用消息队列进行缓存同步:更改代码加入异步操作缓存的逻辑代码(数据库操作完毕以后,将要同步的数据发送到MQ中,MQ的消费者从MQ中获取数据,然后更新缓存)

2、使用阿里巴巴旗下的canal组件实现数据同步:不需要更改业务代码,部署一个canal服务。canal服务把自己伪装成mysql的一个从节点,当mysql数

据更新以后,canal会读取binlog数据,然后在通过canal的客户端获取到数据,更新缓存即可。

> ### 4、Redis常见数据结构以及使用场景有哪些?(高频)

1、 **string**

常见命令:set、get、decr、incr、mget等。

基本特点:string数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。

应用场景:常规计数:微博数,粉丝数等。

2、**hash**

常用命令: hget、hset、hgetall等。

基本特点:hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。 

应用场景:存储用户信息,商品信息等。

3、**list**

常用命令: lpush、rpush、lpop、rpop、lrange等。

基本特点:类似于Java中的list可以存储多个数据,并且数据可以重复,而且数据是有序的。

应用场景:存储微博的关注列表,粉丝列表等。

4、**set**

常用命令: sadd、spop、smembers、sunion 等 

基本特点:类似于Java中的set集合可以存储多个数据,数据不可以重复,使用set集合不可以保证数据的有序性。

应用场景:可以利用Redis的集合计算功能,实现微博系统中的共同粉丝、公告关注的用户列表计算。

5、**sorted set**

常用命令: zadd、zrange、zrem、zcard 等。

基本特点:和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。

应用场景:在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜等。

> ### 5、Redis有哪些数据删除策略?(高频)

数据删除策略:Redis中可以对数据设置数据的有效时间,数据的有效时间到了以后,就需要将数据从内存中删除掉。而删除的时候就需要按照指定的规则

进行删除,这种删除规则就被称之为数据的删除策略。

Redis中数据的删除策略:

① 定时删除

* 概述:在设置某个key 的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。

* 优点:定时删除对内存是最友好的,能够保存内存的key一旦过期就能立即从内存中删除。

* 缺点:对CPU最不友好,在过期键比较多的时候,删除过期键会占用一部分CPU时间,对服务器的响应时间和吞吐量造成影响。


② 惰性删除

* 概述:设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key。

* 优点:对CPU友好,我们只会在使用该键时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查。

* 缺点:对内存不友好,如果一个键已经过期,但是一直没有使用,那么该键就会一直存在内存中,如果数据库中有很多这种使用不到的过期键,这些键

  便永远不会被删除,内存永远不会释放。

③ 定期删除

* 概述:每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期

* 键)。

* 优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键

  占用的内存。

* 缺点:难以确定删除操作执行的时长和频率。

  如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好。如果执行的太少,那又和惰性删除一样了,过期键占用的内存不会及时得

  到释放。

另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误。

Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用定期删除函数的运行频率,

在Redis2.6版本中,规定每秒运行10次,大概100ms运行一次。在Redis2.8版本后,可以通过修改配置文件redis.conf 的 **hz** 选项来调整这个次数。

> ### 6、Redis中有哪些数据淘汰策略?(高频)

数据的淘汰策略:当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中

的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。

常见的数据淘汰策略:

```shell
noeviction                            # 不删除任何数据,内存不足直接报错(默认策略)
volatile-lru                        # 挑选最近最久使用的数据淘汰(举例:key1是在3s之前访问的, key2是在9s之前访问的,删除的就是key2)
volatile-lfu                        # 挑选最近最少使用数据淘汰  (举例:key1最近5s访问了4次, key2最近5s访问了9次, 删除的就是key1)

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值