redis 学习笔记

redis

redis 简介

redis 是一个开源的使用 ANSI C 语言编写、基于内存亦可持久化日志型Key-Value 数据库,并提供了对多种编程语言的支持。

支持存储的 value 类型包括 string(字符串)、list(链表)、set (集合)、zset(sorted set –有序集合)和 hash(哈希),所以 redis 也被称为数据结构服务器。这些数据类型都支持 push/pop 、 add/remove 及取交集并集和差集等操作,且 redis 支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中。 redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了主从(master-slave)同步。

redis 支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得 redis 可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。

redis的特点

  • redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • redis 是完全在内存中保存数据的数据库,使用磁盘只是为了持久化。
  • redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 string,list,set,zset,hash 等数据结构的存储。
  • redis 支持数据的备份,即 master-slave 模式的数据备份。

redis 优势

  • 性能极高 —— redis 是一个高性能的 key-value 数据库,读的速度能达到110000次/s,写的速度能达到81000次/s。
  • 丰富的数据类型 —— redis 支持 string , hash ,list ,set 及 zset (sorted set) 等数据类型。
  • 原子性 —— redis 的所有操作都是原子性的,要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过 MULTI 和 EXEC 指令包起来。
  • 丰富的特性 —— redis 支持 publish / subscribe , 通知, key 过期等特性。

redis 使用了两种文件格式

  • 全量数据格式:把内存中的数据写入磁盘,便于下次读取文件进行加载
  • 增量请求文件:把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括 SET、RPUSH、SADD、ZADD。

redis 的存储分为内存存储、磁盘存储和 log 文件三部分,配置文件中有三个参数对其进行配置。

  • save seconds updates:save配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。
  • appendonly yes/no:appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。
  • appendfsync no/always/everysec:appendfsync 配置,no 表示等操作系统进行数据缓存同步到磁盘,always 表示每次更新操作后手动调用 fsync() 将数据写到磁盘, everysec 表示每秒同步一次。

redis 运行在内存中但可持久化到磁盘,在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。内存数据库的一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,可以做很多内部复杂性很强的事情

redis 基础命令

服务器命令

  • 启动服务: redis-server --service-start
  • 关闭服务: redis-server --service-stop
  • 使用 redis.conf 开启服务: redis-server /path/to/redis.conf

客户端命令

连接服务器redis-cli -h 127.0.0.1 -p 6379 -a abcd

参数说明:

  • -h:即host,服务器的IP地址
  • -p:即port,服务器的端口
  • -a:即auth,redis服务器的密码

参数可缺省,缺省时默认 -h 为 127.0.0.1 ,-p 为 6379 。

密码操作:设置/修改密码: config set requirepass newPassword;查看密码: config get requirepass

也可以通过修改配置文件来实现:

requirepass

推荐使用修改配置文件的方式。

因为本次连接期间,命令行对配置参数的修改(包括密码),只在本次连接期间有效,并不会同步到 redis.conf 中。断开连接后,下次连接时,使用的仍是配置文件中的参数(包括密码),之前命令行修改的配置参数失效。

redis 命令的关键字不区分大小写

查看帮助

  • 查看服务器端帮助: redis-server --help
  • 查看客户端帮助: redis-cli --help
  • redis 命令行下查看某个命令的说明: help command

redis 配置

服务器参数说明

redis.conf 配置的是 redis 服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
bind 127.0.0.1      //设置redis服务器的ip地址

port 6379 //指定端口号

timeout 300 //当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能。默认为0,需要修改。

loglevel notice //指定日志记录级别,redis 总共支持四个级别:debug、verbose、notice、warning,默认为 notice

logfile stdout //日志记录方式,需要修改为标准输出。默认为空串""

databases 16 //设置数据库的数量

save 900 1 //指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合使用,默认是3个。900s=15minutes

save 300 10 //300s=5minutes

save 60 10000 //60s=1minute

rdbcompression yes //指定存储至本地数据库时是否压缩数据,默认为 yes,redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大

dbfilename dump.rdb //指定本地数据库文件名,默认值为 dump.rdb

dir ./ //指定本地数据库存放目录

requirepass foobared//设置 redis 连接密码,如果配置了连接密码,客户端在连接 redis 时需要提供密码,默认关闭

maxclients 128 //设置同一时间最大客户端连接数,默认是注释了的

maxmemory 536870912 //指定 redis 最大内存限制,512M。默认是注释了的,默认单位字节。

appendonly yes //指定是否在每次更新操作后进行日志记录,redis 在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis 本身同步数据文件是按上面 save 条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为 no

appendfilename "appendonly.aof" //指定日志文件名,默认为 appendonly.aof

//指定日志更新条件,有3个值:always、everysec、no,默认使用everysec(其余2条是注释了的)
# appendfsync always//表示每次更新操作后手动调用 fsync() 将数据写到磁盘(慢,安全)
appendfsync everysec//表示每秒同步一次(折中,默认值)
# appendfsync no //表示等操作系统进行数据缓存同步到磁盘(快)

activerehashing yes //指定是否激活重置哈希,默认为yes

redis 在启动时会把数据加载到内存中,达到最大内存后,redis 会先尝试清除已到期或即将到期的 Key,当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。redis 新的 vm 机制,会把 Key 存放内存,Value 会存放在 swap 区。

命令行操作配置参数

  • 设置配置参数: CONFIG SET key value
  • 查看配置参数: CONFIG GET key
1
CONFIG GET *           //查看所有的配置参数

redis Key 键的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
set key value       //设置、修改值

get key //如果key不存在,返回nil,表示空。

type key //返回key对应的value的数据类型

rename key newKey //重命名key,即修改键的名称。当key和newKey重名时,或者key不存在时,会提示错误。如果newKey已存在,会覆盖原来的值。

renamenx key newKey //多了nx。返回一个整数。如果newKey不存在,则执行重命名,返回1;如果newKey已存在,不执行重命名,返回0。就是说newKey不存在时才执行。

randomkey //从当前数据库中随机返回一个key

keys pattern //返回所有满足pattern的key

keys person* //示例:假设当前数据库中有3个key——person1,person2,person3,则该命令会返回所有以person开头的key,即person1、person2、person3

exists key //检测key是否存在,存在返回1,不存在返回0

dump key //序列化指定的key,返回序列化得到的二进制数据。

del key //删除指定的键值对。若key存在,则删除key,并返回1;若key不存在,直接返回0.

expire key seconds //设置key的过期时间,以秒为单位

expire age 60 //示例:60s后age过期,会自动删除age。

expireat key timestamp //设置key的过期时间。多了at。timestamp是时间戳,到了timestamp指定的时间,key过期,自动删除key。时间戳以秒为单位。

pexpire key milliseconds //设置key的过期时间,以毫秒为单位。多了前缀p

pexpireat key milliseconds-timestamp//设置key的过期时间,时间戳,以毫秒为单位。多了前缀p、后缀at。

move key db //将键值对移到指定的数据库,相当于剪切。返回db——当前使用的数据库的index。

select db //redis默认使用数据库0,也可以用显式指定当前使用的数据库。

//示例:
set age 10 //默认使用数据库0
move age 1 //将age键值对移到数据库1中。返回1——表示数据库1
exists age //此时使用的仍是数据库0,返回0——表示当前数据库中不存在age
select 1 //选择(切换)到数据库1
exists age //返回1——表示存在age

select

端口号后面的 [1] 表示当前使用的是数据库 1 。使用数据库 0 时默认缺省。

redis 中 key 、value 加不加引号均可,都默认作为 String 处理。

redis 数据类型简介

redis 支持五种数据类型: string(字符串),hash(哈希),list(列表),set(集合)及 zset ( sorted set 有序集合)。

redis string

string 是 redis 的基础数据类型。

示例: set name "zhangsan"

key 、 value 都是 string 类型, key 、 value 带不带引号都行,习惯上 key 不带引号, value 带引号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
getset key newValue     //给key设置value,并返回旧的value,如果没有旧的value,返回nil。

//示例:
set age 10
getset age 20 //age 的值被设置为20,并返回旧的值10

getrange key start end //获取value的部分

//示例:
set content "hello world!"
getrange content 0 4 //返回content对应value的[0,4]上的字符,"hello",下标
getrange content 0 -1 //支持负数索引,-1表示最后一个字符

mget key1 key2 ...... //mget即multiple get,同时获取多个key的value,若某个key不存在,该key返回nil

setex key timeout value //setex即set expire,给key设置timeout、value,若key已存在,会覆盖原来的timeout、value

//示例:
setex age 60 10 //设置age 60s后过期,value为10

setnx key value //在 key 不存在时,为 key 设置value,设置成功返回1;若key已存在,不执行(不会替换原来的value),返回0。

//示例:
set age 10 //若age已存在,会则覆盖value
setnx age 20 //age不存在时才设置,age已存在就不设置(不会覆盖原来的value)

mset key1 value1 key2 value2 ...... //mset即multiple set。同时设置多个键值对。因为是set,所以若某个key已存在,会覆盖。

//示例:
mset name "lisi" age 20

msetnx key1 value1 key2 value2 ...... //msetnx即multiple setnx,当key不存在时才设置该key,已存在就不设置该key

append key content //若key已存在,则在value末尾追加content;若key不存在,则为其设置值,此时相当于set key value。返回操作过后,value(新)的长度

//示例:
append str "hello" //之前str不存在,此句命令相当于set str "hello"
append str " world!" //之前str已存在,则在其末尾追加" world!",现在str的值变为"hello world!"

incr key //incr即increase,如果value是整数(可以是负整数),将value的值+1,并返回操作后的value。如果value不是整数,提示错误。如果key不存在,先将value初始化为0,再执行+1。

//示例:
set age 10 //等价于set age "10"
incr age //value的值+1,变为11,并返回11。value是整数才会+1。
get age //11
incr price //之前price不存在,value会先初始化为0,再+1,返回1
get price //1

incrby key amount //同上,只不过是+amout,不是+1。原来的value要是整数,amount也要是整数,否则提示错误。若key不存在,先初始化value为0。支持负整数(即减)。

//示例:
set age 20
incrby age 5 //+5
get age //25

incrbyfloat key amount //同上,只不过原来的value可以是浮点数,增量amount也可以是浮点数。当然,整数也行。支持负数(减)。

//示例:
set price 2.3
incrbyfloat price 1.5
get price //3.8

decr key //同incr key只不过decr是减。decr即decrease。

decrby key amount //同incrby key amount,只不过是减

redis hash

redis hash 是一个 string 类型的 field 和 value 的映射表,一个 hash 可储存多个键值对。

一个对象往往有多个属性(键值对形式), hash 特别适合存储对象。

redis 中一个 hash 可以存储 232 - 1个 键值对(40多亿)。

示例:

1
hmset zhangsan name "zhangsan" age 12 gender male score 90
  • hmset : hm 即 hash multiple ,set 这里表示设置,不是集合。
  • zhangsan : 即这张 hash 表的名称。 redis 是 key-value 数据库, zhangsan 就是 key ,后面的一堆属性看做一个整体(value)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
hset key fieldName fileValue    //hset即hash setset这里是设置的意思。往hash中添加一个字段(键值对)

//示例:
hset score zhangsan 90 //score是hash的名称,zhangsan 90是一个键值对。若zhangsan这个字段名之前不存在,则添加成功返回1。
hset score lisi 85 //一个hash可储存多个键值对(40多亿)。
hset score lisi 100 //之前这个hash中已存在lisi这个字段名,会覆盖原来的字段值,返回0.

hsetnx key fieldName fieldValue //多了后缀nx,同上,只是如果这个hash中已存在fieldName,则不执行操作(不覆盖原来的值),此时返回0。即当这个hash中fieldName不存在时才添加字段。

hmset key fileName1 fieldValue1 fieldName2 fieldValue2 ...... //同时添加多个字段。hmset即hash multiple set,因为是set所以字段已存在时会覆盖原有的值。

hget key fieldName //获取指定字段的值

hmget key fieldName1 fieldName2 ...... //同时获取一个或多个字段的值

hgetall key //获取所有字段的值,会同时显示fieldName、fieldValue。hgetall即hash get all。

hdel key fieldName1 fieldName2 ... //删除一个或多个字段

hexists key fieldName //检查该字段是否已存在,已存在则返回1,该fieldName不存在或key不存在,则返回0

hlen key //获取hash中的字段(键值对)数量

hkeys key //获取hash中所有的feildName

hvals key //获取hash中所有的fieldValue

hscan key cursor [match pattern] [count count] //迭代hash中的键值对

hincrby key fieldName acount //将指定字段的值增加acount。原来的字段值、acount都要是整数,否则提示错误。

//示例:
hincrby score lisi 5 //返回操作后的字段值,假如之前lisi的值是80,则返回85
hincrby score lisi -10 //acount支持负整数,即减。

hincrbyfloat key fieldName acount //同上,但是支持浮点数,就是说整数、浮点数都行。

说明

  • 没有 hincr 这个命令 (+1) ;
  • 没有提供 hdecr 命令 (减) ;
  • 都带有前缀 h :表示 hash 。

redis list

redis 列表是简单的字符串列表,列表是有序的,按照插入顺序排序。可以添加一个元素(字符串)到列表的头部(左边)或者尾部(右边)。列表中的元素可以重复

一个列表最多可以包含 232 - 1 个元素 (40多亿)。

示例:

1
lpush students "zhangsan" "lisi" "wangwu"
  • lpush : list push ,往 list 中添加元素。
  • students : 即这个列表的名称(key)。列表中的元素看做一个整体(value)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
lpush key value1 value2 ......  //往列表的头部(左边)推入一个或多个元素,lpush的l表示left。key是列表名称,把列表中的所有元素作为一个整体(value)。若key不存在,会自动创建。

//示例:
lpush students "zhangsan" "lisi" "wangwu" //返回操作后列表中的总元素个数
//先在列表头部添加“zhangsan”,再在列表头部添加“lisi”,接着在列表头部添加“wangwu”,最后列表的前三个元素依次是"wangwu"、“lisi”、“zhangsan”。

lpushx key value1 value2 ...... //同上,只是key不存在时,不执行操作(不会自动创建)。要key已存在且key时list类型时才会添加元素。

lpop key //弹出列表的第一个元素,会从列表中移除并返回该元素。

//l表示left,列表的头部。

rpush key value1 value2 ...... //在列表尾部推入1个或多个元素。

rpushx key value1 value2 ...... //尾部,key已存在时才会推入。

rpop //弹出列表的最后一个元素

//r表示right,列表的尾部。
//上面的l、r命令是一一对应的。

rpoplpush sourceKey destKey //弹出sourceKey的最后一个元素,并在destKey的头部推入元素,即剪切。返回该元素。rpoplpush即对sourceKey执行rpop,对destKey执行lpush。

blpop key1 key2 ... timeout //弹出一个或多个的列表的第一个元素,如果列表为空会阻塞列表直到等待超时或发现可弹出元素为止。blpop即bind lpop。

//示例:
blpop students 60 //60s

brpop key1 key2 ...... timeout

brpoplpush sourceKey destKey timeout

llen key //返回列表中的元素个数

lset key index value //给指定索引处的元素设置值(即修改元素值)

lindex key index //根据index索引元素,返回指定位置上的元素

lrange key start end //返回[start,end]区间上的所有元素。start、end是索引,比如0 -1 就是返回所有元素。

ltrim key start end //修剪列表,只保留[start,end]区间上的元素,其余元素会被删除。

linsert key before/after value1 value2 //在元素value1之前/之后插入元素value2。value2是要插入的元素。

//示例:
linsert student before "lisi" "zhangsan"//在lisi的前面插入zhangsan
//插入成功,返回操作后列表的总长度;若value1不存在,返回-1;若key不存在或key是一个空的list,则返回0.

lrem key count value //移除列表中值为value的所有元素。lrem即list remove。count是一个整数,表示要删除的个数、搜索方向。
//count>0:从表头向表尾搜索,移除count个值为value的元素
//count<0:从表尾向表头搜索,移除count的绝对值个值为value的元素
//count=0:移除表中所有的值为value的元素。要遍历列表,从哪边开始结果、速度都是一样的。

//示例:
lrem scores 0 90 //移除列表中所有的90

以上几个命令中,l 表示 list 。 index 从 0 开始,支持负数索引,index 要是已存在的。

redis 的区间,都是闭区间,[ start ,end ] ,两边都包含。

redis set

redis set 是 string 类型的无序集合。集合成员是唯一的(不允许重复)。

redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

集合的最大成员数为 232 - 1 (40多亿)。

示例:

1
sadd mySet "zhangsan" "lisi" "wangwu"
  • sadd : set add ,往集合中添加元素。
  • mySet : 即集合名称(key)。把集合中的所有元素作为一个整体(value)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
sadd key value1 value2 ...  //向集合中添加一个或多个元素。sadd即set add,key是集合的名称。返回此次添加的元素个数。

scard key //返回集合的元素个数

smembers key //返回集合中所有的元素

sismember key elementValue //判断该集合中是否有elementValue这个元素。有返回1,没有或者key不存在则返回0.

spop key //随机移除并返回集合中的一个元素

srandmember key //随机返回集合中的一个元素,并不移除该元素。srandmember即set random member.
//可带一个可选参数:
srandmember key count //count是一个整数,指定返回的元素个数。
//count>0:随机返回count个元素,这些元素互不相同。随机确定一个返回的元素后,再从剩余的元素中随机。
//count<0:随机返回count的绝对值个元素,这些元素可能相同。每次都是从整个集合中随机一个。
//count的绝对值大于等于集合的元素个数时,返回集合中所有的元素。

srem key value1 value2 ... //移除集合中的一个或多个元素,若集合中没有该元素,会忽略该元素。

smove sourceKey destKey elementValue //将元素从一个集合移动到另一个集合。(剪切)

sscan key cursor match pattern count num //迭代集合中的元素。cursor指定对每元素的操作。
//2个可选参数:
//match pattern 指定配置模式,只迭代符合pattern的元素
//count num 指定要迭代的元素个数

sinter key1 key2 ... //返回这些集合的交集

sinterstore destKey key1 key2 ... //多了store,求key1、key2.....这些集合的交集,并将交集中的元素存储在destKey集合中,返回交集中的元素个数
//相同用法的还有:
//sunion 并集
//sdiff 差集

redis sorted set

redis 有序集合和集合一样也是 string 类型元素的集合,且不允许出现重复的成员。

但 sorted set 的每个元素都会关联一个 int 型或 double 型的数值型分数。 redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员不允许重复,但分数(score)可以重复。

有序集合是通过哈希表实现的,添加,删除,查找的复杂度都是O(1)。

集合的最大成员数为 232 - 1 (40多亿)。

示例:

1
zadd sortedSet 2 "zhangsan" 2.9 "lisi" 1.3 "wangwu"
  • zadd : z 代表有序集合。
  • sortedSet : 即有序集合的名称(key)。把有序集合中的所有元素(包括分数)看做一个整体(value)。
  • 2 "zhangsan" : 2 就是 “zhangsan” 的 score ,顺序就是根据 score 进行升序排列的。 score 可以是 int 、 double 型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
zadd key score1 value1 score2 value2 ...    //往有序集合中添加一个或多个元素。score是数值型,支持整数、浮点数,支持负数。z代表sorted set

//示例:
zadd students 1 zhangsan 2 lisi 3 wangwu //返回此次添加的元素个数。score只是附加信息,真正的元素还是value1,value2,......
//说明:hash、list、set、sorted set,在Reids2.4之前的版本中,1次只支持添加一个元素,不支持1次添加多个元素。

zcard key //返回元素个数

zcount key minScore maxScore //返回分数值在[minScore,maxScore]上的元素个数

zlexcount key minValue maxValue //返回元素值在[minValue,maxValue]上的元素个数。
//不能直接用元素值,有3种写法:
//[value 表示包含此元素
//(value 表示不包含此元素
//- 表示第一个元素(包含),+ 表示最后一个元素(包含)
//示例:
zadd set1 1 a 2 b 3 c 4 d
zlexcount set1 - + //返回总元素个数,4
zlexcount set1 [a [b //2 。即[a,b]上元素个数
zlexcount set1 (a [b //1。(a,b]
//不能缺省 [ 或 (

zrange key minIndex maxIndex [withscores] //返回索引在[minIndex,maxIndex]上的所有元素。
//索引从0开始,支持负数,-1表示倒数第一个元素,-2表示倒数第二个元素。
//withscores是可选参数,带上则还会显示分数,不带则只显示元素值。

zrangebyscore key minScore maxScore [withscores] //返回score在[minScore,maxScore]上的所有元素值。
//默认使用 [ ,闭区间。也可以显示指定为 [ 或 ( 。
//withscores可选,带上时会显示元素的score,不带上时不显示score。
//示例:
zrangebyscore set1 [1 (2 //获取score在[1,2)上的所有元素

zrank key elementValue //返回该元素值的索引。默认按score进行升序排列。索引从0开始。

//以上3个命令都是按score升序排列的。下面的3个命令:
zrevrange
zrevrangebyscore
zrevrank
//前缀加不是z,而是zrev。和之前的3个命令一一对应,用法完全相同,只不过是按score降序排列计算的。

zscore key elementValue //返回该元素值对应的score值

zincrby key increment elementValue //increment是增量,将指定元素的score增加increment。increment支持负数,即减。

zrem key value1 value2 ... //移除一个或多个元素

zremrangebyrank key startIndex endIndex //移除下标在[startIndex,endIndex]上的所有元素。zremrangebyrank即z remove range by rank

zremrangebyscore key minScore maxScore //移除score在[minScore,maxScore]上的所有元素

zremrangebylex key value1 value2 //移除这2个元素值之间的所有元素。
//不能直接写元素值,可以用 - + 表示,或者在元素值前面加[ (

zscan key cursor [match pattern] [count num]//迭代

sorted set 也提供了计算交集、并集的命令,此处不再一一介绍。

redis 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
auth password       //验证密码

echo message //打印文本

ping //测试连接,ping一下redis服务器,如果连接正常(已连接到redis服务器)返回PONG。

select dbIndex //选择当前使用的数据库,默认使用数据库0,下标,从0开始。

quit //关闭当前连接,并退到上一级命令行

time //获取服务器上的当前时间。
//有2个返回值,第一个是当前时间的时间戳(s),第二个是当前这一秒已经逝去的微秒数。
//1秒=10^3毫秒=10^6微秒。
//两者组合可显示微秒级的时间。

config set param value //设置配置参数

config get param //获取配置参数的值

config rewrite //将本次连接中,这条命令之前,对配置的设置都同步到redis.conf文件中。
//默认对配置的设置、修改只在本次连接期间有效,并不会同步修改redis.conf文件。断开本次连接,会清除本次连接的配置设置,下次连接时,使用的是redis.conf文件中配置。
//比如:
//配置文件中的密码是abc,连接到redis服务器后
config set requirepass 123 //修改密码为123
//这次连接中,密码不再是abc,而是123。但这个修改并不会同步到redis.conf文件中,redis.conf文件中的密码仍是abc。下次连接时,使用密码123会提示密码错误,需要使用abc。
//有2种方式同步到redis.conf文件中:
//1. 直接在redis.conf文件中修改
//2. 连接到redis服务器后,在命令行修改,然后使用 config rewrite 命令同步到redis.conf中。

dbsize //返回当前数据库中,key的数量

flushdb //清除当前数据库中所有的key,即清空当前数据库。flushdb即flush db。

flushall //清除所有数据库中的key,即清空所有数据库。flushall即flush all。

save //将redis数据库中的所有数据同步到.rdb文件中。redis数据库中的数据是常驻内存的,save命令将内存中的redis数据库数据同步写到数据库文件.rdb中。

bgsave //同上,只不过bgsave是在后台异步保存。

/*

.rdb 文件是 redis 的数据库文件,rdb即 redis db。启动 redis 服务的时候,会从 .rdb 文件加载所有的数据库数据到内存。就是说数据库数据有 2 份,一份常驻内存,一份是持久化的磁盘文件。

.rdb 文件也被称为 redis 数据库的备份文件。可以将一个 .rdb 文件放在redis安装目录下,作为这个 redis 服务器的数据库数据。

*/

client list //列出所有的连接

client kill ip:port //关闭某个连接。
//6379只是redis服务器、客户端程序通信使用的端口号。建立一个redis数据库连接,会单独使用一个端口号,一个redis客户端可以建立多个数据库连接,一个连接对应一个端口号,并不是使用6379。

shutdown [save/nosave] //关闭redis服务器。会自动关闭与所有的redis客户端连接、以及与这些客户端建立的数据库连接,并同步数据集到rdb文件中。
//shutdown命令可带一个可选参数:是否将数据集同步到rdb文件中。save——同步,nosave——不同步。

client kill ip:port //是关闭某个数据库连接,quit是关闭redis客户端(会自动关闭这个客户端建立的所有数据库连接),shutdown save是关闭redis服务器(会自动关闭这个redis服务器的所有数据库连接)。

slaveof ip port //原本默认本身是主服务器,此句命令会将当前redis服务器作为某个服务器的从服务器。
//示例:
slaveof 127.23.23.35 6379 //把当前服务器作为127.23.23.35这台服务器的从服务器。
//变成从服务器后,会丢弃原来数据库的数据集,从主服务器复制、同步数据到从服务器。
//slave,意为奴隶、从属。

sync //从主服务器复制、同步数据集

slave no one
//这句命令是关闭这个从服务器的从主服务器复制数据的功能,使这个从服务器变成一个主服务器。使用的仍是作为从服务器时的数据集。
//当主服务器出问题、或者需要做其他用途的时候,可以把一台从服务器作为主服务器,再把其它的从服务器作为这个主服务器的从属,这样就不会影响服务器的运转。

redis 事务

redis 事务可以一次执行多个命令。

常用命令:

1
2
3
4
5
multi       //开起一个事务,标记一个事务块的开始,multi即multiple

exec //执行事务块内的命令

discard //取消事务

使用步骤:

  1. 先使用 multi 命令标记事务开始
  2. 将多个命令入队( queue ,队列)
  3. 使用 exec 命令执行事务

示例:

1
2
3
4
5
6
multi                   //标记事务开始
set name "zhangsan" //依次输入多个命令。输入一条命令后会提示“QUEUED”,表示此条命令已入队
set age 20
get name
exec //执行事务,会依次执行事务块内的命令,依次显示执行结果。
//exec是执行事务,如果想取消事务,将exec换为discard即可。

单个 redis 命令的执行是原子性的,但 redis 并没有在事务上增加任何维持原子性的机制,所以 redis 事务的执行不是原子性的。

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

比如执行事务时,第一条执行成功,第二条执行失败,此时并不会回滚之前的操作(此处指第一条、第二条命令),而是继续执行后面的命令。但会显示第二条的结果是Fail。

即事务中任意命令执行失败,其余的命令依然被执行。

在事务执行过程中,其他客户端提交的命令请求不会插入到事务执行命令队列中。

redis2.6 以后的版本,在服务器内置了 Lua 环境(Lua解释器),可以通过eval命令执行Lua脚本。

redis 发布订阅

redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
pub 即 publish ,推送。
sub 即 subscribe ,订阅。

订阅者订阅某个 channel(频道),发布者将消息发布到 redis 服务器, redis 服务器将消息推送给这个频道的订阅者。
channel 管道、通道、频道。

订阅发布

redis 的 channel 是公共频道,谁都可以发布消息。

就像微信群、QQ群,谁都可以发送消息,群成员(订阅者)都会收到消息。

redis 的消息是在线即时消息,类似于广播,只有在线的订阅者(连接到 redis 服务器的订阅者),才会收到消息。

若当时不在线,并不会收到消息。后面登陆了(连接到服务器),服务器也不会推送之前(这个客户端未收到)的消息。服务器只推送一遍

使用示例

启动一个客户端,连接到服务器

1
redis-cli -a password

订阅频道

1
subscribe channel1 channel2 ... //可订阅一个或多个频道

会显示订阅的频道的信息,一个频道显示 3 个条目:

1
2
3
"subscribe"                 //固定的值,表示这是一个订阅频道
订阅的频道名
一个int型的数,表示这个频道是当前客户端订阅的第几个频道

订阅之后,当前命令提示符会阻塞,只能接收 redis 服务器推送的消息,不能再执行命令。所以我们再启动一个客户端推送消息。

在另一个 redis 客户端推送消息

1
publish channel message         //channel指定要推送消息到哪个频道,message是要推送的消息

返回当前接收到消息的订阅者的数量。1表示只有一个订阅者收到了这条消息。

我们看到另一个客户端已接收到消息。一条消息显示3个项:

1
2
3
"message"                   //固定值,表示这是一条消息
这条消息来自哪个订阅频道
消息内容

redis 的订阅是临时订阅,只在本次连接期间有效。断开连接后,会清除这个客户端的订阅信息,即取消所有订阅的频道。

谁都可以是发布者,谁都可以发送消息。可以向任何频道发送消息。

相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
subscribe channel1 channel2 ...     //订阅一个或多个频道

unsubscribe channel1 channel2 ... //退订一个或多个频道。多了un

psubscribe pattern1 pattern2 ... //多了一个p,即pattern,订阅该模式匹配的所有频道,可以有多个匹配模式。

//示例:
psubscribe tv //订阅频道tv
psubscribe *home //订阅所有以home结尾的频道
psubscribe china* //订阅所有以china开头的频道

punsubscribe pattern1 pattern2 ... //退订符合匹配的所有频道,可指定多个匹配模式,满足pattern1或者满足pattern2.....,,注意是或。

publish channel message //推送消息到某个频道