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的末尾,控制台输出当前key执行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和mgetmset可以设置多个k-vmset 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当且仅当前的key不存在时才会设置value成功,否则,如果key存在,则设置不成功。nx = not exist的缩写,此为setnx与set的区别。set a a get a "a" setnx a newvalue (integer) 0 setnx newkey newvalue (integer) 1 get newkey "newvalue" -
msetnxsetnx命令的拓展,批量操作多个key,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操作,只设置
key,value即可。hash除了需要设置key,value之外,还有一个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获取当前hashkey的所有field。hkeys map 1) "name" 2) "age" -
hvals获取当前hash的所有value。hvals map "jelly" "18" -
hlen获取当前key的长度,即field的数量。hlen map (integer) 2 -
hmset设置多个field的value,不要忘了指定key。hmset 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和rpoplpop移除listindex =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"
以上只是
redis常用数据结构的几种常用命令,更多常用命令可以使用redis-cli进入交互界面然后使用tab补全redis命令,来学习这五种数据机构。