Redis 数据结构:字符串String
set
设置一个字符串,并设置字符穿的值valueset world helloworld OK
get
获取一个字符串的valueget world "helloworld"
srtlen
获取字符穿的长度set hello helloworld get hello "helloworld" setlen hello (integer) 10
getrange
获取字符串区间闭合区间set word helloworld getrange world 0 2 "hel"
append
追加到当前key的value的末尾,控制台输出当前k append操作之后的value的长度值。set 1 1 OK append 1 hello (integer) 6 get 1 "1hello"
setex
设置k的值value,并设置有效期,ex
是expire的缩写,比如设置c的值为c,有效期为100ssetex c 100 c ttl c (integer) 92
psetex
单位为毫秒,比 setex 时间降了一个级别,设置d的value为d,有效期为10000毫秒。psetex d 10000 d
getset
先get操作后set,在set一个值得时候,可以通过返回值获取到旧的值。set a a get a "a" getset a aaa "a" get a "aaa"
mset
和mget
mset可以设置多个k-v mset a1 a1 b1 b1 c1 c1,mget可以同时获取多个k的vmset a1 a1 b1 b1 c1 c1 OK mget a1 b1 c1 1) "a1" 2) "b1" 3) "c1"
setnx
当且仅当当前的k不存在时才会设置v成功,否则,如果k存在,则设置不成功。nx = not exist 的缩写,此为setnx与set的区别。set a a get a "a" setnx a newvalue (integer) 0 setnx newkey newvalue (integer) 1 get newkey "newvalue"
msetnx
setnx命令的拓展,批量操作多个k,msetnx拥有原子性,要么都成功,要么都失败,下面例子中,因为q存在,所以执行msetnx q q u u 时,因为q已经存在,u没有被设置成功。msetnx q q w w (integer) 1 keys * 1) "q" 2) "w" msetnx q q u u (integer ) 0
incr
对数值类型的str的value进行数值+
操作,必须为数值类型,否则会报错.可以自定义步长,使用incrby
命令,后面加上步长。get 1 (nil) set 1 1 OK get 1 "1" incr 1 (integer) 2 incr 1 (integer) 3 incrby 1 100 (integer) 103 incr a (error) ERR value is not an integer or out of range
decr
对数值类型的str的value进行数值-
操作,与incr
操作相反。同样提供decrby
操作。get 1 100 "105" decr 1 (integer) 104 decrby 1 100 (integer) 4 decrby 1 5 (integer) -1 decr a (error) ERR value is not an integer or out of range
Redis数据结构:哈希hash
hash 结构,不同于string操作,只设置k,v即可。 hash 除了需要设置k,v之外,还有一个
field
的概念。即 key+field 定位到一个value,而且一个key,可以有多个field。
操作hash数据结构之前,切换到另外一个工作空间。
select 1 OK key * (empty list or set)
hset
设置一个key + field指定valuehset map name jelly (integer) 1 keys * "map" type map hash
hget
指定key + field获取 hash 的value,如果不存在返回nil
。hget map name "jelly" hget map age (nil)
hexists
用来判断制定key和field的hash数据是否存在。hexists map name (integer) 1 hexists map name123 (integer) 0
hgetall
获取当前key所有的filed和value。hset map name jelly keys * "map" hset map age 18 key * "map" hgetall map 1) "name" 2) "jelly" 3) "age" 4) "18"
hkeys
获取当前key的所有field。hkeys map 1) "name" 2) "age"
hvals
获取当前key的所有value。hvals map "jelly" "18"
hlen
获取当前key的长度,即field的数量。hlen map (integer) 2
hmset
设置多个field的value。不要忘了指定 keyhmset map key1 value1 key2 value2 OK hlen map (integer) 4
hmget
指定多个field获取多个对应的 valuehmget map key1 key2 name age 1) "value1" 2) "value2" 3) "jelly" 4) "18" hlen map (integer) 4
hdel
删除指定key下的 field和valuehdel map key1 key2 (integer) 2 hkeys map 1) "name" 2) "age"
hsetnx
, 以nx结尾的命令会有一个判断是否存在的过程,如果不存在,设置成功,否则设置失败hsetnx map name jellyb (integer) 0 hsetnx map address beijing (integer) 1
Redis数据结构:列表list
可以认为和我们java中list非常相似的一个列表,允许重复值存在
切换工作空间
select 2 keys * (empty list or set)
lpush
生成一个list,后放的元素在前面lpush list 1 2 3 4 5 6 7 8 9 9 9 0 (integer) 12 keys * list type list list llen list (integer) 12
lindex
获取指定index的valuelindex list 0 "12"
lrange
获取list指定区间的元素,如果start等于value,效果等于lindexlrange list 0 2 1) "0" 2) "9" 3) "9" lrange list 0 0 1) "0"
lset
设置list指定index的valuelset list 0 12 OK lindex list 0 1) "12"
lpop
和rpop
lpop移除list index =0位置的元素,rpop移除index=llen list -1
位置的元素先修改list元素为0 – 11 从小到大排列
lrange list 0 100 1) "12" 2) "9" 3) "9" 4) "8" ... 12) "0" lset list 0 11 OK lset list 1 10 OK lset list 2 9 OK lpop list "11" rpop list "0" lrange list 0 100 1) "10" 2) "9" ... 10) "1"
Redis数据结构:集合set
set 无序集合,可排除重复,set是使用hash实现的,查找删除元素等操作的时间复杂度都是O(1)
切换命名空间
select 3 keys * (empty list or set)
sadd
添加元素到指定key中,控制台返回每次成功添加到集合中的元素的个数,如果添加已经存在的元素,此元素不会被添加sadd set a b c d (integer) 4 keys * "set" type set set sadd set a h (integer) 1
scard
返回指定set集合的长度scard set (integer) 5
srename
重命名set集合srename set set1 OK keys * "set1"
smembers
罗列set集合中的元素,无序展示smembers set1 1)"d" 2)"c" 3)"b" 4)"h" 5)"a"
sdiff
求两个集合的差集,A-
B,比较两个set集合A与B,返回存在于A集合,并且不属于B集合的元素sadd set2 c d e f g h (integer) 6 smembers set1 1)"d" 2)"c" 3)"b" 4)"h" 5)"a" smembers set2 1)"e" 2)"g" 3)"h" 4)"d" 5)"c" 6)"f" sdiff set1 set2 1)"a" 2)"b" sdiff set2 set1 1)"g" 2)"e" 3)"f"
-
sinter
求两个集合的交集A∩
B
以上述set1,set2元素为例这里就不使用
smembers
作展示了
keys *
"set2"
"set1"
sinter set1 set2
1)"h"
2)"d"
3)"c"
-
sunion
求两个结合的并集 A∪
B
同样以上述set1,set2元素为例
```
sunion set1 set2
1)"g"
2)"e"
3)"h"
4)"a"
5)"b"
6)"d"
7)"f"
8)"c"
```
-
srandmember
返回集合中随机n
个元素
使用数据库中的set1集合作演示
srandmember set1 2
1)"a"
2)"b"
srandmember set1 3
1)"h"
2)"b"
3)"c"
-
sismember
判断给定元素是否属于当前集合
此处使用数据库中的set2集合作演示
sismember set2 c
(integer) 1
sismember set2 a
(integer) 0
-
srem
移除指定集合的一个或多个元素,空格隔开
此处使用set2集合作演示
```
srem set2 e f
(integer) 2
smembers set2
1)"g"
2)"h"
3)"d"
4)"c"
srem set2 a
(integer) 0
```
spop
移除并返回一个随机元素keys * "set1" "set2" sadd set1 x y z (integer) 3 smembers set1 1)"y" 2)"h" 3)"a" 4)"b" 5)"d" 6)"z" 7)"x" 8)"c" spop set1 "c" spop set1 "x" spop set1 "d" smembers set1 1)"y" 2)"h" 3)"a" 4)"b" 5)"z"
Redis数据结构:有序集合sortedset
有序集合sortedset也是使用hash实现的,因此它的添加查找删除操作的时间复杂度也是O(1),它是使用
分数
来保证集合元素从小到大有序排序,其中分数是可以重复的,但是元素不可以重复。因此可以保证其中的元素不重复而且有序,比较像java中的 linkdhashset
切换命名空间
select 4 keys * (empty list or set)
zadd
生成一个sortedset,并指定元素的分数zadd sortedset1 100 a 200 b 300 c 400 d (integer) 4 type sortedset1 zset rename sortedset1 sortedset OK
zcard
查看sortedset集合中元素的数量zcard sortedset (integer) 4
zscore
查看集合中指定元素的分数zscore sortedset a "100" zscore sortedset d "400"
zcount
返回分数在指定闭合区间中元素的个数zcount sortedset 0 320 (integer) 3
zrank
返回元素在集合中的索引值zrank sortedset a (integer) 0 zrank sortedset c (integer) 2 zrank sortedset d (integer) 3
zincrby
提高元素的分数,可以为负数
zincrby sortedset 1000 a "1100" zscore sortedset a "1100" zrank sortedset a (integer) 3 zrank sortedset b (integer) 0 zincrby sortedset -1 b "199"
zrange
返回索引在指定闭合区间中的元素,使用withscores
附带返回元素的分数zrange sortedset 0 100 1)"b" 2)"c" 3)"d" 4)"a" zrange sortedset 0 2 1)"b" 2)"c" 3)"d" zrange sortedset 0 3 withscores 1)"b" 2)"199" 3)"c" 4)"300" 5)"d" 6)"400" 7)"a" 8)"1100"