# 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)