0%

Redis 使用之操作篇

概述

redis的几种数据类型:STRING SET HASH LIST
redis的命令行操作模式会显示他的语法提示,基本使用采用的是k/v值的形式,即通过key设置value的方式。
对redis数据库的操作可分为两种方式,第一种采用redis-cli进行访问,第二种采用编程语言,如 Python、Java等。本文中使用 redis-cli 的方式进行数据的访问,首先需要启动redis,连接上 redis-server,这在上节已经进行了详细的讲解,此处不再赘述。

redis-cli 在使用时提供了命令提示,方便我们操作。
Redis 命令参考

使用redis-cli对redis进行字符串string操作

添加

set key value ,value 为string类型,可以不使用引号
示例:

1
2
$ 127.0.0.1:6379> set username tmj
OK

将字符串值 value 关联到 key ,如果 key 已经持有其他值,set 命令就覆写旧值,无视其类型。并且默认的过期时间是永久(即使之前的 key 快过期了),即永久不会过期。

批量添加

mset key1 value1 key2 value2 ... ...

删除

del key
示例:

1
2
$ 127.0.0.1:6379> del username
(integer) 1

设置过期时间

expire key timeout 时间单位为秒
示例:

1
2
$ 127.0.0.1:6379> expire username 60
(integer) 1

可以对已经设置过过期时间的 key 重新设置过期时间,将覆盖原值。也可以在设置 key 时,同时指定过期时间,使用 EX 参数

1
2
$ 127.0.0.1:6379> set age 18 EX 800
OK

等价方式,使用 setex key timeout value

1
2
$ 127.0.0.1:6379> setex age 800 18
OK

注意:expire key timeout 指令是通用的,适用于各种类型的key,下面的两中方式只适用于string类型。

查看过期时间

ttl key
过期时间的查询结果有一下几种:

  • 大于0的正整数:此key存在,且还剩下正整数的时间过期
  • -1 : 此key存在,且没有设置过期时间,即永久不会过期
  • -2 : 此key不存在,或存在但是过期了,总之就是现在不存在了。

示例:

1
2
$ 127.0.0.1:6379> ttl username
(integer) 796

查看某个string类型key的值

get key

批量查看多个string类型key的值

mget key1 key2 key3 ...

查看当前redis中所有类型的key

keys *

查看key的类型

因为redis中所有类型的key是存在一起的,但是每中类型的key的查看的方式都是不同的,一旦使用的查询命令不对就会报错,此时可以使用 type key 查看key的类型
示例:

1
2
$ 127.0.0.1:6379> type username
string

使用redis-cli对redis进行列表list操作

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

添加

添加到头部(左边)使用 lpush key value,添加到尾部(右边)使用 rpush key value。如果key不存在,一个空的列表会被创建并执行lpush(rpush)操作,当key存在,但不是列表类型时,返回错误。
示例:

1
2
$ 127.0.0.1:6379> lpush language python
(integer) 1 # 返回值为当前列表中值的个数

列表中可以添加多个值,且可以是重复值

1
2
$ 127.0.0.1:6379> lpush language python python
(integer) 3 # 添加了两个重复的值,目前一共三个值

注意:当一次添加多个 value 的时候,最后一个 value 是第一个被添加的,如上面的例子中,最后一个 python 是第一被添加的。

查看列表中的的元素(是一个区间中的元素)

lrange key start stop,指令中的 l 代表的是列表list的意思,返回列表key中指定区间内的元素,区间以偏移量start和stop指定,如果要左边的第一个到最后的一个 lrange key 0 -1(列表的第一项下标是 0,左后一项为 -1)。若只想查看某个值,则start 和 stop 指定一样的下标即可。
示例:

1
2
3
4
$ 127.0.0.1:6379> lrange language 0 -1
1) "python"
2) "python"
3) "python"

返回指定下标的元素

使用 lindex key index,指令中的 l 代表的是列表list的意思,将返回key这个列表中,索引为index的这个元素,若是请求的索引不存在,返回 (nil)。
示例:

1
2
$ 127.0.0.1:6379> lindex language 0
"python"

修改指定下标的元素

使用 lset key index value,将列表 key 下标为 index 的元素的值设置为 value 。当 index 参数超出范围,或对一个空列表(key不存在)进行 LSET 时,返回一个错误。
示例:

1
2
$ 127.0.0.1:6379> lset language 0 Golang
OK # 修改成功,返回OK

移除列表中的元素

同理增加值的方式,使用lpop keyrpop key 移除列表头部或者尾部的元素,使用这两条命令移除列表元素的同时还会返回移除的值。
示例:

1
2
$ 127.0.0.1:6379> lpop language
"python" # 返回了被移除的头部元素

移除指定个数的单个元素

使用 lrem key count value,指令中的 l 代表的是列表list的意思,删除列表key中count个值为value的元素。
示例:

1
2
$ 127.0.0.1:6379> lrem language 4 python
(integer) 1 # 返回的值为 实际 删除的个数,若为0表示不存在该元素

注意:返回的是实际删除掉的 values 的个数,使用的时候 count 的大小是可以超过实际个数大小的,但是删除时的返回值是实际删除掉的个数。

移除指定位置index的元素

命令里没有根据 index 删除元素的命令,如果想要删除指定index的值,可以采用组合命令的方式,即通过 lset key index value 来修改要删除的位置的元素为某个标志,然后使用 lrem key 0 value 删除所有值为标记的元素(也即是需要删除的位置):

1
2
3
4
$ 127.0.0.1:6379> lset language 1 del  # 将要删除的下表的元素设置为 "del"
OK
$ 127.0.0.1:6379> lrem language 0 del # 删除值为 "del" 的所有的元素,就相当于删除了指定index上的值
(integer) 1

同理删除多个位置上的值,就可以通过 lset key index value 修改多个需要删除的位置上的值为标志值,然后使用 lrem key 0 value 统一删除。

移除区间之外的元素

使用 ltrim key start stop 对列表进行修剪(trim),即让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
示例:

1
2
$ 127.0.0.1:6379> ltrim language 0 1
OK # 保留了前两个元素

注意,作用的范围是闭区间。

获取列表中的元素的个数

llen key

只有单条的指令可以通过正负值来指定操作的方向

命令中的 l 代表list的指令(即不使用通过l和r来区分操作方向的指令),都可以通过负值来表示反向操作。
如移除指定个数的元素 lrem key count value 命令根据参数count的值,移除列表中与参数value相等的元素。count的值可以是一下几种:

  • count > 0 :从表头开始向表尾搜索,移除与value相等的元素,数量为count。
  • count < 0 :从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。
  • count = 0 : 移除表中所有与value相等的值。

使用redis-cli对redis进行集合set操作

集合和列表相似,是用来存储元素的,不同在于,集合是无序的,且元素同一元素只能保存一份,集合中的元素是唯一的。

添加

使用 sadd key member1 member2 ... ,因为元素是无序且唯一的,所以不存在左右添加的区别。
示例:

1
2
3
4
5
6
$ 127.0.0.1:6379> sadd team xiaoming xiaowang
(integer) 2
$ 127.0.0.1:6379> sadd team xiaoming
(integer) 0 # 添加了重复值返回0,表示没有本次没有添加的内容
$ 127.0.0.1:6379> sadd team xiaotang
(integer) 1

与列表的添加不同,返回的结果不会显示目前集合中元素个数,只会显示本次添加操作中成功添加的个数,重复添加相同的值,则返回0。一次性添加的多个成员中含有集合中已经存在的成员直接无视,添加未存在的。

注意:集合中存储的成员的顺序于添加顺序无关

查看集合中的成员

smembers key

移除集合中的成员

使用 srem key member1 member2 ... 进行删除,因为集合是没有下标,且集合中的值唯一,所以直接指定需要删除的成员即可。

移除并返回一个随机成员

使用 spop key ,会随机删除并返回一个元素
示例:

1
2
3
4
5
6
$ 127.0.0.1:6379> sadd team xiaoming xiaowang
(integer) 2
$ 127.0.0.1:6379> spop team
"xiaowang"
$ 127.0.0.1:6379> smembers team
1) "xiaoming"

随机获取一个元素不移除

使用 srandmember key [count],从 Redis2.6 版本开始, srandmember 命令接受可选的 count 参数:

  • 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
  • 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。

查看集合中的成员的个数

使用 scard key 进行查看
示例:

1
2
$ 127.0.0.1:6379> scard team
(integer) 5

集合之间的操作

获取集合的交集

sinter key1 key2

获取集合的并集

sunion key1 key2

获取集合的差集

sdiff key1 key2

使用redis-cli对redis进哈希表hash操作

哈希表类似python中的字典,采用k/v值的形式。

添加

使用 hset key field value 进行创建,将哈希表 key 中的域 field 的值设为 value。
示例:

1
2
3
4
$ 127.0.0.1:6379> hset website baidu www.baidu.com
(integer) 1
$ 127.0.0.1:6379> hset website google www.google.com
(integer) 1

返回的内容和string操作时类似,用来显示成功与否,不显示添加的数量

数据的存储样式是:
redis_hash
如果域 field 已经存在于哈希表中,旧值将被覆盖。
示例:

1
2
3
4
$ 127.0.0.1:6379> hset website google google.com
(integer) 0 # 注意返回值的形式,是0而不是1
$ 127.0.0.1:6379> hget website google
"google.com" # 查看后发现域field的值被修改了

批量添加

使用hmset key field1 value1 field2 value2 ... ...
示例:

1
2
$ 39.106.84.56:6379> hmset website apple www.apple.com huawei www.hauwei.com
OK

获取哈希表中的field对应的值

hget key field

批量查看哈希表中的某些field对应的值

hmget key field1 field2 ...

删除field中的某个field

hdel key field

获取哈希中的所有的field和value

使用 hgetall key 进行获取,打印的样式是 field value 这样一个间隔一个的样式
示例:

1
2
3
4
5
$ 127.0.0.1:6379> hgetall website
1) "baidu"
2) "www.baidu.com"
3) "google"
4) "www.google.com"

获取某个哈希中所有的field

hkeys key

获取某个哈希中所有的值

hvals key

判断哈希中是否存在某个field

使用 hexists key field
示例:

1
2
3
4
$ 127.0.0.1:6379> hexists website google
(integer) 1 # 存在返回1
$ 127.0.0.1:6379> hexists website googl
(integer) 0 # 不存在返回0

获取哈希表中的键值对个数

使用 hlen key
示例:

1
2
$ 127.0.0.1:6379> hlen website
(integer) 2

为哈希表中的 字段值 加上指定增量值

通过 hincrby key field num 的方式,给hash表中field对应的value增加或者减少相应的数量,注意此操作只能用来对value是数值形式的field进行。

事务

Redis事务可以一次执行多个命令,事务具有以下特征:

  • 隔离操作:事务中的所有命令都会序列化、按顺序的执行,不会被其他命令打扰。
  • 原子操作:事务中的命令要么全部被执行,要么全部不执行。

开启一个事务

multi
以后执行的所有的命令,都在这个事务中执行。

执行事务

exec
会将在multi和exec中的操作一并提交。

取消事务

discard
会将multi后的所有命令取消。

监视一个或者多个key

watch key [key ...]
监视一个(或者多个)key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断。

取消所有key的监视

unwatch

发布/订阅操作

给某个频道发布消息

publish channel message

订阅某个频道的消息

subscribe channel