Redis介绍
Redis是一个基于键值存储的开源内存数据库,使用C语言编写的,它提供了高性能、高可用性和灵活性。
Redis特点
它具有以下特点:
- 数据类型:Redis支持多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。
- 内存存储:Redis将数据存储在内存中,因此具有极快的读写速度。
- 高性能:由于数据存储在内存中,Redis具有非常高的读写性能。
- 发布订阅:Redis支持发布订阅模式,允许发送者将消息发布到指定的频道,而订阅者可以订阅这些频道以接收消息。
- 事务支持:Redis支持事务,通过MULTI、EXEC、WATCH和DISCARD等命令可以实现原子性的批量操作。
- 分布式缓存:Redis可以作为分布式缓存来使用,通过分片(Sharding)将数据分布在多个Redis节点上,以实现横向扩展和负载均衡。
- 扩展性:Redis提供了集群功能,可以将多个Redis节点组成集群,以增加整个系统的容量和可用性。
Redis应用场景
Redis具有广泛的应用场景,以下是一些常见的Redis应用场景:
- 缓存:作为缓存层,将常用的数据存储在Redis中,以加快读取速度。
- 会话存储:用于存储用户会话数据,特别是在分布式系统中。
- 实时统计与计数:Redis的原子操作和高速计算能力使其非常适合用于实时统计和计数场景,如:页面访问量、在线用户数、点赞和分享等。
- 消息队列:通过Redis的发布订阅功能,可以构建轻量级的消息队列系统。
- 排行榜和计分系统:使用Redis的有序集合数据结构,可以实现高性能的排行榜和计分系统。比如,游戏中的玩家排行、文章的点赞数排名等。
- 分布式锁:利用Redis的原子操作和过期时间功能,可以实现分布式环境下的锁机制,用于控制并发访问和资源的同步。
Redis安装
Redis window下载地址,点击前往
选择如下图的版本:
2.Redis安装
下载Redis-x64-5.0.14.1.zip 文件,然后 把Redis-x64-5.0.14.1.zip文件解压。
解压后如下图所示:
3.Redis启动
双击 redis-server.exe 启动 Redis,如下图所示:
启动后,如下图所示:
如果想方便的话,可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了
4.连接Redis
直接双击解压之后文件中的redis-cli.exe,如下图所示:
5.测试Redis
输入ping命令,如下图所示:
能够正确响应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大数据类型,如下图所示:
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应用场景
- 用户列表,商品列表,评论列表等;
- 消息队列;
- 栈;
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还提供了一些其他的数据类型和功能,如地理位置(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事务的示例:
MULTI SET key1 "Hello" SET key2 "World" GET key1 GET key2 EXEC
在这个示例中,MULTI命令开启了一个事务,并将后续的SET和GET命令放入队列。EXEC命令执行了事务,并返回每个GET命令的结果。
Redis主从模式
主从模式是Redis集群模式中最简单的,主从模式指的是使用一个Redis实例作为主机,其余的实例作为备份机,主机和从机的数据完全一致。
如下图所示:
主机支持数据的写入和读取等各项操作,而从机则只支持与主机数据的同步和读取,也就是说客户端可以将数据写入到主机,由主机自动将数据的写入操作同步到从机。
Redis主从复制工作原理
- 当slave启动后主动向master发送SYNC命令;
- master接收到SYNC命令后在后台保存快照和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave;
- slave接收到快照文件和命令后加载快照文件和缓存的执行命令;
- 复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。
Redis哨兵模式
为什么需要哨兵模式?
刚刚上面讲到了主从模式当主服务器宕机后,需要手动把一台从服务器切换为主服务器,需要人工干预费事费力,为了解决这个问题出现了哨兵模式。
如下图所示:
哨兵模式由一个或多个Sentinel实例组成的Sentinel系统,它可以监视所有的Master节点和Slave节点,并在被监视的Master节点进入下线状态时,自动将下线Master服务器。
哨兵模式工作原理
当主节点出现故障时,由Redis Sentinel自动完成故障发现和转移,并通知应用方,实现高可用性。
如下图所示:
- 哨兵机制建立了多个哨兵节点(进程),共同监控数据节点的运行状况。
- 同时哨兵节点之间也互相通信,交换对主从节点的监控状况。
- 每隔1秒每个哨兵会向整个集群:Master主服务器+Slave从服务器+其他Sentinel(哨兵)进程,发送一次ping命令做一次心跳检测。
Redis集群模式
为什么需要Redis集群模式
哨兵模式基于主从模式,实现读写分离,它还可以自动切换,系统可用性更高。但是它每个节点存储的数据是一样的,浪费内存,因此在Redis3.0后Cluster集群应运而生。
Redis Cluster是一种服务器Sharding技术(分片和路由都是在服务端实现),采用多主多从,每一个分区都是由一个Redis主机和多个从机组成,片区和片区之间是相互平行的。
Redis集群模式原理
在Redis的每一个节点上,都有这么两个东西,一个是插槽(slot),它的的取值范围是:0-16383,还有一个就是cluster。
如下图所示:
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》