Redis

Redis 基础

·15 分钟阅读·5785 字
📋 目录

 一、关系型数据库与非关系型数据库

关系型数据库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,需要更新。

后续增量同步:

  1. slave节点请求增量同步

  2. master节 点判断replid,发现不一致,拒绝增量同步

  3. master将完整内存数据生成RDB,发送RDB到slave

  4. slave清 空本地数据,加载master的RDB

  5. master将RDB期 间的命令记录在repl_baklog,并持续将log中的命令发送给slave

  6. 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 与持久化