详细Redis入门教程

目录

1 Redis的前世今生

1.1 简介

1.2 应用场景

2 Redis下载及安装

2.1 下载及安装

3 Redis使用

3.1 数据类型

3.2 持久化

3.3 事务

3.4 脚本

语法

4 Redis集群

4.1 主从模式

4.2 Sentinel模式

1.哨兵模式集群架构

2.哨兵模式作用

3.哨兵模式工作过程

4.3 Cluster模式

1.Cluster数据分区

2.Cluster高可用

3.Cluster数据分片

4.4 集群模式对比

主从模式优缺点

哨兵模式优缺点


1 Redis的前世今生

1.1 简介

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的高性能的日志型、Key-Value数据库,并提供多种语言的API。Redis的出现补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。

1.2 应用场景

常见的16种应用场景:

缓存、数据共享分布式、分布式锁、全局 ID、计数器、限流、位统计、购物车、用户消息时间线 timeline、消息队列、抽奖、点赞、签到、打卡、商品标签、商品筛选、用户关注、推荐模型、排行榜.

2 Redis下载及安装

2.1 下载及安装

Linux下载地址:Download | Redis,下载最新稳定版本。(Windowshttps://github.com/tporadowski/redis/releases。)

本教程使用的最新文档版本为 2.8.17,下载并安装:

# wget http://download.redis.io/releases/redis-6.0.8.tar.gz
# tar xzf redis-6.0.8.tar.gz
# cd redis-6.0.8
# make

执行完 make 命令后,redis-6.0.8 的 src 目录下会出现编译后的 redis 服务程序 redis-server,还有用于测试的客户端程序 redis-cli:

下面启动 redis 服务:

# cd src
# ./redis-server

注意这种方式启动 redis 使用的是默认配置。也可以通过启动参数告诉 redis 使用指定配置文件使用下面命令启动。

# cd src
# ./redis-server ../redis.conf

redis.conf 是一个默认的配置文件。我们可以根据需要使用自己的配置文件。

启动 redis 服务进程后,就可以使用测试客户端程序 redis-cli 和 redis 服务交互了。 比如:

# cd src
# ./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

3 Redis使用

3.1 数据类型

  1. string:最基本的数据类型,二进制安全的字符串,最大512M。
  2. list:按照添加顺序保持顺序的字符串列表。
  3. set:无序的字符串集合,不存在重复的元素。
  4. sorted set:已排序的字符串集合。
  5. hash:key-value对的一种集合。
  6. bitmap:更细化的一种操作,以bit为单位。
  7. hyperloglog:基于概率的数据结构。 # 2.8.9新增
  8. Geo:地理位置信息储存起来, 并对这些信息进行操作   # 3.2新增
  9. 流(Stream)# 5.0新增

3.2 持久化

redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。

  1. RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
  2. AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。

其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。

如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样

3.3 事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  1. 批量操作在发送 EXEC 命令前被放入队列缓存。
  2. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  3. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

  1. 开始事务。
  2. 命令入队。
  3. 执行事务。

Redis 事务的相关命令:

序号 命令及描述
1 DISCARD
取消事务,放弃执行事务块内的所有命令。
2 EXEC
执行所有事务块内的命令。
3 MULTI
标记一个事务块的开始。
4 UNWATCH
取消 WATCH 命令对所有 key 的监视。
5 WATCH key [key ...]
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

3.4 脚本

Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本已内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL

语法

Eval 命令的基本语法如下:

redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]

Redis 脚本常用命令:

序号 命令及描述
1 EVAL script numkeys key [key ...] arg [arg ...]
执行 Lua 脚本。
2 EVALSHA sha1 numkeys key [key ...] arg [arg ...]
执行 Lua 脚本。
3 SCRIPT EXISTS script [script ...]
查看指定的脚本是否已经被保存在缓存当中。
4 SCRIPT FLUSH
从脚本缓存中移除所有脚本。
5 SCRIPT KILL
杀死当前正在运行的 Lua 脚本。
6 SCRIPT LOAD script
将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。

4 Redis集群

4.1 主从模式

1.主从复制概念
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

2.主从复制流程
若启动一个Slave机器进程,则它会向Master机器发送一个"sync_command"命令,请求同步连接。

无论是第一次连接还是重新连接,Master机器都会启动一个后台进程,将数据快照(RDB)保存到
数据文件中(执行rdb操作),同时Master还会记录修改数据的所有命令并缓存在数据文件中。

后台进程完成缓存操作之后,Master机器就会向Slave机器发送数据文件,Slave端机器将数据
文件保存到硬盘上,然后将其加载到内存中,接着Master机器就会将修改数据的所有操作一并发送给Slave端机器。若Slave出现故障导致宕机,则恢复正常后会自动重新连接。

Master机器收到slave端机器的连接后,将其完整的数据文件发送给Slave端机几器,如果Mater同时收到多个slave发来的,同步请求则Master会在后台启动一个进程以保存数据文件,然后将其发送给所有的Slave端机器,确保所有的Slave端机器都正常。

4.2 Sentinel模式

1.哨兵模式集群架构

是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master 并将所有 Slave 连接到新的 Master。所以整个运行哨兵的集群的数量不得少于3个节点。哨兵是Redis集群架构中非常重要的一个组件,哨兵的出现主要是解决了主从复制出现故障时需要人为干预的问题。

详细Redis入门教程_第1张图片

2.哨兵模式作用

集群监控:负责监控Redismaster和slave进程是否正常工作。

消息通知:如果某个Redis实例有故障,那么哨兵负责发送消息作为报敬通知给管理员。

故障转移:如果masternode挂掉了,会自动转移到slave node上。

配置中心:如果故障转移发生了,通知client客户端新的master地址。

3.哨兵模式工作过程

(1)三个哨兵之间建立命令连接,周期性检测队友状态。

(2)哨兵会向master节点(已在配置文件中)发送两条连接,分别是命令连接和订阅连接(为了周期性获取master节点的数据)。

(3)哨兵想master周期性发送info命令,master(活着的情况下)会返回redis-cil inforeplication master 节点的信息+从节点位置。

(4)哨兵通过master返回的信息,再会向slaves 节点发送info命令,slaves返回数据,从而哨兵集群就可以获取到redis所有集群信息。

(5)哨兵会向服务器发送命令连接,建立自己的hello频道,哨兵会向这个hello频道建立订阅,用于哨兵之间的消息共享。

4.3 Cluster模式

redis的哨兵模式基本已经可以实现高可用、读写分离,但是在这种模式每台redis服务器都存储相同的数据,很浪费内存资源,所以在redis3.0上加入了Cluster群集模式,实现了redis的分布式存储,也就是说每台redis节点存储着不同的内容根据官方推荐,集群部署至少要3台以上的master节点,最好使用3主3从六个节点的模式。

详细Redis入门教程_第2张图片

1.Cluster数据分区

数据分区(或称数据分片)是集群最核心的功能,集群将数据分散到多个节点,一方面突破了 Redis 单机内存大小的限制,存储容量大大增加,另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力,Redis 单机内存大小受限问题,在介绍持久化和主从复制时都有提及。

2.Cluster高可用

集群支持主从复制和主节点的自动故障转移(与哨兵类似),当任意节点发送故障时,集群仍然可以对外提供服务。

3.Cluster数据分片

Redis 集群引入了哈希槽的概念,有 16384 个哈希槽(编号 0~16383)。集群的每个节点负责一部分哈希槽,每个 Key 通过 CRC16 校验后对 16384 取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。

以 3 个节点组成的集群为例:
节点 A 包含 0~5469 号的哈希槽
节点 B 包含 5461~10922 号的哈希槽
节点 C 包含 10923~16383 号的哈希槽

4.4 集群模式对比

主从模式优缺点
优点: 
主从结构具有读写分离,提高效率、数据备份,提供多个副本等优点。

不足: 最大的不足就是主从模式不具备自动容错和恢复功能,主节点故障,集群则无法进行工作,可用性比较低,从节点升主节点需要人工手动干预。

哨兵模式优缺点
优点: 
哨兵模式是基于主从模式的,解决可主从模式中master故障不可以自动切换故障的问题。

不足: (1)是一种中心化的集群实现方案:始终只有一个Redis主机来接收和处理写请求,写操作受单机瓶颈影响。

         (2)集群里所有节点保存的都是全量数据,浪费内存空间,没有真正实现分布式存储。数据量过大时,主从同步严重影响master的性能。

         (3)Redis主机宕机后,哨兵模式正在投票选举的情况之外,因为投票选举结束之前,谁也不知道主机和从机是谁,此时Redis也会开启保护机制,禁止写操作,直到选举出了新的Redis主机

Redis Cluster模式优缺点

优点: 数据依照slot存储分布在多个节点,节点间数据共享,能够动态调整数据分布;可扩展性;无中心架构;高可用性;能够降低运维成本,有效提高系统的可用性以及扩展性。

不足: 数据通过异步复制,不保证数据的强一致性;Client 实现复杂;节点会因为某些原因发生阻塞被判断下线;多个业务使用同一套集群的时候,不能够依据统计区分冷热数据,资源隔离性较差,非常容易出现互相影响;Slave 在集群中充当“冷备”,不能缓解读压力;Key批量操作限制;Key事务操作支持有限;Key不可以将一个很大的键值对象如 hash、list 等映射到不同的节点;不支持多数据库空间;复制结构只支持一层;避免产生hot-key,导致主库节点成为系统的短板;避免产生 big-key,导致网卡撑爆、慢查询等;重试时间应该大于cluster-node-time时间;

你可能感兴趣的:(java,redis,数据库,缓存)