跳转至

Redis

  • 本教程使用的redis版本是7.0.2
- redis中key是大小写敏感的

1 Redis服务启停、客户端连接

1.1 Redis服务启动

  1. 启动服务时,使用配置文件:redis-server redis.conf
  2. 示例
[root@redis redis-7.0.2]# redis-server redis.conf 

1.2 Redis客户端连接

  • redis-cli [option]
  • 示例:使用密码连接
[root@redis redis-7.0.2]# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> 

2 常用命令

2.1 set

  • 语法:set key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL]
  • 功能:新建或更新键值
  • 示例:
127.0.0.1:6379> set a v1
OK

2.2 get

  • 语法:get key
  • 功能:获取指定键的值
  • 示例:
127.0.0.1:6379> get a
"v2"

2.3 keys

  • 语法:keys pattern
  • 功能:显示匹配的key
  • 示例
127.0.0.1:6379> keys *
1) "a"

2.4 exists

  • 语法:exists key [key ...]
  • 功能:判断key是否存在
  • 示例
127.0.0.1:6379> keys *
1) "a"
2) 127.0.0.1:6379> exists a
(integer) 1
127.0.0.1:6379> exists b
(integer) 0

2.5 del

  • 语法:del key [key ...]
  • 功能:删除key
  • 示例
127.0.0.1:6379> keys *
1) "a"
2) "b"
127.0.0.1:6379> del a b
(integer) 2
127.0.0.1:6379> keys *
(empty array)

3 数据类型

3.1 String

3.1.1 incr、decr

如果key不存在,则先创建key,并初始化值0;值可以是负数
  • 功能:递增、递减(原子操作)
127.0.0.1:6379> incr a
(integer) 1
127.0.0.1:6379> decr a
(integer) 0
127.0.0.1:6379> decr a
(integer) -1

3.1.2 strlen

  • 功能:计算String长度
  • 语法:strlen key
  • 示例
127.0.0.1:6379> get a
"123456"
127.0.0.1:6379> strlen a
(integer) 6

3.1.3 append

  • 功能:追加String
  • 语法:append key value
  • 示例
127.0.0.1:6379> append a 123
(integer) 3
127.0.0.1:6379> get a
"123"
127.0.0.1:6379> append a 456
(integer) 6
127.0.0.1:6379> get a
"123456"

3.2 Hash

  • 特点:一个hash key可以有多个字段,每一个字段都有一个值
Hash命令都是以h前缀开头

3.2.1 hset、hmset

  • 功能:给hash字段赋值
  • 语法:
    • hset key field value [field value ...]
    • hmset key field value [field value ...]
  • 示例
127.0.0.1:6379> hset h1 id 001 age 15
(integer) 2
127.0.0.1:6379> hmset h2 id 002 age 14
OK

3.2.2 hget

  • 功能:获取hash字段值
  • 语法:hget key field
  • 示例
127.0.0.1:6379> hget h1 id
"001"
127.0.0.1:6379> hget h1 age
"15"
````

#### 3.2.3 hvals
- 功能:获取hash所有字段值
- 语法:`hvals key`
- 示例

```shell
127.0.0.1:6379> hvals h1
1) "001"
2) "14"
````

#### 3.2.4 hkeys
- 功能:获取指定hash字段名
- 语法:`hkeys key`
- 示例

```shell
127.0.0.1:6379> hkeys h1
1) "id"
2) "age"
127.0.0.1:6379> hkeys h2
1) "id"
2) "age"

3.2.5 hlen

  • 功能:获取hash字段数量
  • 语法:hlen key
  • 示例
127.0.0.1:6379> hkeys h1
1) "id"
2) "age"
127.0.0.1:6379> hlen h1
(integer) 2

3.2.6 hdel

  • 功能:删除hash字段
  • 语法:hdel key field [field ...]
  • 示例
127.0.0.1:6379> hkeys h1
1) "id"
2) "age"
127.0.0.1:6379> hdel h1 id age
(integer) 2
127.0.0.1:6379> hkeys h1
(empty array)

3.2.7 exists

  • 功能:判断hash字段是否存在
  • 语法:hexists key field
  • 示例
127.0.0.1:6379> hset h1 id 001 age 15
(integer) 2
127.0.0.1:6379> hexists h1 id
(integer) 1
127.0.0.1:6379> hexists h1 name
(integer) 0

3.2.8 hincrby

  • 功能:给hash字段(整形)增加指定增量(可以负数)
  • 语法:hincrby key field increment
  • 示例
127.0.0.1:6379> hincrby h1 age 1
(integer) 16
127.0.0.1:6379> hincrby h1 age -2
(integer) 14
127.0.0.1:6379> hget h1 age
"14"

3.2.9 hincrbyfloat

  • 功能:给hash字段(浮点型)增加指定增量
  • 语法:hincrbyfloat key field increment
  • 示例
127.0.0.1:6379> hset h1 weight 59.5
(integer) 1
127.0.0.1:6379> hincrbyfloat h1 weight 1.4
"60.9"
127.0.0.1:6379> hget h1 weight
"60.9"

3.3 List

List 是一个双向链表。

3.3.1 LPUSH、RPUSH

  • 功能:
    • LPUSH:向list头部压入数据
    • RPUSH:向list尾部压入数据
  • 语法:
    • LPUSH key element [element ...]
    • RPUSH key element [element ...]
  • 示例
127.0.0.1:6379> LPUSH L1 a b c 
(integer) 3
127.0.0.1:6379> RPUSH L2 a b c
(integer) 3
127.0.0.1:6379> LRANGE L1 0 2
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> LRANGE L2 0 2
1) "a"
2) "b"
3) "c"

3.3.2 LPOP、RPOP

  • 功能:
    • LPUSH:从list头部移除数据
    • RPUSH:从list尾部移除数据
  • 语法:
    • LPOP key [count]
    • RPOP key [count]
  • 示例
127.0.0.1:6379> LRANGE L2 0 2
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> LPOP L1 1
1) "c"
127.0.0.1:6379> RPOP L1 1
1) "a"
127.0.0.1:6379> LRANGE L1 0 2
1) "b"

3.3.3 LSET

  • 功能:修改索引位置的数据
  • 语法:LSET key index element
  • 示例:
127.0.0.1:6379> LSET L1 0 a1
OK
127.0.0.1:6379> LRANGE L1 0 2
1) "a1"
2) "b"
3) "a"

3.3.4 LINDEX

  • 功能:获取指定索引数据
  • 语法:LINDEX key index
  • 示例:
127.0.0.1:6379> LRANGE L1 0 2
1) "a1"
2) "b"
3) "a"
127.0.0.1:6379> LINDEX L1 0
"a1"

3.3.5 LLEN

  • 功能:计算list长度
  • 语法:LLEN key
  • 示例:
127.0.0.1:6379> LLEN L1
(integer) 3

3.3.6 LRANGE

  • 功能:返回list区间范围数据
  • 语法:LRANGE key start stop
  • 示例:
127.0.0.1:6379> LRANGE L1 0 2
1) "a1"
2) "b"
3) "a"

3.3.7 LINSERT

  • 功能:在list某个值前或后添加数据
  • 语法:LINSERT key BEFORE|AFTER pivot element
  • 示例:
127.0.0.1:6379> LINSERT L1 AFTER a  a2
(integer) 4
127.0.0.1:6379> LRANGE L1 0 3
1) "a1"
2) "b"
3) "a"
4) "a2"

3.4 Set

Set 是一个无序集合,内部数据唯一,是由hashtable实现

3.4.1 SADD

  • 功能:向Set添加元素
  • 语法:SADD key member [member ...]
  • 示例:
127.0.0.1:6379> SADD s1 1 2
(integer) 2
127.0.0.1:6379> SMEMBERS s1
1) "1"
2) "2"

3.4.2 SCARD

  • 功能:返回Set元素数量
  • 语法:SCARD key
  • 示例:
127.0.0.1:6379> SMEMBERS s1
1) "c"
2) "b"
127.0.0.1:6379> SCARD s1
(integer) 2

3.4.3 SMEMBERS

  • 功能:查看Set元素成员
  • 语法:SMEMBERS key
  • 示例:
127.0.0.1:6379> SMEMBERS s1
1) "1"
2) "2"

3.4.4 SISMEMBER

  • 功能:查看Set元素成员是否存在
  • 语法:SISMEMBER key member
  • 返回值:
    • 1:存在
    • 0:不存在
  • 示例:
127.0.0.1:6379> SMEMBERS s1
1) "1"
2) "2"
127.0.0.1:6379> SISMEMBER s1 1
(integer) 1

3.4.5 SRANDMEMBER

  • 功能:随机返回Set集合元素
  • 语法:SRANDMEMBER key [count]
    • 1)当count > 0count <= 集合大小:返回元素不重复
    • 2)当count > 0count > 集合大小:返回元素重复
    • 3)当count < 0|count| <= 集合大小:返回元素不重复(同1)
    • 4)当count < 0|count| > 集合大小:返回元素重复(同2)
  • 返回值:返回移除元素的个数
  • 示例:
127.0.0.1:6379> SMEMBERS s1
1) "1"
2) "b"
3) "a"
4) "c"
127.0.0.1:6379> SRANDMEMBER s1 3
1) "a"
2) "1"
3) "b"
127.0.0.1:6379> SRANDMEMBER s1 -3
1) "1"
2) "b"
3) "c"
127.0.0.1:6379> SRANDMEMBER s1 -5
1) "1"
2) "1"
3) "b"
4) "1"
5) "b"
127.0.0.1:6379> SRANDMEMBER s1 -5
1) "1"
2) "a"
3) "1"
4) "b"
5) "1"

3.4.6 SREM

  • 功能:移除Set中的元素
  • 语法:SREM key member [member ...]
  • 返回值:返回移除元素的个数
  • 示例:
127.0.0.1:6379> SMEMBERS s1
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
127.0.0.1:6379> SREM s1 2
(integer) 1
127.0.0.1:6379> SMEMBERS s1
1) "1"
2) "b"
3) "a"
4) "c"

3.4.7 SPOP

  • 功能:随机移除Set中元素
  • 语法:SPOP key [count]
  • 示例:
127.0.0.1:6379> SMEMBERS s1
1) "a"
2) "c"
3) "1"
4) "b"
127.0.0.1:6379> SPOP s1 1
1) "1"
127.0.0.1:6379> SMEMBERS s1
1) "a"
2) "c"
3) "b"

3.4.8 SMOVE

  • 功能:从一个Set中移动元素到另一个Set中
  • 语法:SMOVE source destination member
  • 返回值:
  • 示例:
127.0.0.1:6379> SMEMBERS s2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> SMOVE s1 s2 a 
(integer) 1
127.0.0.1:6379> SMEMBERS s2
1) "5"
2) "3"
3) "a"
4) "6"
5) "2"
6) "1"
7) "4"

3.4.9 SDIFF

  • 功能:返回一个Set与另一个Set的差集的元素
  • 语法:DIFF key [key ...]
  • 示例:
127.0.0.1:6379> SADD s1 a b c 1 2 3 4 5
(integer) 8
127.0.0.1:6379> SADD s2 b c d 4 5 6 7 8
(integer) 8
127.0.0.1:6379> SDIFF s1 s2
1) "3"
2) "a"
3) "1"
4) "2"
127.0.0.1:6379> SDIFF s2 s1
1) "8"
2) "d"
3) "6"
4) "7"

3.4.10 SDIFFSTORE

  • 功能:将一个Set与另一个Set的差集的元素存在另一个Set中
  • 语法:SDIFFSTORE destination key [key ...]
  • 示例:
127.0.0.1:6379> SDIFFSTORE s3 s1 s2
(integer) 4
127.0.0.1:6379> SMEMBERS s3
1) "3"
2) "a"
3) "1"
4) "2"

3.4.11 SINTER

  • 功能:返回一个Set与另一个Set的交集的元素
  • 语法:SINTER key [key ...]
  • 示例:
127.0.0.1:6379> SADD s1 a b c 1 2 3 4 5
(integer) 8
127.0.0.1:6379> SADD s2 b c d 4 5 6 7 8
(integer) 8
127.0.0.1:6379> SINTER s1 s2
1) "5"
2) "c"
3) "b"
4) "4"

3.4.12 SINTERSTORE

  • 功能:将一个Set与另一个Set的交集的元素存在另一个Set中
  • 语法:SINTERSTORE destination key [key ...]
  • 示例:
127.0.0.1:6379> SINTERSTORE s4 s1 s2
(integer) 4
127.0.0.1:6379> SMEMBERS s4
1) "5"
2) "c"
3) "4"
4) "b"

3.4.13 SUNION

  • 功能:返回一个Set与另一个Set的并集的元素
  • 语法:SUNION key [key ...]
  • 示例:
127.0.0.1:6379> SADD s1 a b c 1 2 3 4 5
(integer) 8
127.0.0.1:6379> SADD s2 b c d 4 5 6 7 8
(integer) 8
127.0.0.1:6379> SUNION s1 s2
 1) "5"
 2) "d"
 3) "6"
 4) "7"
 5) "2"
 6) "8"
 7) "1"
 8) "4"
 9) "3"
10) "a"
11) "c"
12) "b"

3.4.14 SUNIONSTORE

  • 功能:将一个Set与另一个Set的并集的元素存在另一个Set中
  • 语法:SUNIONSTORE destination key [key ...]
  • 示例:
127.0.0.1:6379> SUNIONSTORE s5 s1 s2
(integer) 12
127.0.0.1:6379> SMEMBERS s5
 1) "5"
 2) "d"
 3) "6"
 4) "7"
 5) "2"
 6) "8"
 7) "1"
 8) "4"
 9) "3"
10) "a"
11) "c"
12) "b"

3.5 ZSet

title: ZSet 特点
- ZSet 是有序集合,且元素不重复(Set是无序集合)。
- 每一个元素关联一个64位浮点型分数,并通过分数来排序,分数可以重复

3.5.1 ZADD

  • 功能:向ZSet集合添加元素
  • 语法:ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
    • XX: 仅仅更新存在的成员,不添加新成员。
    • NX: 不更新存在的成员。只添加新成员。
    • LT: 只有当新分数小于当前分数时才更新现有元素。此标志并不阻止添加新元素。
    • GT: 只有当新分数大于当前分数时才更新现有元素。此标志并不阻止添加新元素。
    • CH: 修改返回值为发生变化的成员总数,原始是返回新添加成员的总数 (CH 是 changed 的意思)。更改的元素是新添加的成员,已经存在的成员更新分数。 所以在命令中指定的成员有相同的分数将不被计算在内。注:在通常情况下,ZADD返回值只计算新添加成员的数量。
    • INCR: 当ZADD指定这个选项时,成员的操作就等同ZINCRBY命令,对成员的分数进行递增操作。
  • 示例
127.0.0.1:6379> ZADD z1 78.32 a 56.35 b 88.01 c
(integer) 3
127.0.0.1:6379> ZRANGE z1 0 2
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> ZMSCORE z1 a b c
1) "78.319999999999993"
2) "56.350000000000001"
3) "88.010000000000005"

3.5.2 ZRANGE

  • 功能:返回ZSet区间范围元素
  • 语法:ZRANGE key min max [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
  • 示例:
127.0.0.1:6379> ZADD z1 78.32 a 56.35 b 88.01 c
(integer) 3
127.0.0.1:6379> ZRANGE z1 0 2
1) "b"
2) "a"
3) "c"

3.5.3 ZMSCORE

  • 功能:返回ZSet元素的score分数
  • 语法:ZMSCORE key member [member ...]
  • 示例:
127.0.0.1:6379> ZADD z1 78.32 a 56.35 b 88.01 c
(integer) 3
127.0.0.1:6379> ZMSCORE z1 a b c
1) "78.319999999999993"
2) "56.350000000000001"
3) "88.010000000000005"

4 多数据库

1. Redis下数据库是由一个整数索引标识,可以通过redis.conf配置文件中`databases = num`来设置数据库总数
2. 客户端默认连接数据库0
3. 通过`select index`来切换数据库

4.1 select

  • 功能:切换数据库
  • 语法:select index
  • 示例:
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> keys *
1) "id1"
2) "h2"
3) "h1"
4) "L2"
5) "L1"
6) "z1"
7) "student1"
8) "a"
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> keys *
(empty array)

4.2 4.2.flushdb

  • 功能:清空当前数据库数据
  • 语法:flushdb [ASYNC|SYNC]
  • 示例:
127.0.0.1:6379[4]> keys *
1) "id1"
127.0.0.1:6379[4]> flushdb
OK
127.0.0.1:6379[4]> keys *
(empty array)

4.3 flushall

  • 功能:清空所有数据库数据
  • 语法:flushall [ASYNC|SYNC]
  • 示例:
127.0.0.1:6379[3]> keys *
1) "id2"
127.0.0.1:6379[3]> select 0
OK
127.0.0.1:6379> keys *
1) "h2"
2) "h1"
3) "L2"
4) "L1"
5) "z1"
6) "student1"
7) "a"
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> keys *
(empty array)

4.4 move

  • 功能:将一个数据库中key移动到另一个数据库
  • 语法:move key db
  • 示例:
127.0.0.1:6379[3]> keys *
1) "id1"
2) "id2"
127.0.0.1:6379[3]> move id1 4
(integer) 1
127.0.0.1:6379[3]> keys *
1) "id2"
127.0.0.1:6379[3]> select 4
OK
127.0.0.

5 事务

title: Redis事务特点
1. 批量操作在发送EXEC命令前被放入队列缓存。
2. 收到EXEC命令后进入事务执行,事务中任意命令执行失败,其余命令依然被执行。
3. 在事务执行过程中,其他客户端提交的命令请求不会插入到事务执行命令列中。
title: Redis事务过程
1. 以`multi`标记事务开始
2. 以`exec`标记执行事务中已提交的命令
3. `discard`不执行事务中命令,结束事务
  • 示例
127.0.0.1:6379[3]> set user:id1 10000
OK
127.0.0.1:6379[3]> get user:id1
"10000"
127.0.0.1:6379[3]> multi
OK
127.0.0.1:6379[3](TX)> incr user:id1
QUEUED
127.0.0.1:6379[3](TX)> incr user:id1
QUEUED
127.0.0.1:6379[3](TX)> get user:id1
QUEUED
127.0.0.1:6379[3](TX)> exec
1) (integer) 10001
2) (integer) 10002
3) "10002"
127.0.0.1:6379[3]> multi
OK
127.0.0.1:6379[3](TX)> incr user:id1
QUEUED
127.0.0.1:6379[3](TX)> incr user:id1
QUEUED
127.0.0.1:6379[3](TX)> discard
OK

5.1 watch

watch 在执行`multi`命令前执行
  • 功能:监听事务中的key,当监听的key在exec事务时被其它客户端修改,则执行exec事务时会失败
  • 语法:watch key [key ...]
  • 示例:在监听key后,开启事务,此时另一个客户端修改了key的值,最好执行exec,返回nil错误
127.0.0.1:6379[3]> watch user:id1
OK
127.0.0.1:6379[3]> multi
OK
127.0.0.1:6379[3](TX)> incrby user:id1 100
QUEUED
127.0.0.1:6379[3](TX)> exec
(nil)

6. 文档