一、关系型数据库与非关系型数据库
关系型数据库SQL
SQL全称: 结构化查询语言(Structured Query Language),也叫关系型数据库,它是把复杂的数据结构归结为简单表格形式。
二、redis特征
高性能
Redis 是一个使用 C 语言编写的高性能键值数据库,它采用了很多优化措施,例如:使用内存作为数据存储介质、采用单线程模型、异步 I/O 等技术,从而达到非常高的读写性能。
支持多种数据结构
Redis 不像传统关系型数据库那样只支持表格模型,它支持多种数据结构,包括字符串、列表、集合、有序集合和哈希表等,适用于不同的应用场景。
支持数据持久化
Redis 支持数据持久化,可以将内存中的数据异步地保存到硬盘上,保证数据不会在程序重启时丢失。同时,Redis 还支持 RDB 和 AOF 两种持久化方式,更加灵活可靠。
支持数据复制
Redis 支持数据复制,可以将一份数据复制到多台机器上,提高系统的可用性和可靠性。
支持分布式对象缓存
Redis 支持分布式对象缓存(Cache),可以缓存常用数据对象,避免频繁地查询数据库,提高系统的读取性能。
支持事务操作
Redis 支持事务操作,可以在一次请求中执行多个命令,从而保证在多个命令之间的数据一致性。
三、redis数据类型
数据类型解释
String: 它的值就是一个字符串
Hash: 它不是一个普通字符串,而是一个hash表, 这里用字符串表示
List: 它是一个有序的集合
Set: 它是一个无序集合,并且是不能重复的
SortedSet: 它是有序的可排序的集合,并且是不能重复的
以上五种是redis里面最常见的五种基本的数据类型。
GEO: 它是一个地理坐标,精度、尾度。
BitMap: 按位进行存储的方式,做数据统计,底层本质就是字符串。
HyperLog: 按位进行存储的方式,做数据统计,底层本质就是字符串。
以上三种是redis里面特殊类型。
①String类型
String类型,也就是字符串类型,是Redis中最简单的存储类型。
其value是字符串,不过根据字符串的格式不同,又可以分为3类:
string:普通字符串
int: 整数类型,可以做自增、自减操作
float: 浮点类型,可以做自增、自减操作
String的常见命令有 :
SET: 添加或者修改已经存在的一个String类型的键值对
GET: 根据key获取String类型的value
MSET: 批量添加多个String类型的键值对
MGET: 根据多个key获取多个String类型的value
INCR: 让一个整型的key自增1
INCRBY: 让一个整型的key自增并指定步长,例如: incrby num 2让num值自增2
INCRBYFLOAT: 让一个浮点类型的数字自增并指定步长
SETNX: 添加一个String类型的键值对,前提是这个key不存在,否则不执行
SETEX: 添加一个String类型的键值对,并且指定有效期
②Hash类型
Hash类型,也叫散列,其value是一 个无序字典。
Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD。
Hash的常见命令有
HSET key field value: 添加或者修改hash类型key的field的值
HGET key field: 获取一个hash类型key的field的值
HMSET: 批量添加多个hash类型key的field的值
HMGET: 批量获取多个hash类型key的field的值
HGETALL: 获取一个hash类型的key中的所有的field和value
HKEYS: 获取一个hash类型的key中的所有的field
HVALS: 获取一个hash类型的key中的所有的value
HINCRBY: 让一个hash类型key的字段值自增并指定步长
HSETNX: 添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
③List类型
Redis中的List类型与Java中的LinkedList类似,可以看做是-个双向链表结构。既可以支持正向检索和也可以支持反向检索。
特征也与LinkedList类似:
有序
元素可以重复
插入和删除快
查询速度一般
List的常见命令有:
LPUSH key element… : 向列表左侧插入一个或多个元素
LPOP key: 移除并返回列表左侧的第一个元素, 没有则返回nil
RPUSH key element… : 向列表右侧插入一个或多个元素
RPOP key: 移除并返回列表右侧的第一个元素
LRANGE key star end: 返回一段角标范围内的所有元素
BLPOP和BRPOP: 与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
④Set类型
set也是一个hash表,因此具备与HashSet类似的特征:
无序
元素不可重复
查找快
支持交集、并集、差集等功能
Set的常见命令有:
SADD key member … : 向set中添加一个或多个元素
SREM key member .. : 移除set中的指定元素
SCARD key: 返回set中元素的个数
SISMEMBER key member: 判断一个元素是否存在于set中
SMEMBERS: 获取set中的所有元素
SINTER key1 key2 … : 求key1与key2的交集
SDIFF key1 key2 … : 求key1与key2的差集
SUNION key1 key2 ..: 求key1和key2的并集
⑤SortedSet类型
Redis的SortedSet是一个可排序的set集合,SortedSet中的每一个元素都带有一个score属性,可以基于score属
性对元素排序,底层的实现是一个跳表(SkipList) 加hash表。
SortedSet具备下列特性:
可排序
元素不重复
查询速度快
SortedSet的常见命令有:
ZADD key score member: 添加一个或多个元素到sorted set,如果已经存在则更新其score值
ZREM key member: 删除sorted set中的一个指定元素
ZSCORE key member: 获取sorted set中的指定元素的score值
ZRANK key member: 获取sorted set中的指定元素的排名
ZCARD key: 获取sorted set中的元素个数
ZCOUNT key min max: 统计score值在给定范围内的所有元素的个数
ZINCRBY key increment member: 让sorted set中的指定元素自增,步长为指定的increment值
ZRANGE key min max: 按照score排序后,获取指定排名范围内的元素
ZRANGEBYSCORE key min max: 按照score排序后,获取指定score范围内的元素
ZDIFF、 ZINTER、ZUNION: 求差集、交集、并集
注意: 所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可
四、常用命令
KEYS: 查看符合模板的所有key,不建议在生产环境设备上使用
DEL: 删除一个指定的key
EXISTS:判key是否存在
EXPIRE:给key设置一个有效期,有效期到期时该key会被自动删除
TTL: 查看一个key 的剩余有效期
五、redis持久化
持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导
致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存
到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行
灾难备份,可以将持久化文件拷贝到一个远程位置。
Redis持久化分为RDB持久化和AOF持久化:前者将当前数据保存到硬盘,后者则
是将每次执行的写命令保存到硬盘(类似于MySQL的binlog);
①RDB持久化
RDB全称Redis Database Backup file ( Redis数据备份文件) ,也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis 实例故障重启后,从磁盘读取快照文件,恢复数据。
RDB执行流程
bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。
fork采用的是copy-on-write技术:
当主进程执行读操作时,访问共享内存。
当主进程执行写操作时,则会拷贝一份数据,执行写操作。
RDB会在什么时候执行?
默认是服务停止时。
RDB的缺点?
RDB执行间隔 时间长,两次RDB之间写入数据有丢失的风险
fork子进程、 压缩、写出RDB文件都比较耗时
②AOF持久化
将Redis执行的每次写命令记录到单独的日志文件中。
AOF 的三种策略
appendfsync always: 始终同步,每次Redis的写入都会立刻记入日志;性能较差但数据完整性比较好
appendfsync everysec: 每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。
appendfsync no: redis不主动进行同步,把同步时机交给操作系统。
③****RDB持久化与AOF持久化区别
六、redis主从集群
Redis主从复制原理
数据同步原理
Master如何判断slave是不是第一次来同步数据?这里会用到两个很重要的概念:
Replication id: 简称replid,是数据集的标记,id一至则说明是同一数据集。每一个master都有唯一的replid,slave则会继承
master节点的replid
Offset: 偏移量,随着记录在repl_backlog中的数据增多而逐渐增大。Slave完成同步时也会记录当前同步的offset。如果slave
的offset小于master的offset,说明slave数据落后于master,需要更新。
后续增量同步:
-
slave节点请求增量同步
-
master节 点判断replid,发现不一致,拒绝增量同步
-
master将完整内存数据生成RDB,发送RDB到slave
-
slave清 空本地数据,加载master的RDB
-
master将RDB期 间的命令记录在repl_baklog,并持续将log中的命令发送给slave
-
slave执行接收到的命令,保持与master之间的同步
七、redis哨兵
Redis提供了哨兵( Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:
监控: Sentinel会不断检查您的master和slave是否按预期工作
自动故障恢复: 如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主
通知: Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端
Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:
主观下线: 如果某sentinel节 点发现某实例未在规定时间响应,则认为该实例主观下线。
客观下线: 若超过指定数量(quorum) 的sentinel都认为该实例主观下线, 则该实例客观下线。
①****选举新的master
一旦发现master故障, sentinel需要在salve中选择一个作为新的master,选择依据是这样的:
首先会判断slave节点与master节点断开时间长短,如果超过指定值( down-after-milliseconds * 10)则会排除该slave节点
然后判断slave节点的slave-priority值, 越小优先级越高,如果是0则永不参与选举如果slave-prority一样,则判断slave节点的
offset值,越大说明数据越新,优先级越高最后是判断slave节点的运行id大小,越小优先级越高。
②****如何实现故障转移
当选中了其中一个slave为新的master后(如:slave1),故障的转移的步骤如下:
Ⅰ、sentinel给备选的slave1节点发送slaveof no one命令,让该节点成为master
Ⅱ、sentinel给所有其它slave发送slaveof 192.168.10.200 6381 命令,让这些slave 成为新master的从节点,开始从新的
master上同步数据。
Ⅲ、最后,sentinel将故障节点标记为slave,当故障节点恢复后会自动成为新的master的slave节点
八、redis分片集群
Redis 分片集群是一种将 Redis 数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性。在分片集群中,数据被分为多个片段,每个片段存储在不同的节点上,这些节点可以是物理服务器或虚拟服务器。
Redis 分片集群的主要目的是将数据分布在多个节点上,以便可以通过并行处理来提高读写吞吐量。每个节点负责处理一部分数据,并且在需要时可以进行扩展以适应更多的负载。此外,分片集群还提供了故障容错和高可用性的功能,即使其中一个节点发生故障,其他节点仍然可以继续工作。
①分片集群特征:
集群中有多个master,每个master保存不同数据
每个master都可以有多个slave节点
master之间通过ping监测彼此健康状态
客户端请求可以访问集群任意节点,最终都会被转发到正确节点
关联文档
- 面试题/Redis 面试题 — Redis 面试题
- ../../linux/kernel/PageCache 原理 — PageCache 与持久化