Redis是我们最常用的中间件,也是高频面试点,接下来为大家简单介绍一下Redis的一些基本概念和高频面试点。
1.redis的基础知识:
redis默认有16个数据库,可以在redis.conf配置文件中更改datebases 16
它默认使用的是第0个数据库,可以使用select命令切换。
2. redis的基本命令:
dbsize:查看数据库大小
keys*: 查看数据库中所有的key
flushdb:清空当前数据库
flushall:清空所有数据库
exists key: 判断key是否存在
expire key time: 设置过期时间
3.redis是单线程还是多线程,它为什么快呢?
redis是单线程的,在redis1.6的版本中新添加了多线程的功能来提高了I/O读写性能。(多路复用NIO模型)
官方表示:Redis是基于内存操作,cpu不是Redis的性能瓶颈,Redis的性能瓶颈是根据机器的内存和网络带宽来决定的。那么上面提到它是单线程的,为什么它还是这么快呢?
这里有几个误区:1.高性能的服务器一定是多线程的 2.多线程的效率一定比单线程效率高
那么因为如果使用多线程,那么就会涉及到线程的上下文切换,是会消耗性能的,而单线程不涉及到线程的切换,而且它是基于内存的,并且使用多路复用NIO来提高I/O的读写性能,还有专门的结构设计:key:value结构,所以Redis是非常快的!!!
4.Redis的五大基本类型:String list set zset hash.
String: 存储非String类型时,需要序列化
list:可用于栈,队列,阻塞队列, 实现队列的方法: lpush, rpop(先进先出)
set: 无序且不可重复
zset: 有序且不可重复, 可以用来做排行榜
hash: 一般用来存储对象
5.Redis是存在内存中的,我们如何保证数据不丢失呢?
1.AOF,默认是不开启的,持久化的是我们操作redis的命令,它不安全,并且恢复数据比较慢,刚开始时占用空间比RDB大(稍后会介绍RDB)。但是随着持久化的数据量越多,RDB的占用空间会超过AOF.
AOF配置: AOF有三种模式,第一种:appendfsync always, 每次修改都会同步,消耗性能。
第二种:appendfsync everysec, 每秒钟同步一次, 有可能会丢失这1S中的数据。
第三种:appendfsync no, 操作系统自己同步数据,性能是最高的。
2.RDB,数据快照的方式持久化数据,在规定的时间内,执行了多少次操作,就会持久化到文件,RDB数据是进行加密的,同步数据性能没有AOF高,在刚开始持久化的时候占用空间比AOF小,但是随着持久化数据的数量越来越多,它的体积比AOF大,但是RDB恢复数据的速度比AOF快。它的缺点就是,隔一定的时间才会同步数据,所以有可能会造成数据丢失。
通常情况下,我们会将RDB和AOF结合起来使用!如果你的Redis只做缓存的话,那么是不需要对它进行持久化的。
6. Redis的六大淘汰策略:
1.volatile-lru: 已设置过期时间的挑选最少使用的淘汰
2.volatile-ttl: 已设置过期时间的快过期的淘汰
3.volatile-random:已设置过期时间的随即淘汰
4.allkeys-lru: 从所有数据中挑选最少使用的淘汰
5.allkeys-random:从所有数据集中随即淘汰
6.no-enviction: 不使用淘汰策略
7.如果用Redis做缓存,那么会有缓存击穿,缓存穿透,缓存雪崩这些场景,我们的应对策略又是什么呢?
缓存穿透:就是Redis中没有,数据库中有,此时高并发进来操作数据库,我们的数据库可能会崩掉,此时我们应该加个互斥锁,单线程操作数据库,这样就可以防止高并发让数据库崩掉
缓存穿透:Redis中没有,数据库中也没有,此时高并发进来也会请求数据库,那么我们就应该用到布隆过滤器校验请求的参数,如果没有直接返回。
缓存雪崩:Redis中大量key在同一时间失效,导致高并发请求数据库。这种场景我们就要对key设置不同的过期时间,来防止它在同一时间大量key失效。