本文主要介绍redis中常见的几种数据类型的基本命令行操作

更新于 2021-04-18


String类型

字符串是redis中最基础的数据类型,最多可以容纳512M的数据长度。

数据增删改查

使用set指令可以在redis中存string类型的数据,格式如下:

1
2
# 存数据
set [key] [value]

redis数据都是键值对,所以需要一个key和对应的value;key不要过长,否则会消耗很多内存,最好有统一的命名规范保证可读性。

使用get指令可以在redis中取string类型的数据,格式如下:

1
2
# 取数据
get [key]

获取所有的key,可以使用如下的方式:

使用del指令可以删除指定key下的数据,其格式如下:

1
del [key]

例如:

返回1说明删除成功,再次获取这个key对应的value的时候返回nil

getset重新赋值

getset命令会先获取key对应的value值,然后在对key重新复制,其格式如下:

1
getset [key] [value]

例如:

value自增和自减

incrdecr命令可以分别让key对应的value自增1和自减1:

  • 如果value是整型,则自增或自减1;
  • 如果无法转换成整型,则报错;
  • 如果key不存在,则创建这个key并并赋初始值0,然后自增或自减1;

其格式如下:

1
2
incr [key]
decr [key]

数值类型自增

key不存在时

value无法转换为整型

指定步长

默认incrdecr的步长都是1,但是incrbydecrby可以指定自增和自减的步长单位,其用法和incrdecr一致,格式如下:

1
2
incrby [key] [步长]
decrby [key] [步长]

例如:

字符串追加

append命令可以在指定key的value后面追加字符串。如果key不存在,则会创建这个key并将需要追加的内容作为value赋值,其格式如下:

1
append [key] [追加的内容]

例如:


hash类型

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储海量的键值对。


使用hsethget可以分别对hash类型的数据进行存取操作,hsethget只能一次存入和读取一对键值对,使用hmsethmget可以一次存入和读取多个键值对。

使用hgetall可以获取到hash数据的所有值,其格式如下:

1
2
3
4
5
hset [key] [属性key] [属性value]
hget [key] [属性的key]
hmset [key] [属性key1] [属性value1] [属性key2] [属性value2] ...
hget [key] [属性的key1] [属性key2] ...
hgetall [key]

例如:

hdeldel可以删除hash类型数据中属性以及其值,格式如下:

1
2
hdel [key] [属性1] [属性2]...
del [key]

例如:

hash类型自增

hincrby操作可以给hash类型属性的值增加指定的单位,其格式如下:

1
hincrby [key] [属性] [步长]

例如:


获取所有属性名称和值

hkeyshvals分别可以获得hash中所有的keys和所有的values,其格式如下:

1
2
3
hkeys [key]

hvals [ley]

例如:

获取属性的个数

hlen可以获得hash中属性的个数,其格式如下:

1
hlen [key]

例如:

判断属性是否存在

hexists可以判断hash中某个属性是否存在,存在则返回1,不存在则返回0,其格式如下:

1
hexists [key] [属性]

例如:


list类型

list类型是按照插入顺序排序的字符串列表,和数据结构中普通列表是一样的。可以在其头部和尾部插入新元素。插入时如果key不存在,则会为其创建新的列表;如果列表中的所有元素都被移除,那么这个key也会从数据库中移除。

向列表头尾插入和删除元素是比较高效的。如果插入和删除操作位于列表中间,则效率比较低。

列表两端添加

lpush可以从左侧向列表中添加数据,如果添加的key不存在,则会创建,其格式如下:

1
lpush [key] [value1] [value2] ...

例如:

第一次添加将创建名为mylist的列表,从返回值可以看出,经过两次添加,列表长度为6。先添加的数据会被后添加的数据挤到右侧。

rpush可以从右侧向列表中添加数据,如果添加的key不存在,则会创建,其格式如下:

1
rpush [key] [value1] [value2] ...

例如:

先添加的数据会被后添加的数据挤到左侧。


查看列表

lrange可以从左侧为起点查看列表,lrange也可以指定起始和结束的索引位置,其格式如下:

1
lrange [key] [起始索引] [结束索引]

例如:


两端弹出

lpoprpop可以实现左端和右端弹出列表第一个元素,如果不存在则弹出nil,其格式如下:

1
2
lpop [key] 
rpop [key]

例如:

注意,只要是弹出,则这个元素在列表中将不再存在。


获取元素个数

llen可以获取指定list中的元素的个数,其格式如下:

1
llen [key]

例如:


在头部添加元素

lpushxrpush可以在指定的list的头部和尾部添加元素,其格式如下:

1
2
lpushx [key] [value]
rpushx [key] [value]

例如:

这种方式仅对已存在的list有效,如果指定的key为不存在的list,则返回0。


删除元素

lrem可以删除在指定list中count个值为value的元素,如果count大于0则在删除时从头部到尾部依次遍历删除,如果count小于0则在删除时从尾部到头部部依次遍历删除,如果count为0则删除所有值为value的元素,其格式如下:

1
lrem [key] [count] [value]

例如:


插入元素

lset来通过索引来添加元素,其格式为:

1
lset [key] [index] [value]

例如:

使用linsert在指定的元素前或后插入新的元素,其格式如下:

1
linsert [key] [before|after] [已存在的元素] [value] 

例如:


rpoplpush指令

rpoplpush指令可以将一个list的尾部元素弹出,并加入另一个list的头部,其格式如下:

1
rpoplpush [source list] [target list]

例如:

这个指令的使用场景是:使用redis作为消息队列时,消费者从队列中取出数据进行处理。若此时消费者程序错误崩溃,那么此时取出的数据可以认为已经丢失,这将对业务数据的完整性造成影响。rpoplpush可以让消费者程序将消息从主队列取出放到备份队列中,实现备份的功能。


set类型

set类型可以看做没有排序的字符集合,可以对其执行添加、删除等操作。和list不同的是,set集合不允许出现重复元素。如果对set类型反复存入多个相同的元素,则只会保存一个。set最大包含40亿个元素。

添加元素

sadd可以向set中添加元素,其格式如下:

1
sadd [key] [value1] [value2] ...

例如:

从返回值看,第二次添加a元素失败了,因为a已经存在,set不允许重复


查看元素

smembers来查看set中的元素,其格式如下:

1
smembers [key]

例如:


删除元素

srem可以删除set中的元素,其格式如下:

1
srem [key] [value1] [value2] ... 

例如:


判断元素是否存在

sismember可以判断指定元素是否存在于set中,其格式如下:

1
sismember [key] [target]

例如:

存在则返回1,不存在则返回0。


差集运算

sdiff可以计算出两个set集合的差集,其格式如下:

1
sdiff [key1] [key2] ...

其中key的顺序将影响计算的结果,计算方式是第一个key中有的而后面key中没有的,例如:


可以使用sdiffstore将集合的差集存储到新的set中,其格式如下:

1
sdiffstore [new set] [key1] [key2] ...

例如:


交集运算

使用sinter可以计算set集合的交集,其格式如下:

1
sinter [key1] [key2] ...

例如:


可以使用sinterstore将集合的交集存储到新的集合中,其格式如下:

1
sinterstore [new set] [key1] [key2] ...

例如:


并集运算

使用sunion可以计算集合的并集,其格式如下:

1
sunion [key1] [key2] ...

例如:


可以使用sunionstore将集合的并集存储到新的set中,其格式如下:

1
sunionstore [new set] [key1] [key2] ...

例如:


获取元素个数

使用scard可以获取集合中元素的个数,其格式如下:

1
scard [key]

例如:


随机返回set元素

srandmember可以随机返回set中的一个元素,其格式如下:

1
srandmember [key]

例如:


其他操作

查看key

keys指令如果跟上 * 则表示查看所有的key,也可以和正则表达式结合来查看指定规则的key,例如:

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> keys my?

1) "my2"

2) "my3"

127.0.0.1:6379> keys c*

1) "company"

判断key是否存在

使用exists可以判断key是否存在,存在则返回1,不存在则返回0,例如:

1
2
3
4
5
6
7
127.0.0.1:6379> exists company

(integer) 1

127.0.0.1:6379> exists hello

(integer) 0

key重命名

使用rename可以将一个key重命名,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> get company

"alibaba"

127.0.0.1:6379> rename company newcompany

OK

127.0.0.1:6379> get company

(nil)

127.0.0.1:6379> get newcompany

"alibaba"

设置key过期时间

可以使用expire来设置key的过期时间,单位是秒,过期后key将被删除,配套使用ttl可以看到key所剩余的时间,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> expire newcompany 10

(integer) 1

127.0.0.1:6379> ttl newcompany

(integer) 1

127.0.0.1:6379> get newcompany

(nil)

127.0.0.1:6379> ttl newcompany

(integer) -2

\没有设置超时时间的key在使用ttl指令时会返回-1。**


获取key的类型

使用type可以获取到key的类型,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
127.0.0.1:6379> type myb2

set

127.0.0.1:6379> type mylist

list

127.0.0.1:6379> type mysort

zset

127.0.0.1:6379> type qq

string

127.0.0.1:6379> type myhash

hash