Redis是一个基于内存的数据结构存储服务器,常被用作数据库、缓存、消息队列,是目前最主流的Nosql数据库之一。
2.我们常用的数据类型有哪些呢?你能说说他们分别在什么场景下使用呢?常用的数据类型有string、list、set、zset、hash
string类型是redis中最基本的数据类型,也是使用最多的一种数据类型,他能存储任何形式的字符串
list可以存储一个字符串列表,按照数据加入的顺序排序,他非常方便的在列表头部和尾部添加元素。
set类型是一个无顺序的字符串集合,集合中每个元素都是不同的,不允许有重复数据。
zset类型与set相似,也是一个无重复元素的集合,不同的是zset的每个元素会关联一个分数,这个分数用于对集合元素进行排序
hash类型是一个string类型的field和value的映射表
3.Redis可以设置过期吗?你能说说Redis的过期清理原理在Redis中提供了Expire命令设置一个键的过期时间,到期以后Redis会自动删除它。
Redis删除过期key的方法主要有两种:
1.消极方法
在key被访问时如果发现它已经失效,那么就删除他
2.积极方法
周期性的从设置了过期时间的key中选择一部分过期的key删除,对于那些从未被查询的key,即便他们已经过期,消极方法也无法清除,因此Redis会周期性的随机测试一些key,已过期的key将会被删除掉
4.缓存有什么用?缓存是解决系统性能问题的利器,通过缓存技术来降低后端服务压力,提升系统整体性能,缩短响应时间,特别在大流量高并发场景下,缓存可以说是解决大流量高并发,优化系统性能首先要考虑的一个因素
5.什么是缓存穿透?如何解决?缓存穿透是指大量不存在的key请求,由于缓存没有,便开始查询数据库,但数据库也没有查到数据,比如一些恶意攻击、爬虫等造成大量空命中。
解决方案:
方案一:缓存空结果,对数据库查询不存在的数据仍然记录在缓存中缓存一条数据,比如缓存一条空值 unknow,这样能有效的减少查询数据库的次数。
方案二:布隆过滤器
6.什么是缓存击穿?如何解决?
高并发条件下,对于热点数据访问,在某个时刻数据失效了;或者刚开始时缓存中还没有对数据进行缓存,所有请求都被发送到数据库去查询,数据库被压垮。
解决方案:
方法一:使用分布式锁,就是在访问数据库之前都先请求分布式锁,获得锁的那个线程才有资格去访问数据库,其他线程必须等待。
7.什么是缓存雪崩?如何解决?
缓存雪崩是指比如我们给所有的数据设置了同样的过期时间,然后在某一个历史性时刻,整个缓存的数据全部过期了,然后瞬间所有的请求都落到数据库,数据库被压垮。或者是缓存服务器发生故障,导致所有的请求都落入到数据库,数据库被压垮。
解决方案
事前:redis要高可用(搭建集群或者哨兵),避免redis不可用。
事中:本地ehcache缓存(mybatis二级缓存)+限流&降级,避免数据库被压垮。
事后:redis持久化,快速恢复缓存数据。
8.如何解决数据库与缓存的双鞋不一致问题?
1.为缓存设置过期时间
2.使用延迟双删策略
9.Redis中使用lua脚本的好处是什么?1.原子操作,redis会将整个脚本作为一个整体执行,中间不会被其他命令插入,换句话说,编写脚本的过程中无需担心会出现插队、竞争等条件
2.减少网络开销,在lua脚本中可以把多个命令放在同一个脚本中运行。
10.Redis的内存淘汰策略你知道哪些?noeviction: 默认策略,不淘汰,如果内存已满,添加数据时报错。
allkeys-lru: 在所有键中,选取最近最少使用的数据淘汰。
volatile-lru: 在设置了过期时间的所有键中,选取最近最少使用的数据淘汰。
allkeys-lfu: 在所有键中,选取最近最不常访问的数据淘汰。
volatile-lfu: 在设置了过期时间的所有键中,选取最近最不常访问的数据淘汰。
allkeys-random: 在所有键中,随机淘汰;。
volatile-random: 在设置了过期时间的所有键,随机淘汰。
volatile-ttl: 在设置了过期时间的所有键,存活时间最短的数据淘汰。
11.Redis持久化的两种方式是什么?它们有什么区别?
一种是RDB方式,一种是AOF方式
RDB是默认开启的,是指在指定的时间间隔内将内存中的数据集快照写入磁盘中,数据恢复时将快照文件直接在读到内存。
AOF是指Redis每次接收到一条改变数据的命令时,它将把该命令写到一个AOF文件中(只记录写操作,不记录读操作),当Redis重启时,它通过执行AOF文件中所有的命令来恢复数据。这种方式的持久化让redis的数据不会丢失;AOF需要手动开启,AOF可以将Redis执行的每一条写命令追加到硬盘文件中,这一过程会降低Redis的性能,但大部分情况下这个影响是能够接受的,另外使用较快的硬盘(固态硬盘)可以提高AOF的性能。
12.Redis的集群有哪几种模式?有什么区别?Redis集群有哨兵模式和分片集群模式
1.哨兵模式的本质是主从复制,优点是搭建简单,能满足大部分时候的需求,缺点是每一台redis服务器都拥有相同的缓存数据,会浪费内存空间
2.分片集群模式,提出哈希槽的概念,来实现数据分片,在redis内部哈希槽的个数是16384个,这个数量是不可变的,每一个哈希槽分区为一个独立的集群,当用户存储数据的时候,先进行哈希槽计算,最终把数据存到不同的哈希槽分区。避免了浪费内存空间的情况,而且可以很好的横向扩展。缺点是搭建比较麻烦,需要的服务器资源也比较多。
13.Redis中查询大量的key要怎么办?
可以使用scan命令
14.Redis为什么那么快?1.Redis是基于内存操作
2.Redis是单线程,省去线程切换、锁竞争的开销
3.Redis非阻塞IO模型。(NIO)



