什么是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进行了修改,所以使用方法上和操作命令略有不同,此处暂略。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。