说明
Redis里面的数据类型有String、List、Set、Hash、Zset。这篇文章会介绍这5种数据类型并介绍操作它们的指令.
String类型
字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,这意味着一个Redis字符串能包含任意类型的数据,例如: 一张JPEG格式的图片或者一个序列化的Ruby对象。
一个字符串类型的值最多能存储512M字节的内容。
下面是字符串的一些指令
添加值 set <key> <value>
127.0.0.1:6379> set name ttpfx
OK
获取值 get <key>
127.0.0.1:6379> get name
"ttpfx"
将给定的 <value> 追加到原值的末尾 append <key> <value>
127.0.0.1:6379> append name 123
(integer) 8
127.0.0.1:6379> get name
"ttpfx123"
127.0.0.1:6379>
strlen获取对应key的长度 strlen <key>
127.0.0.1:6379> get name
"ttpfx123"
127.0.0.1:6379> strlen name
(integer) 8
127.0.0.1:6379>
setnx只有在对应key不存在的时候才设置key的值 setnx <key> <value>
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> setnx name hello
(integer) 0
127.0.0.1:6379> setnx age 20
(integer) 1
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379>
incr 将key中存储的值+1,只能操作数字,如果不存在key,那么就设置key,值为1 。incr <key>
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> incr age
(integer) 21
127.0.0.1:6379> incr name
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
还有一个decr,效果和incr基本一样的,只不过是将值-1,如果不存在值,那么初始值为-1 decr <key>
127.0.0.1:6379> get age
"21"
127.0.0.1:6379> decr age
(integer) 20
127.0.0.1:6379>
增加/减少指定值,incrby / decr <key> <value>,如果对应的key不存在,那么创建对应key并设置为 ±指定的值
127.0.0.1:6379> incrby age 5
(integer) 25
127.0.0.1:6379> decrby age 5
(integer) 20
127.0.0.1:6379>
一次设置多个k-v,那么就使用mset ,指令格式为 mset <key1> <value> <key2> <value2> …
127.0.0.1:6379> mset a1 1 a2 2 a3 3
OK
127.0.0.1:6379>
一次获取多个key的值,使用mget,指令格式为 mget <key1> <key2> …
127.0.0.1:6379> mget a1 a2 a3
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> mget a1 a4
1) "1"
2) (nil)
127.0.0.1:6379>
一次设置多个k-v,当对应的k不存在才设置,使用 msetnx <key1> <value> <key2> <value2> …,需要注意的是,这个操作要所有的key都不存在才进行设置value,是原子性的,存在任意一个key都会执行失败。
127.0.0.1:6379> msetnx d1 1 d2 2 d3 3
(integer) 1
127.0.0.1:6379> msetnx e1 1 e2 2 d3 3
(integer) 0
127.0.0.1:6379> get e1
(nil)
127.0.0.1:6379>
获取对应key字串,使用getrange,语法为 getrange <key> <start> <end>,两边都是闭区间
127.0.0.1:6379> getrange name 0 3
"ttpf"
127.0.0.1:6379> getrange name 0 100
"ttpfx123"
127.0.0.1:6379> getrange name 100 1000
""
127.0.0.1:6379>
更改对应key的部分内容,使用setrange,语法为 **setrange <key> <start> **,会从start位置开始进行覆盖
127.0.0.1:6379> get name
"ttpfx123"
127.0.0.1:6379> setrange name 5 4567
(integer) 9
127.0.0.1:6379> get name
"ttpfx4567"
127.0.0.1:6379>
可以给key设置过期时间,指令为 setex <key> <过期时间(秒)> <value> ,查看过期时间使用ttl key
127.0.0.1:6379> setex money 10 888
OK
127.0.0.1:6379> get money
"888"
127.0.0.1:6379> ttl money
(integer) 5
127.0.0.1:6379> ttl money
(integer) 3
127.0.0.1:6379> ttl money
(integer) -2
127.0.0.1:6379> get money
(nil)
127.0.0.1:6379>
通过getset指令可以实现以旧换新,再设置新值的时候返回旧值 getset <key> <value>
127.0.0.1:6379> get name
"ttpfx123"
127.0.0.1:6379> getset name ttpfx
"ttpfx123"
127.0.0.1:6379> get name
"ttpfx"
127.0.0.1:6379>
***
List类型
Redis列表是简单的字符串列表,按照插入顺序排序。List是一个双向链表
**lpush/rpush <key> <value1> <value2> … **从左边/右边插入一个或多个值
127.0.0.1:6379[1]> lpush names tom jack
(integer) 2
127.0.0.1:6379[1]> lrange names 0 -1
1) "jack"
2) "tom"
127.0.0.1:6379[1]> rpush names t1 t2
(integer) 4
127.0.0.1:6379[1]> lrange names 0 -1
1) "jack"
2) "tom"
3) "t1"
4) "t2"
127.0.0.1:6379[1]>
**lpop/rpop <key> [count] ** 左边/右边删除count个值,count是可选值,不写默认就是1
127.0.0.1:6379[1]> lrange names 0 -1
1) "jack"
2) "tom"
3) "t1"
4) "t2"
127.0.0.1:6379[1]> lpop names
"jack"
127.0.0.1:6379[1]> lpop names 2
1) "tom"
2) "t1"
127.0.0.1:6379[1]> lrange names 0 -1
1) "t2"
127.0.0.1:6379[1]>
rpoplpush <source> <destination> 相当于对source执行rpop,对destination执行lpush
127.0.0.1:6379[1]> lrange k1s 0 -1
1) "c"
2) "b"
3) "a
127.0.0.1:6379[1]> lrange k2s 0 -1
1) "e"
2) "d"
3) "c"
127.0.0.1:6379[1]> rpoplpush k1s k2s
"a"
127.0.0.1:6379[1]> lrange k1s 0 -1
1) "c"
2) "b"
127.0.0.1:6379[1]> lrange k2s 0 -1
1) "a"
2) "e"
3) "d"
4) "c"
127.0.0.1:6379[1]>
lrange <key> <start> <end> 返回列表指定索引区间的元素,最左边开始为0,最右边开始为-1,都是闭区间
127.0.0.1:6379[1]> lrange names 0 -1
1) "t1"
2) "t2"
3) "t3"
4) "t4"
127.0.0.1:6379[1]> lrange names 0 2
1) "t1"
2) "t2"
3) "t3"
127.0.0.1:6379[1]>
lindex <key> <i> 获得指定索引的元素
127.0.0.1:6379[1]> lindex names 1
"t2"
127.0.0.1:6379[1]> lindex names -1
"t4"
127.0.0.1:6379[1]>
llen <key> 获取指定列表的长度
127.0.0.1:6379[1]> llen names
(integer) 4
127.0.0.1:6379[1]>
**linsert <key> [before|after] <value> <newValue> ** 在指定集合的第一个value前面/后面插入一个newValue
127.0.0.1:6379[1]> lrange names 0 -1
1) "t1"
2) "t2"
3) "t3"
4) "t4"
127.0.0.1:6379[1]> linsert names before t2 a
(integer) 5
127.0.0.1:6379[1]> linsert names after t2 a
(integer) 6
127.0.0.1:6379[1]> lrange names 0 -1
1) "t1"
2) "a"
3) "t2"
4) "a"
5) "t3"
6) "t4"
127.0.0.1:6379[1]> linsert names after a b
(integer) 7
127.0.0.1:6379[1]> lrange names 0 -1
1) "t1"
2) "a"
3) "b"
4) "t2"
5) "a"
6) "t3"
7) "t4"
127.0.0.1:6379[1]>
**lrem <key> <count> <value> ** 从左边开始删除count个value,会返回删除的个数
127.0.0.1:6379[1]> lrange names 0 -1
1) "t1"
2) "a"
3) "b"
4) "t2"
5) "a"
6) "t3"
7) "t4"
127.0.0.1:6379[1]> lrem names 2 a
(integer) 2
127.0.0.1:6379[1]> lrange names 0 -1
1) "t1"
2) "b"
3) "t2"
4) "t3"
5) "t4"
127.0.0.1:6379[1]>
lset <key> <index> <value> 设置指定下标的值
127.0.0.1:6379[1]> lrange names 0 -1
1) "t1"
2) "t2"
3) "t3"
4) "t4"
127.0.0.1:6379[1]> lset names 1 tom
OK
127.0.0.1:6379[1]> lset names 100 jack
(error) ERR index out of range
127.0.0.1:6379[1]> lrange names 0 -1
1) "t1"
2) "tom"
3) "t3"
4) "t4"
127.0.0.1:6379[1]>
Set类型
Set和List都是集合,不同之处就是Set不允许有重复元素。
sadd key element [element …] 添加元素
127.0.0.1:6379[2]> sadd names tom jack
(integer) 2
127.0.0.1:6379[2]> smembers names
1) "tom"
2) "jack"
127.0.0.1:6379[2]>
smembers key 查看set中所有元素
127.0.0.1:6379[2]> smembers names
1) "tom"
2) "jack"
127.0.0.1:6379[2]>
**sismember key value ** 判断某个set中是否有某个值,有返回1,没有返回0
127.0.0.1:6379[2]> smembers names
1) "tom"
2) "jack"
127.0.0.1:6379[2]> sismember names tom
(integer) 1
127.0.0.1:6379[2]> sismember names lucy
(integer) 0
127.0.0.1:6379[2]>
scard key 返回set元素个数
127.0.0.1:6379[2]> scard names
(integer) 2
127.0.0.1:6379[2]>
srem key value [value …] 删除一个或多个值
127.0.0.1:6379[2]> smembers names
1) "tom"
2) "jack"
3) "jery"
4) "ttpfx"
127.0.0.1:6379[2]> srem names tom jack
(integer) 2
127.0.0.1:6379[2]> smembers names
1) "jery"
2) "ttpfx"
127.0.0.1:6379[2]>
spop key [count] 随机删除count个值,不写count默认就是1
127.0.0.1:6379[2]> smembers names
1) "tom"
2) "jack"
3) "jery"
4) "ttpfx"
127.0.0.1:6379[2]> spop names
"jack"
127.0.0.1:6379[2]> spop names 2
1) "tom"
2) "jery"
127.0.0.1:6379[2]> smembers names
1) "ttpfx"
127.0.0.1:6379[2]>
**srandmember key [count] ** 和spop基本用于,只不过不会删除对应元素
127.0.0.1:6379[2]> smembers names
1) "tom"
2) "jack"
3) "jery"
4) "ttpfx"
127.0.0.1:6379[2]> srandmember names
"jack"
127.0.0.1:6379[2]> srandmember names 2
1) "tom"
2) "jery"
127.0.0.1:6379[2]> smembers names
1) "tom"
2) "jack"
3) "jery"
4) "ttpfx"
127.0.0.1:6379[2]>
smove source destination value 将指定值从一个Set移到另外一个Set
127.0.0.1:6379[2]> smembers t1
1) "a"
2) "b"
127.0.0.1:6379[2]> smembers t2
1) "c"
2) "d"
127.0.0.1:6379[2]> smove t1 t2 a
(integer) 1
127.0.0.1:6379[2]> smembers t1
1) "b"
127.0.0.1:6379[2]> smove t1 t2 a
(integer) 0
127.0.0.1:6379[2]> smembers t2
1) "a"
2) "c"
3) "d"
127.0.0.1:6379[2]>
sinter/sunion/sdiff key [key …] 对指定集合进行交集/并集/差集运算
127.0.0.1:6379[2]> smembers x1
1) "c"
2) "a"
3) "b"
127.0.0.1:6379[2]> smembers x2
1) "c"
2) "d"
3) "b"
127.0.0.1:6379[2]> sinter x1 x2
1) "c"
2) "b"
127.0.0.1:6379[2]> sunion x1 x2
1) "a"
2) "c"
3) "d"
4) "b"
127.0.0.1:6379[2]> sdiff x1 x2
1) "a"
127.0.0.1:6379[2]>
Hash类型
hash是一个键值对的集合,类似于java中的HashMap,一般用于存储对象
hset key filed value [filed value] 给key对象中的filed字段设置值,hmset作用是一样的,但是根据Redis 4.0.0,HMSET被视为已弃用。请在新代码中使用HSET。
127.0.0.1:6379[3]> hset user name ttpfx age 20
(integer) 2
127.0.0.1:6379[3]>
hmget key filed [filed] 获取key里面对应字段的值,hget key filed 获取key中filed的值
127.0.0.1:6379[3]> hmget user name age salary
1) "ttpfx"
2) "20"
3) (nil)
127.0.0.1:6379[3]> hget user name
"ttpfx"
127.0.0.1:6379[3]>
hexists key filed 对应的key中是否存在filed字段
127.0.0.1:6379[3]> hexists user name
(integer) 1
127.0.0.1:6379[3]> hexists user salary
(integer) 0
127.0.0.1:6379[3]>
hkeys key 列出对应key中所有的字段
127.0.0.1:6379[3]> hkeys user
1) "name"
2) "age"
127.0.0.1:6379[3]>
hvals key 列出对应key中的所有值
127.0.0.1:6379[3]> hvals user
1) "ttpfx"
2) "20"
127.0.0.1:6379[3]>
hincrby key filed increment 给key中的指定字段值加上某个数
127.0.0.1:6379[3]> hincrby user age -1
(integer) 19
127.0.0.1:6379[3]> hincrby user age 10
(integer) 29
127.0.0.1:6379[3]>
hsetnx key filed value 当key中不存在filed字段时才进行设置该值
127.0.0.1:6379[3]> hsetnx user name tom
(integer) 0
127.0.0.1:6379[3]> hsetnx user salary 88888
(integer) 1
127.0.0.1:6379[3]>
Sorted Set 排序集合
和Set类似,只不过多了一个score来代表权重,集合中的元素根据score进行排序
zadd key [NX|XX] [CH] [INCR] score member [score member …],添加字段,score是一个double值
可选参数解释如下:
- XX: 仅仅更新存在的成员,不添加新成员。
- NX: 不更新存在的成员。只添加新成员。
- CH: 修改返回值为发生变化的成员总数,原始是返回新添加成员的总数 (CH 是 changed 的意思)。更改的元素是新添加的成员,已经存在的成员更新分数。 所以在命令中指定的成员有相同的分数将不被计算在内。注:在通常情况下,
ZADD
返回值只计算新添加成员的数量。 - INCR: 当
ZADD
指定这个选项时,成员的操作就等同ZINCRBY命令,对成员的分数进行递增操作。
127.0.0.1:6379[4]> zadd sgyy 100 gy 200 zf 300 zy 400 mc 500 hz
(integer) 5
127.0.0.1:6379[4]>
zrange key min max [withscorces] 返回下标在[min,max]之间的值,使用withscorces可以返回对应的分数
127.0.0.1:6379[4]> zrange sgyy 0 2
1) "gy"
2) "zf"
3) "zy"
127.0.0.1:6379[4]> zrange sgyy 0 2 withscores
1) "gy"
2) "100"
3) "zf"
4) "200"
5) "zy"
6) "300"
127.0.0.1:6379[4]>
zscore key member 返回member对应的score
127.0.0.1:6379[4]> zscore sgyy zy
"300"
127.0.0.1:6379[4]>
zrangebyscore key min max [withscores] [limit offset count] 返回指定score区间的值,都是闭区间
zrevrangebyscore 和zrangebyscore 基本一样的,就是按照max,min来指定区间
127.0.0.1:6379[4]> zrangebyscore sgyy 100 350 withscores
1) "gy"
2) "100"
3) "zf"
4) "200"
5) "zy"
6) "300"
127.0.0.1:6379[4]> zrangebyscore sgyy 100 350 withscores limit 0 2
1) "gy"
2) "100"
3) "zf"
4) "200"
127.0.0.1:6379[4]>
zincrby key increment member 增加某个元素的score
127.0.0.1:6379[4]> zincrby sgyy -50 gy
"50"
127.0.0.1:6379[4]>
zrem key member [member] 删除对应的值
127.0.0.1:6379[4]> zrem sgyy hz mc
(integer) 2
127.0.0.1:6379[4]>
zcount key min max 统计分数区间内有多少个元素
127.0.0.1:6379[4]> zcount sgyy 50 200
(integer) 2
127.0.0.1:6379[4]>
zrank key member 返回指定元素在集合中的排名,0开始
127.0.0.1:6379[4]> zrank sgyy gy
(integer) 0
127.0.0.1:6379[4]> zrank sgyy zf
(integer) 1
127.0.0.1:6379[4]>
***
总结
上面只是部分常用的指令,关于操作数据的指令还有很多,可以参考 redis命令中心