彻夜长谈Redis之面试篇:一文让你面试从唯唯诺诺到飞扬跋扈!

2021-11-03  本文已影响0人  竹子爱熊猫

一、Redis基本概念

二、Redis基本数据类型与常用指令

命令 作用
keys * 返回所有键(keys还能用来搜索,比如keys h*:搜索所有以h开头的键)
dbsize 返回键数量,如果存在大量键,线上禁止使用此指令
exists key 检查键是否存在,存在返回 1,不存在返回 0
del key 删除键,返回删除键个数,删除不存在键返回 0
ttl key 查看键存活时间,返回键剩余过期时间,不存在返回-1
expire key seconds 设置过期时间(单位:s),成功返回1,失败返回0
expireat key timestamp 设置 key 在某个时间戳(精确到秒)之后过期
pexpire key milliseconds 设置过期时间(单位:ms),成功返回1,失败返回0
persist key 去掉过期时间
monitor 实时监听并返回redis服务器接收到的所有请求信息
shutdown 把数据同步保存到磁盘上,并关闭redis服务
info 查看当前redis节点信息
....... .......

当然了,一般也是记得一些常用的命令,但是 更多命令参考:Redis命令大全,因为redis命令和JVM参数一样,只要记得可以这样做就行了,但是具体的可以去参考相关文档资料。

类型 描述 特性 场景
string 二进制安全 可以存储任何元素(数字、字符、音视频、图片、对象.....) 计数器、分布式锁、字符缓存、分布式ID生成、session共享、秒杀token、IP限流等
hash 键值对存储,类似于Map集合 适合存储对象,可以将对象属性一个个存储,更新时也可以更新单个属性,操作某一个字段 对象缓存、购物车等
list 双向链表 增删快 栈、队列、有限集合、消息队列、消息推送、阻塞队列等
set 元素不能重复,每次获取无序 添加、删除、查找的复杂度都是O(1),提供了求交集、并集、差集的操作 抽奖活动、朋友圈点赞、用户(微博好友)关注、相关关注、共同关注、好友推荐(可能认识的人)等
sorted set 有序集合,每个元素有一个对应的分数,不允许元素重复 基于分数进行排序,如果分数相等,以key值的 ascii 值进行排序 商品评价标签(好评、中评、差评等)、排行榜等
bitmaps Bitmaps 是一个字节由 8 个二进制位组成 在字符串类型上面定义的位操作 在线用户统计、用户访问统计、用户点击统计等
hyperloglog Redis 在 2.8.9 版本添加了 HyperLogLog 结构。Redis HyperLogLog 是用来做基数统计的算法。 用于进行基数统计,不是集合,不保存数据,只记录数量而不是具体数据 统计独立UV等
geospatial redis3.2版本新增的数据类型:GEO 对地理位置的支持 以将用户给定的地理位置信息储存起来, 并对这些信息进行操作 地理位置计算
stream redis5.0之后新增的数据类型 支持发布订阅,一对多消费 消息队列

PS:HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素(核心是基数估算算法,最终数值存在一定误差误差范围:基数估计的结果是一个带有 0.81% 标准错误的近似值,耗空间极小,每个hyperloglog key占用了12K的内存用于标记基数,pfadd命令不是一次性分配12K内存使用,会随着基数的增加内存逐渐增大,Pfmerge命令合并后占用的存储空间为12K,无论合并之前数据量多少)

三、Redis缓存及一致性、雪崩、击穿与穿透问题

public Result get(int ID){
    redisResult = redis.get(ID);
     if(redisResult != null){
         return redisResult;
     }
     if(redis.setnx("update:" + ID) != "0"){
         DBResult = DB.selectByID(ID);
         if(DBResult != null){ // 避免缓存穿透
             redis.set(ID,DBResult);
             redis.del("update:" + ID);
             return DBResult;
         }
         redis.set(ID,"Not Data");
         return "抱歉,当前查询暂时没有找到数据......";
     }
     Thread.sleep(2);
     return get(ID);
}

四、Redis八种淘汰策略与三种删除策略

4.1. 八种键淘汰(过期)策略

策略 概述
volatile-lru 从已设置过期时间的数据集中挑选最近最少使用的数据淘汰,没有设置过期时间的key不会被淘汰,这样就可以在增加内存空间的同时保证需要持久化的数据不会丢失。
volatile-ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰,ttl值越大越优先被淘汰。
volatile-random 从已设置过期时间的数据集中任意选择数据淘汰
volatile-lfu 从已设置过期时间的数据集挑选使用频率最低的数据淘汰
allkeys-lru 从数据集中挑选最近最少使用的数据淘汰,该策略要淘汰的key面向的是全体key集合,而非过期的key集合。 (应用最广泛的策略)
allkeys-lfu 从数据集中挑选使用频率最低的数据淘汰
allkeys-random 从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐) 禁止驱逐数据,这也是默认策略。意思是当内存不足以容纳新入数据时,新写入操作就会报错,请求可以继续进行,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失。

4.2. 三种键删除策略

五、Redis三种持久化机制

5.1. RDB持久化

5.1. AOF持久化

5.3. 4.x之后的混合型持久化

当然在redis4.x之后推出了混合型持久化机制,因为RDB虽然加载快但是存在数据丢失,AOF数据安全但是加载缓慢,redis为了解决这个问题,带来了一个新的持久化选项——混合持久化。将RDB文件的内容和增量的AOF日志文件存在一起。这里的AOF日志不再是全量
的日志,而是自持久化开始到持久化结束的这段时间发生的增量AOF日志,通常这部分AOF日志很小。redis重启的时候,可以先加载RDB的内容,然后再重放增量AOF日志,就可以完全替代之前的AOF全量文件重放,恢复效率因此大幅得到提升(混合型持久化最终生成的文件后缀是.aof,可以通过redis.conf文件中aof-use-rdb-preamble yes配置开启)。
- 混合型持久化优点:结合了RDB和AOF的优点,使得数据恢复的效率大幅提升
- 混合型持久化缺点:兼容性不好,redis-4.x新增,虽然最终的文件也是.aof格式的文件,但在4.0之前版本都不识别该aof文件,同时由于前部分是RDB格式,阅读性较差

六、Redis的事务机制

七、Redis内存模型及内存划分

八、Redis虚拟内存

九、Redis客户端通信RESP协议

十、Redis高可用机制:主从复制、哨兵、代理式/分片式集群

10.1. 主从复制

10.2. 哨兵机制

10.3. 代理式集群

Redis去中心化分片式集群

十一、Redis版本新特性

上一篇 下一篇

猜你喜欢

热点阅读