Redis作为常用的分布式缓存技术,在面试中高频出现,空空打算推送一个专题【Redis系列】,将详细剖析面试中常出现的考点内容,力求优质干货和通俗易懂,读完后,让你将彻底搞懂Redis中至少以下几个高频考点。
- Redis数据类型
- Redis持久化机制
- 缓存击穿、缓存穿透和缓存雪崩等问题
- Redis缓存淘汰机制
- Redis集群的主从复制
- Redis集群模式及工作原理
小伙伴们都知道在我们查询数据时,数据库会通过索引方式把所需要的数据读取出来。但当我们频繁访问某些热点数据时,如果数据库在每次访问时还是以同样的方式进行搜索读取,势必会给数据库带来很大压力。
于是缓存技术应运而生,它是将需要频繁访问的热点数据存放在内存中,不仅有效地降低了数据库的负载,还加快了用户访问速度。
原理如下图所示,在用户有写请求时,首先将数据存放到数据库,然后再写入缓存中。
当用户再次访问该数据时会首先尝试从缓存中获取,如果在缓存中没有找到所访问的数据,则从数据库中搜索并将结果返回给用户,同时再将查询结果放入缓存中,方便下次访问。
我们所说的分布式缓存是被部署在多个服务器节点上的,并且缓存之间有数据备份,在某个节点出现宕机等问题时,分布式缓存会将用户的读写请求装发到其他的备份节点上,以保障业务的正常运行。
以上是对分布式缓存的简单介绍,当然实际情况要更复杂一些,比如分布式缓存之间是如何备份的?内存中的数据是如何保证不丢失的?缓存数据过多时是如何进行清理的等等。
这些都是面试官们最喜欢问的,回答这些问题,就需要弄懂缓存的持久化机制、淘汰策略等原理以及缓存穿透和缓存雪崩等问题,这些都没不懂也不要慌,接下来都会详细地介绍给大家。
开场了这么久,终于轮到主角Redis出场了。
“Redis都有哪些数据类型?”往往是面试官盘问你Redis的开场白,相信大部分小伙伴们都能随口回答上来,如果没回答上来,那么然后,应该也就没然后了叭。
先用一句话介绍下:Redis是一个开源的内存中的数据结构存储系统,可用作缓存、数据库和消息中间件,支持多种数据类型,可将内存中的数据持久化到磁盘,还可通过哨兵模式和集群模式实现高可用。
Redis存储的是k-v格式的数据,其中key都是字符串,value有如下5种不同的数据类型,话不多说,上图。
为了让回答不那么单调,能再和面试官多唠上几句,还可以对每个类型再继续补充说明下。
以下内容选看,嫌啰嗦的直接跳过,看后面的总结。
-
String | 字符串类型
可以存储字符串、整数或者浮点数(嗯是的,后两个你没看错),如果存储的是整数或者浮点数,还可以执行自增或者自减操作。String类型的值最大能存储512M。以下是String操作常用的命令。get:获取指定key的值;
set:设置指定key的值;
Incrby:将key所存储的值加上给定的增量值;
Decrby:将key所存储的值减去给定的增量值; -
Hash | 哈希
和String类似,只不过它的value存储的是一个或多个键值对的集合。常见的命令如下:Hset:将散列表key中的field字段的值设为value。
Hget:获取存储在散列表中指定的字段值
Hdel:删除一个或者多个散列表字段 -
List | 列表
有序地存储多个字符串,可以从列表的头部或者尾部来增删元素。常用的命令有:Lpush:将一个或多个值插入列表头部;
Rpush:将一个或多个值插入列表尾部 ;
Lrange:获取列表指定范围的元素;
Lpop:移除并获取列表的第一个元素;
Rpop:移除并获取列表的最后一个元素 -
Set | 集合
以无序的方式存储多个不同元素的集合,是通过散列表实现的,所以增删查的复杂度都是O(1)。常见命令:Sadd:向集合中添加一个或者多个元素;
Smembers:返回集合中所有元素 ;
Srem:移除集合中的一个或多个元素 -
Zset | 有序集合
Zset和set一样也是String类型元素的集合,并且不允许有重复的元素,不同的是,每个元素都会关联一个double类型的分数。而Redis正是通过分数来为集合中的成员进行从小到大排序的。常用命令:Zadd:向有序集合添加一个或多个成员,或者更新已存在成员的值;
Zrange:通过索引区间返回有序集合指定区间的成员;
Zrem:移除有序集合中的一个或多个元素
下图是对以上5种类型做下总结。
回答完这个几种类型后,如果想给自己加分的,还可以再多唠一下Redis的几种特殊的数据类型,比如用于存放地理位置、距离和范围的Geospatial类型,通过操作二进制位记录数据的Bitmap类型,用于估计一个Set中元素数量的HyperLogLog类型。
对Redis有了初步的认识,弄明白了Redis的数据类型,这篇也才只是个开始,文章开头的那几个问题是不是依旧很懵,不慌!
这篇先到写到这里,关于Redis还有其他不明白的问题小伙伴们可以留言,后续我会继续追加整理出来。
文章中如有不严谨的地方,还望小伙伴们指正出来,你们的批评就是我的进步。