Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets) 与范围查询, bitmapshyperloglogs地理空间(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
2
3
4
# 举个栗子
move hello 3 # 将hello移动至db[3]数据库中
select 3 # 进入db[2]数据库中
get hello # 得到hello键对应的值

expire key seconds

给指定的key设置过期时间单位为秒

1
2
# 举个栗子
expire hello 30 # 30秒后hello键将删除

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
2
3
4
# 举个栗子
mget test1 test2 # 获取test1和test2的值
mset t1 aaa t2 bbb # 分别设置t1、t2的值为aaa、bbb
msetnx k1 aaa k2 bbb # 若k1、k2均不存在,则分别设置k1、k2的值为aaa、bbb

⚠️注意:msetmsetnx都是原子操作要么全部执行,要么全都失败

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 name
  • hmset key field value [field value...] 批量设置hash集中指定key的属性

    1
    2
    3
    # 举个栗子
    # hero新增id和name属性
    hmset hero name 小明 id 1
  • hmget key field [field...]

    1
    2
    3
    # 举个栗子
    # 获取hero中的blood和id属性的值
    hmget hero id blood

hlen

hlen key 返回 key 指定的哈希集key中包含的属性的数量

1
2
# 举个栗子
hlen hero # hero哈希集中的属性数量应为3

hexists

hexists key field 判断指定的哈希集key中是否包含指定的属性

返回值含义:

  • 1 hash里面包含该field
  • 0 hash里面不包含该field或者key不存在
1
2
3
# 举个栗子
hexists hero name # 1
hexists hero gender # 0

hstrlen

hstrlen key field 返回hash指定field的value的字符串长度,如果hash或者field不存在,返回0.

1
2
# 举个栗子
hstrlen hero name # 6,一个汉字占3个字节

hsetnx

hsetnx key field value 在指定的哈希集 key中不存在指定的字段时,设置字段的值。

1
2
3
# 举个栗子
hsetnx hero name 123 # 创建失败,name属性已存在
hsernx hero email 123@qq.com # 创建成功,hero新增email属性

hkeys/hvals

  • hekys key 返回 key 指定的哈希集中所有属性的名字
  • hvals key 返回 key 指定的哈希集中所有属性的值
1
2
3
4
5
6
7
8
9
# 举个栗子
127.0.0.1:6379> hkeys hero
blood
name
id
127.0.0.1:6379> hvals hero
1000
小明
1

hincrby/hincrbyfloat

  • hincrby key field n 增加/减少指定的哈希集key中指定字段的数值n
  • hincrbyfloat field n 将指定hash集keyfield字段值增加/减少float类型的数值n
1
2
3
4
5
# 举个栗子
hincrby hero id 1 # hero的id属性值增加1
hincrby hero id -1 # hero的id属性值减少1
hincrby hero id 0.5 # hero的id属性值增加0.5
hincrby hero id -0.5 # hero的id属性值减少0.5

⚠️ 注意: 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
2
3
4
5
# 举个栗子
lpush hello h1 h2 # 从hello键头部依次添加元素h1、h2
lrange hello 0 -1 # 输出hello的值:h2、h1
rpush hello h3 h4 # 从hello键尾部依次添加元素h3、h4
lrange hello 0 -1 # 输出hello的值:h2、h1、h3、h4

lop/rpop

  • lpop key 移除并且返回指定 key 对应的 list 的头部第一个元素
  • rpop key 移除并且返回 指定key 对应的 list 的尾部第一个元素
1
2
3
# 举个栗子
lpop hello # 弹出hello列表的头部第一个元素
rpop hello # 弹出hello列表的尾部第一个元素

lindex

lindex key index按照列表的下标(从头部到尾部,从0开始)索引获取元素

1
2
3
# 举个栗子
lindex hello 1 # 获取hello头部的第2个元素
lindex t1 2 # 获取t1头部的第2个元素

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
2
3
4
5
# 举个栗子
# 假设t1键对应的值为1,2,3,4,5,6,7
# 截取索引范围为[2,5]的值后载赋值给t1
ltrim t1 2 5
# 截取后的t1对应的值为5,4,3,2

rpoplpush

rpoplpush source destination

原子性地返回并移除存储在 source 的列表的最后一个元素(列表尾部元素), 并把该元素放入存储在 destination 的列表的第一个元素位置(列表头部)。

1
2
3
4
5
6
# 举个栗子
# 假设t1列表有1,2,3 T2 列表有a,b,c
# 那么rpoplpush t1 T2后
rpoplpush t1 T2
# t1列表的值:1,2
# T2列表的值:3,a,b,c

lset

lset key index value:将指定索引处的元素更新为指定的value值。

1
2
3
4
# 举个栗子
# 假设t1列表中有元素:1,2,3,4,5
lset t1 2 three
# 执行后t1列表的元素为:1,2,three,4,5

linsert

linsert key before/after value1 value2:在指定的value1的前面/后面插入一个新的元素value2

1
2
3
4
# 举个栗子
# 假设t1列表元素为:1,2,3
linsert before 1 0
# 执行后t1列表的元素为0,1,2,3

⚠️注意:若列表中存在多个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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 举个栗子
127.0.0.1:6379> sadd set1 a b c d e # 添加指定元素至集合set1,若集合不存在则创建。
5
127.0.0.1:6379> smembers set1 # 获取集合set1全部的成员
c
d
b
a
e
127.0.0.1:6379> scard set1
5 # set1的成员个数为5
127.0.0.1:6379> sismember set1 1
0 # 1不是set1的成员
127.0.0.1:6379> sismember set1 a
1 # a是set1的成员

srem

srem key value 删除集合key中指定成员

1
2
3
# 举个栗子
# 删除集合set1中的成员a
srem set1 a

srandmember

srandmember key [count] 默认随机获取集合中的一个成员,当count被指定时,则随机获取指定的成员数。

1
2
3
4
5
6
7
8
9
# 举个栗子
127.0.0.1:6379> srandmember set1 # 默认随机获取一个成员
e
127.0.0.1:6379> srandmember set1 2 # 随机获取2个成员
c
e
127.0.0.1:6379> srandmember set1 2 # 随机获取2个成员
c
b

spop

spop key [count] 从存储在key的集合中移除并返回一个或多个随机元素。

1
2
3
4
5
6
7
# 举个栗子
127.0.0.1:6379> spop set1 # 默认随机删除1个成员
c
127.0.0.1:6379> spop set1 3 # 随机删除3个成员
e
d
b

smove

smove source destination member 将member从source集合移动到destination集合中。

  • 如果该元素成功移除,返回1
  • 如果该元素不是source集合成员无任何操作,返回0
1
2
3
4
5
6
# 举个栗子
# 例如set1成员:a,b,c
# set2成员:1,2,3
smove set1 set2 c
# 执行后set1成员:a,b
# 执行后set2成员:1,c,3,2

如果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
2
3
4
5
# 举个栗子
zadd list 100 小明 88 小红 98 小军
zrange list 0 -1 # 由低到高显示member
zrange list 0 -1 withscores # 由低到高显示member,并显示分数

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 2
  • zcount key min max 获取指定分数范围的成员个数。

    1
    2
    # 举个栗子
    zcount list 90 100 # 获取分数在[90,100]范围内的成员的个数

zincrby

zincrby key increment member 增加/减少指定的成员的分数

1
2
3
# 举个栗子
zincrby list 1 小军 # 将成员小军的分数+1
zincrby list -1 小军 # 将成员小军的分数减1

⚠️ score值必须是字符串表示的整数值或双精度浮点数,并且能接受double精度的浮点数。也有可能给一个负数来减少score的值。

zcard

zcard key 获取指定key的有序集成员个数。

1
2
# 举个栗子
zcard list # 获取有序集合list中的成员个数

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 # 返回删除的成员个数

    ⚠️警告:

    1. 不要在成员分数不同的有序集合中使用zremrangebylex命令, 否则会导致删除的结果不正确。

    2. 可以使用 “-“ 和 “+” 表示得分最小值和最大值,使用该范围表示删除有序集合全部成员。

  • 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名,只剩最低分tom
  • zremrangebyscore 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
2
3
4
# 举个栗子
zadd set03 67 tom 78 jery 75 kate 90 david
zrank set03 tom # 获取tom的由小到大的排名:0
zrevrank set03 tom # 获取tom的由大到小的排名:3

持久化

RDB

Redis DataBase, 在指定的时间间隔内将内存中的数据集快照写入磁盘,恢复时是将快照文件读入内存

持久化文件

RDB 保存的持久化文件是dump.rdb

配置

save <seconds> <changes> 开启/关闭 RDB

例如:

  • sava 300 1 表示若300秒内有一个key发生改变则触发持久化一次。

  • save “” 表示禁用RDB

    ⚠️注意:在使用flushallshutdownsavebgsave等命令时会立即强制将当前内存中的数据集快照写入磁盘

    • 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文件中不符合其语法的语句删除掉。