Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。
通用命令
- dbsize 数据库内
键的数量
flushdb 清除
当前数据库
的全部数据flushall 清除
全部数据库
的全部数据select 切换数据库
select 1
切换至数据库db[1],默认在db[0]数据库。auth 认证
auth 密码
key相关命令
keys pattern
查找所有符合给定模式pattern(正则表达式)的 key 。
⚠️常用:
keys *
显示当前数据库中的全部键keys hello*
显示当前数据库中所有以hello
开头的键keys test?
显示当前数据库中以test
开头且后面存在一个字符的键。
exists key
判断是否存在指定的key。返回值含义如下:
1
key存在0
key不存在
del key
删除指定的key。
move key db
移动指定的key至指定索引的数据库中。移动后该键在本库中删除。
1 | # 举个栗子 |
expire key seconds
给指定的key设置过期时间,单位为秒
。
1 | # 举个栗子 |
ttl key
查看指定的key还有多少秒过期。
⚠️注意:返回值为 -1
表示永不过期,-2
表示已过期。
type key
查看指定的key的数据类型,如list、set、string、hash等。
五大常用数据结构
String字符串
最基本的数据类型,一个key对应着唯一的value,一个value最多可存储512M
。同时它是二进制安全
的,即它用于存储任何形式的数据,如图片、视频或者序列化对象等。
set/get/del/strlen
用于新增/获取/删除/获取指定Key对于value的字符串长度。
在使用strlen
命令时,一个汉字的长度为3
。
incr/decr/incrby/decrby
incr/decr key
对指定的key进行自增/自减1
的操作
incrby/decrby key n
对指定的key进行增/减n
的操作
⚠️ 必须是数字才能进行上述四种操作!!
getrange/setrange
getrange key start end
用于获取指定key的子字符串
setrange key offset value
用于设置指定key从指定的offset处开始覆盖value的值
setex/setnx
setex:set with expire 新建key时同时指定过期时间
setnx:set if not exist 若key不存在则创建成功(1),否则创建失败(0)
setex key seconds value
新增键值对的同时指定该键的过期时间,单位秒
setnx key value
仅新增不存在的键值对,若已存在则创建失败
mget/mset/msetnx
mget key1 key2 kwy3
同时获取多个键对应的值mset key1 value1 key2
同时设置多个键值对msetnx key1 value1 key2
同时创建多个不存在
的键值对
1 | # 举个栗子 |
⚠️注意:mset
和msetnx
都是原子操作
,要么全部执行,要么全都失败。
Hash哈希散列
hash是的value是一个键值对
,类似于Java中的Map<String,Object>。适用于存储对象
hset/hget/hdel/hmget/hmset/hgetall
hset key field value
设置 key 指定的哈希集中指定字段的值1
2
3
4# 举个栗子
hset hero id 1 # 设置哈希hero的id属性值为1
hset hero blood 1000 # 设置哈希hero的blood属性值为1000
hset hero name 小明 # 设置哈希hero的name属性值为小明
hget key field
获取hash集中指定key的指定属性值1
2
3# 举个栗子
hget hero name # 获取name属性的值
hget hero blood # 获取blood属性的值
hgetall key
获取hash集中指定key的全部属性值1
2
3
4
5
6
7
8
9# 举个栗子
# 获取hero中的全部属性及其值
127.0.0.1:6379> hgetall hero
id
1
blood
1000
name
小
hdel key field [field...]
删除hash集中指定key的一个或多个属性1
2
3# 举个栗子
# 删除hero的id和name属性
hdel hero id namehmset key field value [field value...]
批量设置hash集中指定key的属性1
2
3# 举个栗子
# hero新增id和name属性
hmset hero name 小明 id 1hmget key field [field...]
1
2
3# 举个栗子
# 获取hero中的blood和id属性的值
hmget hero id blood
hlen
hlen key
返回 key
指定的哈希集key中包含的属性的数量
1 | # 举个栗子 |
hexists
hexists key field
判断指定的哈希集key中是否包含指定的属性
返回值含义:
1
hash里面包含该field。0
hash里面不包含该field或者key不存在。
1 | # 举个栗子 |
hstrlen
hstrlen key field
返回hash指定field的value的字符串长度,如果hash或者field不存在,返回0.
1 | # 举个栗子 |
hsetnx
hsetnx key field value
只在指定的哈希集 key中不存在指定的字段时,设置字段的值。
1 | # 举个栗子 |
hkeys/hvals
hekys key
返回 key 指定的哈希集中所有属性的名字hvals key
返回 key 指定的哈希集中所有属性的值
1 | # 举个栗子 |
hincrby/hincrbyfloat
hincrby key field n
增加/减少指定的哈希集key
中指定字段的数值nhincrbyfloat field n
将指定hash集key
的field
字段值增加/减少
float类型的数值n
1 | # 举个栗子 |
⚠️ 注意: hincrby
支持的值的范围限定在64位有符号整数
。integer类型的属性能使用hincrbyfloat
命令进行增加/减少操作,但是float类型的属性不能使用hincrby
命令进行增加/减少一个整数。
List列表
list是简单的字符串列表,它的底层实现是双向循环链表
,即可在元素的头部
或尾部
添加新元素。
lpush/rpush/lrange
lpush key value1 value2
新建list类型的key并在元素头部添加新元素rpush key value1 value2
新建list类型的key并在元素尾部添加新元素lrange start end
查看列表中指定索引范围的元素。
1 | # 举个栗子 |
lop/rpop
lpop key
移除并且返回指定 key 对应的 list 的头部第一个元素
。rpop key
移除并且返回 指定key 对应的 list 的尾部第一个元素
。
1 | # 举个栗子 |
lindex
lindex key index
按照列表的下标(从头部到尾部,从0开始
)索引获取元素
1 | # 举个栗子 |
lrem
lrem key count value
从存于 key 的列表里移除前 count 次出现的值为 value 的元素。
这个 count 参数通过下面几种方式影响这个操作:
- count > 0:
从头往尾
移除值为 value 的元素。 - count < 0:
从尾往头
移除值为 value 的元素。 - count = 0:
移除所有
值为 value 的元素。
ltrim
ltrim key start end
截取指定范围[start,end]的值后重新赋值给key
1 | # 举个栗子 |
rpoplpush
rpoplpush source destination
原子性
地返回并移除存储在 source 的列表的最后一个元素(列表尾部元素), 并把该元素放入存储在 destination 的列表的第一个元素位置(列表头部)。
1 | # 举个栗子 |
lset
lset key index value
:将指定索引处的元素更新为指定的value值。
1 | # 举个栗子 |
linsert
linsert key before/after value1 value2
:在指定的value1的前面/后面插入一个新的元素value2
1 | # 举个栗子 |
⚠️注意:若列表中存在多个value1
,那么会以头部到尾部开始第一个value1为准
。
lpushx/rpushx
lpushx key value
将值 value 插入到列表 key 的表头
,当且仅当 key 存在并且是一个列表
。rpushx key value
将值 value 插入到列表 key 的表尾
,当且仅当 key 存在并且是一个列表
。
⚠️注意:在进行lpushx/rpushx命令时,若当key不存在则什么也不做
。
Set集合
它是string类型的无序、无重复
集合,底层实现为HashTable
。
sadd/smembers/sismember
sadd key member1 member2
添加一个或多个指定的member元素到集合的 key中smembers key
获取指定key集合的所有元素sismember key member
返回指定成员 member 是否是指定集合 key的成员- 如果member元素不是key的成员,或者集合key不存在,则
返回0
- 如果member元素是集合key的成员,则
返回1
- 如果member元素不是key的成员,或者集合key不存在,则
1 | # 举个栗子 |
srem
srem key value
删除集合key中指定成员
1 | # 举个栗子 |
srandmember
srandmember key [count]
默认随机获取集合中的一个成员,当count被指定时,则随机获取指定的成员数。
1 | # 举个栗子 |
spop
spop key [count]
从存储在key的集合中移除并返回
一个或多个随机元素。
1 | # 举个栗子 |
smove
smove source destination member
将member从source集合移动到destination集合中。
- 如果该元素
成功移除
,返回1
- 如果
该元素不是source集合成员
,无任何操作,返回0
1 | # 举个栗子 |
如果source 集合不存在或者不包含指定的元素,这smove命令不执行任何操作并且返回0。否则对象将会从source集合中移除,并添加到destination集合中去,如果destination集合已经存在该元素,则smove命令仅将该元素充source集合中移除.。如果source 和destination不是集合类型,则返回错误。
数学集合
sdiff key [key...]
返回一个集合与给定集合的差集
的元素1
2
3
4
5
6
7
8# 举个栗子
key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SDIFF key1 key2 key3 = {b,d}
# 解析
# sdiff key1 key2 = {a,b,d}
# sdiff {a,b,d} key3 = {b,d}sinter key [key...]
返回指定所有的集合的成员的交集
1
2
3
4
5# 举个栗子
key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
sinter key1 key2 key3 = {c}sunion key [key...]
返回给定的多个集合的并集
中的所有成员1
2
3
4
5# 举个栗子
key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
sunion key1 key2 key3 = {a,b,c,d,e}
Sorted Set有序集合Zset
它是string类型的有序、无重复
集合。且每个元素都会关联一个double类型
的分数
,然后通过分数
将元素从小到大
排序。
⚠️注意:集合内的元素的唯一的,但是分数可以重复。
zadd/zrange
zadd key score member [socre member...]
将所有指定成员添加到键为key
有序集合里面zrange key start end [withsocres]
返回存储在有序集合key
中的指定范围的元素。
1 | # 举个栗子 |
zrange
默认由低到高
显示,可使用zrevrange
命令进行由高到低
显示,用法与zrange一致。
zrangebyscore/zcount
zrangebyscore key min max [withscores] [limit offset count]
获取指定分数范围的成员1
2
3
4
5# 举个栗子
zrangebyscore list 90 100 # 获取分数在[90,100]范围的成员
zrangebyscore list 90 100 withscores # 获取分数在[90,100]范围的成员,并显示分数
# 获取分数在[90,100]范围的成员,并分页显示。offset表示从哪开始,count表示显示几个成员。
zrangebyscore list 90 100 limit 0 2zcount key min max
获取指定分数范围的成员个数。1
2# 举个栗子
zcount list 90 100 # 获取分数在[90,100]范围内的成员的个数
zincrby
zincrby key increment member
增加/减少指定的成员的分数
1 | # 举个栗子 |
⚠️ score值必须是字符串表示的整数值或双精度浮点数
,并且能接受double精度的浮点数。也有可能给一个负数来减少score的值。
zcard
zcard key
获取指定key的有序集成员个数。
1 | # 举个栗子 |
zremrangebylex/ zremrangebyrank/zremrangebyscore
zremrangeabylex key min max
根据名称
删除按字典由低到高排序成员之间所有成员1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 举个栗子
# 新增有序集合set02
127.0.0.1:6379> zadd set02 88 tom 88 jery 88 mary 88 david 88 kate
# 查看有序集合顺序
127.0.0.1:6379> zrange set02 0 -1 withscores
david
88
jery
88
kate
88
mary
88
tom
88
# 删除在[mary,tom)范围内的成员
127.0.0.1:6379> zremrangebylex set02 [mary (tom
1 # 返回删除的成员个数⚠️警告:
不要在成员分数不同的有序集合中使用
zremrangebylex
命令, 否则会导致删除的结果不正确。可以使用 “
-
“ 和 “+
” 表示得分最小值和最大值,使用该范围表示删除有序集合全部成员。
zremrangebyrank key start stop
移除
有序集key中,指定排名(rank)在[start,stop]区间内
的所有成员。下标参数start和stop都以0为底,0处是分数最小的那个元素。这些索引也可是负数,表示位移从最高分处开始数。例如,-1是分数最高的元素,-2是分数第二高的,依次类推。1
2
3
4# 举个栗子
zadd set03 67 tom 78 jery 75 kate 90 david
zremrangebyrank set03 0 2 # 删掉最后3名,只剩最高分david
zremrangebyrank set03 -3 -1 # 删掉前3名,只剩最低分tomzremrangebyscore key min max
移除有序集key中,所有score值在[min,max]范围的成员。1
2
3# 举个栗子
zremrangebyscore set03 75 80 移除分数在[75,80]范围的成员,即kate、jery
zremrangebyscore set03 (75 80 移除分数在(75,80]范围的成员,即jery
zrank/zrevrank
zrank key member
返回有序集key中成员member的排名。排名以0为底
,也就是说,score值最小的成员排名为0。使用zrevrank
命令可以获得成员按score值递减(从大到小
)排列的排名
1 | # 举个栗子 |
持久化
RDB
即Redis DataBase
, 在指定的时间间隔内
将内存中的数据集快照写入磁盘,恢复时是将快照文件读入内存。
持久化文件
RDB 保存的持久化文件是dump.rdb
配置
save <seconds> <changes>
开启/关闭 RDB
例如:
sava 300 1 表示若300秒内有一个key发生改变则触发持久化一次。
save “” 表示禁用RDB
⚠️注意:在使用
flushall
、shutdown
、save
、bgsave
等命令时会立即强制将当前内存中的数据集快照写入磁盘。flushall
命令执行后立即产生dump.rdb文件,但里面是空的,无意义。save
命令执行时只管保存,其他操作全部阻塞
。bgsave
命令执行后Redis会在后台异步
进行快照备份。
优势
- 适合大规模的数据恢复
- 对数据的完整性和一致性要求不高
劣势
每次间隔一定时间进行数据备份,若Redis宕机,则或丢失最后一次备份后的全部修改。
AOF
即Append Only File
,以日志
的形式记录每个写操作
(读操作不记录)。
持久化文件
AOF 保存的持久化文件是appendonly.aof
配置
appendonly yes/no
开启或关闭AOF,默认关闭。appendfsync everysec/always/no
出厂默认推荐everysec,异步操作,每秒记录。
⚠️注意:AOF与RDB可同时开启,但先加载aof文件
。
修复 aof文件
使用redis-check- --fix appendonly.aof
命令将aof文件中不符合其语法的语句删除掉。