Redis数据库(万字图文详解)

Redis数据库(万字图文详解)-mikechen

Redis介绍

Redis是一个基于键值存储的开源内存数据库,使用C语言编写的,它提供了高性能、高可用性和灵活性。

 

Redis特点

它具有以下特点:

  1. 数据类型:Redis支持多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。
  2. 内存存储:Redis将数据存储在内存中,因此具有极快的读写速度。
  3. 高性能:由于数据存储在内存中,Redis具有非常高的读写性能。
  4. 发布订阅:Redis支持发布订阅模式,允许发送者将消息发布到指定的频道,而订阅者可以订阅这些频道以接收消息。
  5. 事务支持:Redis支持事务,通过MULTI、EXEC、WATCH和DISCARD等命令可以实现原子性的批量操作。
  6. 分布式缓存:Redis可以作为分布式缓存来使用,通过分片(Sharding)将数据分布在多个Redis节点上,以实现横向扩展和负载均衡。
  7. 扩展性:Redis提供了集群功能,可以将多个Redis节点组成集群,以增加整个系统的容量和可用性。

 

Redis应用场景

Redis具有广泛的应用场景,以下是一些常见的Redis应用场景:

  1. 缓存:作为缓存层,将常用的数据存储在Redis中,以加快读取速度。
  2. 会话存储:用于存储用户会话数据,特别是在分布式系统中。
  3. 实时统计与计数:Redis的原子操作和高速计算能力使其非常适合用于实时统计和计数场景,如:页面访问量、在线用户数、点赞和分享等。
  4. 消息队列:通过Redis的发布订阅功能,可以构建轻量级的消息队列系统。
  5. 排行榜和计分系统:使用Redis的有序集合数据结构,可以实现高性能的排行榜和计分系统。比如,游戏中的玩家排行、文章的点赞数排名等。
  6. 分布式锁:利用Redis的原子操作和过期时间功能,可以实现分布式环境下的锁机制,用于控制并发访问和资源的同步。

 

Redis安装

Redis window下载地址,点击前往

选择如下图的版本:

Redis数据库(万字图文详解)-mikechen

2.Redis安装

下载Redis-x64-5.0.14.1.zip 文件,然后 把Redis-x64-5.0.14.1.zip文件解压。

解压后如下图所示:

Redis数据库(万字图文详解)-mikechen

3.Redis启动

双击 redis-server.exe 启动 Redis,如下图所示:

Redis数据库(万字图文详解)-mikechen

启动后,如下图所示:

Redis数据库(万字图文详解)-mikechen

如果想方便的话,可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了

4.连接Redis

直接双击解压之后文件中的redis-cli.exe,如下图所示:

Redis数据库(万字图文详解)-mikechen

5.测试Redis

输入ping命令,如下图所示:

Redis数据库(万字图文详解)-mikechen

能够正确响应pong,则说明redis启动成功了。

 

Redis使用

当使用Redis命令时,以下是一些常见的命令示例和对应的用法。

1.字符串操作

SET mykey "Hello Redis"
GET mykey
  • 设置键值对:SET key value
  • 获取键值对:GET key

 

2.哈希操作

HSET user:id1 name "John Doe"
HGET user:id1 name
  • 设置哈希字段:HSET hash field value
  • 获取哈希字段值:HGET hash field

 

3.列表操作

LPUSH mylist "apple"
RPUSH mylist "banana"
LRANGE mylist 0 -1
  • 在列表头部插入元素:LPUSH list value
  • 在列表尾部插入元素:RPUSH list value
  • 获取列表元素范围:LRANGE list start stop

 

4.集合操作

SADD myset "apple"
SISMEMBER myset "apple"
SMEMBERS myset
  • 添加元素到集合:SADD set member
  • 检查元素是否在集合中:SISMEMBER set member
  • 获取集合中的所有元素:SMEMBERS set

 

5.有序集合操作

ZADD leaderboard 1000 "player1"
ZADD leaderboard 900 "player2"
ZRANGE leaderboard 0 -1 WITHSCORES
  • 添加元素到有序集合:ZADD sortedset score member
  • 获取有序集合中的指定范围元素:ZRANGE sortedset start stop

 

6.发布订阅

PUBLISH channel1 "Hello subscribers!"
SUBSCRIBE channel1
  • 发布消息到频道:PUBLISH channel message
  • 订阅频道接收消息:SUBSCRIBE channel

 

Redis数据类型

Redis支持多种类型的数据结构,最常用的5大数据类型,如下图所示:

Redis数据库(万字图文详解)-mikechen

1.Redis String数据类型

  • 用于存储单个值。
  • 可以存储字符串、整数或浮点数。
  • 常用命令:SET、GET、INCR、DECR、APPEND等。

String应用场景

1)计数器

比如:计算访问次数、点赞、转发、库存数量等等;

2)共享session

分布式Session可以很方便的共享存储session。

3)分布式锁

SET 命令有个 NX 参数可以实现「key不存在才插入」,可以用它来实现分布式锁;

 

2.Redis List数据类型

  • 有序、可重复的字符串集合。
  • 可以在列表两端进行插入和删除操作。
  • 适用于队列、栈等场景。
  • 常用命令:LPUSH、RPUSH、LPOP、RPOP、LRANGE等。

 

Redis List应用场景

  1. 用户列表,商品列表,评论列表等;
  2. 消息队列;
  3. 栈;

 

3.Redis Set数据类型

  • 无序、不重复的字符串集合。
  • 可以进行交集、并集、差集等集合操作。
  • 适用于存储唯一值、标签等。
  • 常用命令:SADD、SREM、SISMEMBER、SMEMBERS等。

Redis Set应用场景

Set 类型比较适合用来数据去重和保障数据的唯一性,还可以用来统计多个集合的交集、错集和并集等,当我们存储的数据是无序并且需要去重的情况下,比较适合使用集合类型进行存储。

比如:

  • 统计网站uv;
  • 统计共同好友;

 

4.Redis Sorted Set数据类型

  • 有序的、不重复的字符串集合。
  • 每个成员关联一个分数,用于排序。
  • 可以按分数范围获取成员。
  • 适用于排行榜、计分系统等。
  • 常用命令:ZADD、ZREM、ZSCORE、ZRANGE等。

Sorted Set应用场景

有序列表被广泛使用在各种排行榜业务上:比如销量排行,用户点击率排行等

 

5.Redis Hash数据类型

Redis Hash是key-value对的一种集合,Hash 特别适合用于存储对象。

  • 用于存储字段和值的映射关系。
  • 适用于存储对象或记录。
  • 常用命令:HSET、HGET、HGETALL、HINCRBY等。

Redis Hash应用场景

比如最典型的就是购物车,以用户 id 为 key,商品 id 为 field,商品数量为 value,恰好构成了购物车的3个要素,如下图所示:

Redis数据库(万字图文详解)-mikechen

除了以上常用的数据类型,Redis还提供了一些其他的数据类型和功能,如地理位置(Geo)、HyperLogLog、Stream等。

每种数据类型都有对应的命令和操作,使得Redis非常灵活和多样化。

 

Redis持久化

Redis的持久化机制有3种:

1.RDB(Redis Data Base) 内存快照

快照是将Redis在某个时间点的数据状态保存到磁盘上的二进制文件(RDB文件)中。

快照是通过执行BGSAVE命令或在配置文件中设置自动保存间隔来触发的。

快照可以压缩和优化存储空间,因为它是以二进制格式存储的。

在重启Redis时,可以使用最近的快照文件来还原数据。

快照适合用于备份和恢复数据,但在发生故障时可能会丢失最后一次快照之后的所有修改。

 

2.AOF(Append Only File) 增量日志

AOF是通过将Redis执行的每个写操作追加到一个文件中来记录数据状态。

AOF文件以文本方式存储,可以查看和修改。

AOF文件可以通过执行BGREWRITEAOF命令或在配置文件中设置自动重写间隔来压缩和优化存储空间。

在重启Redis时,它会重新执行AOF文件中的写操作来还原数据。

AOF相对于快照更具有持久性,因为它记录了每个写操作,但AOF文件通常比快照文件更大。

 

3.RDB AOF混合持久化

Redis4.0 后大部分的使用场景都不会单独使用 RDB 或者 AOF 来做持久化机制,而是兼顾二者的优势混合使用。

 

 

Redis事务

Redis事务提供了一种将多个命令打包执行的机制,保证这些命令在执行期间不会被其他客户端的命令插入。

事务在Redis中是原子性的,即事务中的所有命令要么全部执行,要么全部不执行。

Redis事务有如下三大特性

1.单独的隔离操作

事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

2.没有隔离级别的概念

队列中的命令没有提交之前不会被实际执行,因为事务提交前任何指令都不会被实际执行。

3.不保证原子性

事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

Redis提供了以下5个基本指令实现事务功能,如下图所示:

Redis数据库(万字图文详解)-mikechen

以下是一个使用Redis事务的示例:

MULTI
SET key1 "Hello"
SET key2 "World"
GET key1
GET key2
EXEC

在这个示例中,MULTI命令开启了一个事务,并将后续的SET和GET命令放入队列。EXEC命令执行了事务,并返回每个GET命令的结果。

 

Redis主从模式

主从模式是Redis集群模式中最简单的,主从模式指的是使用一个Redis实例作为主机,其余的实例作为备份机,主机和从机的数据完全一致。

如下图所示:

Redis数据库(万字图文详解)-mikechen

主机支持数据的写入和读取等各项操作,而从机则只支持与主机数据的同步和读取,也就是说客户端可以将数据写入到主机,由主机自动将数据的写入操作同步到从机。

 

Redis主从复制工作原理

Redis数据库(万字图文详解)-mikechen

  • 当slave启动后主动向master发送SYNC命令;
  • master接收到SYNC命令后在后台保存快照和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave;
  • slave接收到快照文件和命令后加载快照文件和缓存的执行命令;
  • 复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。

 

Redis哨兵模式

为什么需要哨兵模式?

刚刚上面讲到了主从模式当主服务器宕机后,需要手动把一台从服务器切换为主服务器,需要人工干预费事费力,为了解决这个问题出现了哨兵模式。

如下图所示:

Redis数据库(万字图文详解)-mikechen

哨兵模式由一个或多个Sentinel实例组成的Sentinel系统,它可以监视所有的Master节点和Slave节点,并在被监视的Master节点进入下线状态时,自动将下线Master服务器。

哨兵模式工作原理

当主节点出现故障时,由Redis Sentinel自动完成故障发现和转移,并通知应用方,实现高可用性。

如下图所示:

Redis数据库(万字图文详解)-mikechen
  1. 哨兵机制建立了多个哨兵节点(进程),共同监控数据节点的运行状况。
  2. 同时哨兵节点之间也互相通信,交换对主从节点的监控状况。
  3. 每隔1秒每个哨兵会向整个集群:Master主服务器+Slave从服务器+其他Sentinel(哨兵)进程,发送一次ping命令做一次心跳检测。

 

Redis集群模式

为什么需要Redis集群模式

哨兵模式基于主从模式,实现读写分离,它还可以自动切换,系统可用性更高。但是它每个节点存储的数据是一样的,浪费内存,因此在Redis3.0后Cluster集群应运而生。

Redis Cluster是一种服务器Sharding技术(分片和路由都是在服务端实现),采用多主多从,每一个分区都是由一个Redis主机和多个从机组成,片区和片区之间是相互平行的。

 

Redis集群模式原理

在Redis的每一个节点上,都有这么两个东西,一个是插槽(slot),它的的取值范围是:0-16383,还有一个就是cluster。

如下图所示:

Redis数据库(万字图文详解)-mikechen

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法