Redis综述篇:与面试官彻夜长谈Redis缓存、哨兵、集群底层原理

一、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

Redis2.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. 代理式集群

10.4. 去中心化分片式集群

十一、Redis版本新特性

展开阅读全文

页面更新:2024-02-28

标签:哨兵   缓存   主从   节点   集群   底层   持久   命令   原理   对象   内存   文件   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top