什么是 Redis?
随着访问量的晋升,关系型数据库多多少少遇到了瓶颈,为了克服这一问题,NoSQL(Not Only SQL)应运而生,它同时具备了高性能、可扩展性强、高可用等长处。
redis 是当初受欢迎的 NoSQL 数据库之一,是由 C 语言开发的,蕴含多种数据结构,反对网络,基于内存,可选持久性的键值对存储数据库。
Redis 特点
* redis 反对多种数据结构
* redis 通过 key-value 的模式存储数据
* redis 反对数据的长久化
* redis 反对主从模式,能够配置集群
* 基于内存运行,性能高效
Redis 装置
附一个官网地址,微妙链接
redis 尽管也有 Windows 版,然而还是举荐在 linux 零碎下装置。
- 下载 redis.tar.gz 包并发送到 linux 零碎。
- 解压 tar 包,
tar -zxvf redis-6.2.1.tar.gz -C dir
。 -
进入解压后的 src 目录中,执行
make
命令,此命令编译 C,然而须要 gcc 反对,没有能够应用 yum 提前下载 gcc。- 如果编译过程中报错提醒没有 gcc 反对,在退出编译并装置 gcc 后须要应用
make distclean
将之前编译的内容革除。 - 编译胜利之后,执行
make install
命令将可执行文件拷贝到/usr/local/bin
。
- 如果编译过程中报错提醒没有 gcc 反对,在退出编译并装置 gcc 后须要应用
- 装置胜利。
Redis 服务启动
次要有以下三种形式
-
redis-server
- 前台启动 redis,此办法启动后会占用控制台并应用默认配置启动 redis 服务。
-
redis-server &
- 后盾启动 redis,此办法不会占用控制台,也是应用默认配置启动 redis 服务。
-
redis-server redis.conf &
- 后盾应用指定配置文件启动 redis,应用指定配置文件中的配置启动 redis 服务。(配置文件模板为 redis 根目录的 redis.conf
Redis 服务敞开
次要有一下两种形式
-
kill -9 pid
- 括弧笑。慎用!!!
-
redis-cli shutdown
- 此办法默认敞开本机上端口为 6379 的 redis 服务,如果批改了端口或 ip,须要批改为以下格局
redis-cli -h ipadress -p port shutdown
。
- 此办法默认敞开本机上端口为 6379 的 redis 服务,如果批改了端口或 ip,须要批改为以下格局
Redis 客户端
redis 默认带有客户端为redis-cli
连贯形式为 redis-cli -h ipadress -p port -a password
,如果 redis 装置在本机且端口为默认的 6379 能够间接应用 redis-cli
连贯。
退出客户端只须要执行 exit
命令。
Redis 基本知识
- 测试 redis 服务性能:
redis-benchmark
命令,参数具体如下表 - 测试客户端与服务端连贯状况:
ping
命令,须要在客户端中执行,连贯失常返回PONG
。 - 查看 redis 信息:
info
命令,须要在客户端中执行,也能够在前面加指定内容信息,例info cpu
。 - redis 默认创立 16 个数据库,依据 [0,15] 编号命名,无奈本人创立,如果有数据库实例数量要求能够通过配置文件批改。
- 客户端默认连贯 0 号数据库实例,能够应用
select index
命令切换数据库实例。 - 显示以后数据库实例有多少数据(key 的数量)须要在客户端中执行:
dbsize
命令。 - 清空以后数据库实例,须要在客户端中执行:
flushdb
。 - 清空所有数据库实例,须要在客户端中执行:
flushall
。 - 查看配置信息,须要在客户端中执行:
config get *
,也能够执行某条配置,例config get port
。
Redis 的数据结构
redis 实质上还是数据库,职能是贮存数据,针对于程序处理后的数据,redis 提供了多种数据类型存储。
String
特点:单 key 对应单个 value
List
特点:单 key 对应多个 value,value 容许反复且有序(按插入程序排序)
Set
特点:单 key 对应多个 value,value 不容许反复且无序。
Hash
特点:单 key 对应多个 filed-value 对。
Zset
特点:单 key 对应多个 value,每个 value 对应一个 score 值,value 不容许反复且有序(依照 score 从小到大排序)
Redis 的操作命令
<font color=red>所有操作命令都在客户端中应用。</font>
对于 Key 的操作命令
-
keys *
- 查找所有所有合乎通配符的 key。
*
匹配一个或多个字符?
匹配一个字符[]
匹配一个字符且字符须要在 [] 中提前定义。- 命令返回以后数据库实例中所有 key。
-
exists key1 [key2 ...]
- 判断一个或多个 key 在以后实例是否存在。
- 返回在以后数据库实例中存在的 key 的个数。
-
move key index
- 将指定 key 挪动到指定编号的数据库实例。一次只能挪动一个 key。
- 挪动胜利返回 1
-
ttl key
- 查问指定 key 的残余生存工夫(秒)
- 失常返回剩余时间,key 不存在返回 -2,key 没有设置生存工夫返回 -1
-
expire key seconds
- 为指定的 key 设置最大的生存工夫(秒)
- 设置胜利返回 1
-
type key
- 查看指定 key 对应 value 的类型。
- 返回 value 的类型。
-
rename key newkey
- 重命名 key
-
del key1 [key2 ...]
- 删除指定的 key
- 返回胜利删除的 key 的个数。
无关 String 类型的操作命令
-
set key value
- 保留一个 String 类型的值。
- 若 key 存在,则 value 将原值笼罩。
-
get key
- 获取指定 key 对应的值。
-
append key value
- 在指定 key 对应的值后追加 value
- 返回追加后的值的长度。
- 如果指定的 key 不存在,则该命令相当于
set
-
incr key
- 如果指定 key 对应的值是数值,则进行加一操作;不是数值则报错。
- 如果指定的 key 不存在,则新建一个,并将值初始化为 0,再进行操作。
- 返回值操作后的后果。
-
decr key
- 减一操作,规定同上。
-
incrby key offset
- 对值执行加 offset 操作,规定同上。
-
decrby key offset
- 对值执行减 offset 操作,规定同上。
-
strlen key
- 获取指定 key 对应值的长度。
- 返回长度。
-
getrange key startIndex endIndex
- 截取指定 key 对应的值指定区间的内容。
- startIndex endIndex 采纳闭区间。
- 字符串由左至右下标从 0 开始,由右至左从 -1 开始。所以若要截取整个字符串的内容,能够应用
getrange key 0 -1
- 返回指定区间造成的子字符串。
-
setrange key startIndex value
- 用 value 从 startIndex 开始笼罩原值,value 多长则笼罩多少内容。
- 返回批改之后的字符串的长度。
-
setex key seconds value
- 设置值的同时设置最大生存工夫。
-
setnx key value
- 插入时进行检测,若 key 已存在,则插入失败。
- 插入胜利返回 1,插入失败返回 0
-
mset key1 value1 [key2 value2 ...]
- 批量插入值。
-
mget key1 [key2 ...]
- 批量获取值。
- 若 key 不存在,返回 nil
-
msetnx key1 value1 [key2 value2 ...]
- 批量插入值,只有有一个值存在,则全副放弃插入。
无关 List 类型的操作命令
-
lpush key value1 [value2 ...]
- 将一个或多个值顺次插入到表头(左侧)
- 该命令将值顺次插入表头,例
lpush k1 1 2 3
,插入后果为 3 2 1 - 返回插入后的列表长度。
-
lrange key startIndex endIndex
- 查看指定 key 对应列表中指定区间的值。
- startIndex endIndex 采纳闭区间。
- 由左至右下标从 0 开始,由右至左从 -1 开始。若想显示整个列表,例
lrange key 0 -1
-
rpush key value1 [value2 ...]
- 将一个或多个值顺次插入到表尾(右侧)
- 返回插入后的列表长度。
-
lpop key [count]
- 删除从表头开始 count 个元素。
- 返回被删除的元素。
-
lindex key index
- 获取指定下标的元素。
-
llen key
- 获取指定列表的长度。
-
rpop key [count]
- 删除从表尾开始 count 个元素。
- 返回被删除的元素
-
lrem key count value
-
在指定列表中删除 count 个与 value 相等的值。
- count > 0 则从表头开始删除。
- count < 0 则从表尾开始删除。
- count = 0 则删除所有。
-
无关 Set 类型的操作命令
-
sadd key member1 [member2 ...]
- 将一个或多个数据寄存到汇合中。
- 如果值曾经存在则疏忽。
- 返回胜利插入的个数。
-
smembers key
- 查问汇合中的所有元素。
-
sismember key member
- 查问元素在汇合中是否存在。
- 存在返回 1,不存在返回 0
-
scard key
- 查问指定汇合的长度。
-
srem key member1 [member2 ...]
- 在指定汇合中删除一个或多个值。
- 返回胜利删除的元素个数。
-
srandmember key count
-
在指定汇合中随机获取 count 个值。
- count > 0 count 个不反复的值
- count < 0 count 个可能反复的值
-
-
spop key count
- 在指定汇合中随机删除一个或多个元素。
- 返回被删除的元素。
-
smove source dest member
- 将源汇合中的指定元素挪动到另一个汇合中。
-
sdiff key1 key2 [key3 ...]
- 返回指定汇合与其余汇合的差集。
-
sinter key1 key2 [key3 ...]
- 返回指定汇合与其余汇合的交加。
-
sunion key1 key2 [key3 ...]
- 返回指定汇合与其余汇合的并集。
无关 Hash 类型的操作命令
-
hset key field1 value1 [field2 value2 ...]
- 在指定哈希表中插入一个或多个元素。
- 返回插入胜利的元素个数。
-
hget key field
- 获取指定哈希表中指定属性的值。
-
hmset key field1 value1 [field2 value2 ...]
- 在指定哈希表中批量插入元素。
- 感觉和 set 没什么区别?
-
hmget key field1 [field2 ...]
- 获取指定哈希表中的多个属性值。
-
hgetall key
- 获取指定哈希表中所有属性。
-
hdel key field1 [field2 ...]
- 删除指定哈希表中的一个或多个属性值。
-
hlen key
- 返回指定哈希表中有多少属性值。
-
hexists key field
- 查问指定哈希表中是否有某元素。
-
hkeys key
- 返回指定哈希表中的所有 field 值,不返回 value 值。
-
hvals key
- 返回指定哈希表中的所有 value 值,不返回 field 值。
-
hincrby key field int
- 将指定哈希表中指定属性的值进行加 int 操作。
- 若指定属性值不为数值则报错。
- int 为整数。
- 返回操作之后的数值。
-
hincrbyfloat key field float
- 规定同上。
- float 为小数。
-
hsetnx key field value
- 插入前验证,属性存在则插入失败。
无关 Zset 的操作命令
-
zadd key score1 member1 [score2 member2 ...]
- 向指定有序汇合中插入一个或多个元素。
- 元素插入后会依据 score 值天然排序,由小至大。
- 有序汇合实质还是汇合,不容许数据反复,当呈现反复数据时,会笼罩之前的 score 值。
-
zrange key startIndex endIndex [withscores]
- 因为曾经进行天然排序,所有能够通过下标进行区间取值。
- 由左至右下标从 0 开始,由右至左从 -1 开始。若想显示整个列表,例
zrange key 0 -1
- 增加 withscores 则会同时返回每个元素对应的 score 值。
- 反向排序应用
zrevrange
命令,参数不变。
-
zrangebyscore key min max [withscores]
- 获取指定有序汇合中指定 score 区间的元素。
- 增加 withscores 则会同时返回每个元素对应的 score 值。
- 反向排序应用
zrevrangebyscore
命令,参数不变。
-
zrem key member1 [member2 ...]
- 在指定有序汇合中删除一个或多个元素。
-
zcard key
- 获取指定有序汇合的长度。
-
zrank key member
- 获取指定有序汇合中指定元素的排名。
- 天然排序,由 0 开始。
- 反向排序,应用
zrevrank
命令,参数不变。
-
zcount key min max
- 获取指定有序汇合中指定 score 区间的元素个数。
-
zscore key member
- 获取指定有序汇合中指定元素的 score 值。
Redis 的配置文件
redis 的配置文件模板在解压目录根目录的 redis.conf,这里简略说几个配置。
网络配置
- port 配置 redis 服务启动的端口号。
- bind 配置客户端连贯服务的 IP 地址,默认应用 redis 服务所在主机上的任何一个 IP 都能够连贯到服务。
- tcp-keepalive 保活策略,设置服务端隔多少秒确认客户端存活,设置为 0 则不进行保活检测。
惯例配置
- loglevel 日志级别,分为 debug,notice,warning,默认为 notice
- logfile 指定日志文件,默认将日志输入到控制台。
- databases 配置创立数据库实例个数,默认 16
平安配置
1. requirepass 配置拜访明码,默认不应用明码。2. 如果配置了明码,须要将 protected-mode 设置成 yes
Redis 的长久化
redis 是基于内存的数据库,避免意外失落数据,redis 反对数据的长久化,将内存中的数据存到磁盘,下次 redis 服务启动的时候再从磁盘读取到内存中。
RDB
RDB 策略是 redis 默认的长久化策略。
在指定的工夫距离内,redis 服务执行指定次数的写操作,会主动触发一次长久话操作。
RDB 策略默认的工夫距离是,1 分钟内 10000 次,5 分钟内 10 次,15 分钟内 1 次。
- 如果想禁用 RDB 策略,正文掉配置文件中 save 配置就能够。
具体配置略。
AOF
AOF 策略采纳操作日志的形式来记录每一次写操作,每次 redis 启动时,都会从新执行一遍记录的操作指令。
局部配置:
- appendonly 是否开启 AOF
- appendfilename 日志保留文件名
-
appendfsync AOF 异步策略
- always 同步长久话,每次变动都会被写入磁盘
- everysec 默认,每秒写入磁盘一次
- no 不即时同步
Redis 的事务
redis 为了谋求执行的高效性,就义了事务的原子性。redis 的事务是将一系列命令放在一起,将命令序列化之后顺次执行,只能实现局部原子性。
Redis 的局部原子性
redis 的事务是将一系列命令先压入命令队列再执行,如果在压入命令队列时呈现谬误,则事务被放弃,事务内的所有命令都不执行;若是在执行事务的过程中呈现谬误,则只有出错的命令无奈执行,其余命令失常执行。
redis 对于事务的操作命令
-
multi
- 标记一个事务的开始,即创立一个命令队列,该命令之后的命令都不会立即执行而是被压入命令队列。
-
exec
- 事务开始执行,开始执行命令队列中的命令。
-
discard
- 放弃以后事务。
-
watch key
- 相似乐观锁机制,在 multi 之前由该命令监督一个 key,当事务开始执行时,当被监督的 key 发生变化时,事务放弃执行。
-
unwatch
- 放弃所有监督。
Redis 的音讯公布和订阅
redis 同时还提供了客户端之间交互的性能,然而大部分此性能都是由消息中间件实现,所以只做理解。
操作命令
-
subscribe ch1 [ch2 ...]
- 订阅一个或多个频道
-
publish ch1 message
- 向指定频道公布音讯
-
psubscribe ch1*
- 批量订阅频道,反对通配符
Redis 的集群
redis 反对集群模式,提供了主机数据更新后依据配置和策略主动同步到从机的 master/slave 机制,master 服务以写为主,slave 只能进行读操作。
一主二从搭建(宕机手动调整)
次要实现了,主写从读,读写拆散
- 首先须要三个 redis 服务,能够三台服务器启动或是同一服务器通过配置不同接口启动三个互不干涉的 redis 服务。
info replication
命令查看 redis 服务的主从角色。-
设置主从关系,设从不设主。
- 在两台从机上执行 slaveof ip port
- ip 和 port 为主机 redis 服务的 ip 和端口。
- 当主从关系确定后,主机中已有的数据会复制到从机中,这被称为全量复制。
- 主机每次进行写操作后,批改的内容会被同步到从机中,这被称为增量复制。
- 当主机宕机时,从机仍能够进行读操作且不会扭转以后的主从关系。
- 主机复原后,集群失常复原。
- 当从机宕机时,集群失常应用。
- 从机复原后失落主从关系,须要重新配置。
-
主机宕机,从机上位操作步骤
- 主机宕机后,从机执行
slaveof no one
断开以后的主从状态。 - 从新设置主从关系。
- 此时主机复原后,成为一个独立的 redis 服务,与集群没有关系。
- 主机宕机后,从机执行
哨兵模式
redis 的主从模式实现了性能,然而主机宕机之后须要手动从新设置主从状态,而且咱们无奈预测主机过后工夫,为了解决这个问题 redis 提供了哨兵模式。
哨兵模式次要是通过哨兵程序监控主机状态,当发现主机宕机之后,在从机中选举一个新的主机。
哨兵程序的配置模板在 reids 根目录的 sectinel.conf
具体配置略。
简略配置,新建一个配置文件,只退出如下配置。
sentinel monitor dc-redis ipadress port num
- 其中 dc-redis 为自定义的名称。
- ipadress port 为集群主机的 ip 地址和端口。
- num 示意新主机选举得票数,最先失去指定票数的从机成为主机。
随后启动哨兵
redis-sentinel sentinel.conf
启动哨兵之后,当主机再产生宕机,则会进行选举呈现新的主机,当原主机修复之后,主动成为新主机的从机。
Jedis
jedis 是 redis 官网推出的 java 管制 redis 的工具,次要是将 redis 的操作指令封装成了 java 办法,此处暂略。
Spring Boot 整合 Redis
redis 的 starter 中对原有的 API 进行了批改,所以应用办法上和操作命令略有不同,此处暂略。