前言 作为Key-value型数据库,Redis也提供了键(Key)和键值(Value)的映射关系。但是,除了常规的数值或字符串 ,Redis的键值还可以是以下形式之一:
[Lists (可重复列表) ](#Lists (可重复列表) )
[Sets (不可重复集合) ](#Sets (不可重复集合))
[Sorted sets (不可重复有序集合) ](#Sorted sets (不可重复有序集合))
[Hashes (哈希表)](#Hashes (哈希表))
键值的数据类型决定了该键值支持的操作。Redis支持诸如列表、集合或有序集合的交集、并集、查集等高级原子操作;同时,如果键值的类型是普通数字,Redis则提供自增等原子操作。
strings(字符串)
string类型是二进制安全的。意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
set
设置key对应的值为string类型的value。
1 2 127.0.0.1:6379> set name wwl OK
setnx
设置key对应的值为string类型的value。如果key已经存在,返回0,nx是not exist的意思。
1 2 3 4 5 6 127.0.0.1:6379> get name "wwl" 127.0.0.1:6379> setnx name HongWan_new (integer ) 0 127.0.0.1:6379> get name "HongWan"
由于原来name有一个对应的值,所以本次的修改不生效,且返回码是0。
setex
设置key对应的值为string类型的value,并指定此键值对应的有效期。
1 2 3 4 5 6 7 8 127.0.0.1:6379> setex haircolor 10 red OK 127.0.0.1:6379> get haircolor "red" 127.0.0.1:6379> get haircolor "red" 127.0.0.1:6379> get haircolor (nil)
可见由于最后一次的调用是10秒以后了,所以取不到haicolor这个键对应的值。
setrange
设置指定key的value值的子字符串。
1 2 3 4 5 6 7 8 127.0.0.1:6379> set name 'HongWan@126.com' OK 127.0.0.1:6379> get name "HongWan@126.com" 127.0.0.1:6379> setrange name 8 gmail.com (integer ) 17 127.0.0.1:6379> get name "HongWan@gmail.com"
其中的8是指从下标为8(包含8)的字符开始替换。
mset
一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置。
1 2 3 4 5 6 127.0.0.1:6379> mset key1 HongWan1 key2 HongWan2 OK 127.0.0.1:6379> get key1 "HongWan1" 127.0.0.1:6379> get key2 "HongWan2"
msetnx
一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置,但是不会覆盖已经存在的key。
1 2 3 4 5 6 7 8 9 10 127.0.0.1:6379> get key1 "HongWan1" 127.0.0.1:6379> get key2 "HongWan2" 127.0.0.1:6379> msetnx key2 HongWan2_new key3 HongWan3 (integer ) 0 127.0.0.1:6379> get key2 "HongWan2" 127.0.0.1:6379> get key3 (nil)
可以看出如果这条命令返回0,那么里面操作都会回滚,都不会被执行。
get
获取key对应的string值,如果key不存在返回nil。
1 2 3 4 5 127.0.0.1:6379> get name "HongWan_new" redis 127.0.0.1:6379> get name1 (nil)
getset
设置key的值,并返回key的旧值。
1 2 3 4 5 6 127.0.0.1:6379> get name "HongWan" 127.0.0.1:6379> getset name HongWan_new "HongWan" 127.0.0.1:6379> get name "HongWan_new"
如果key不存在,将返回nil,并会设置新值。
1 2 3 4 redis 127.0.0.1:6379> getset name1 aaa (nil) 127.0.0.1:6379> get name1 "aaa"
getrange
获取指定key的value值的子字符串。
1 2 3 4 5 6 7 8 9 10 11 127.0.0.1:6379> get name "HongWan_new" 127.0.0.1:6379> getrange name 0 6 "HongWan" 127.0.0.1:6379> getrange name -7 -1 "Wan_new" 127.0.0.1:6379> getrange name 7 100 "_new"
mget
一次获取多个key的值,如果对应key不存在,则对应返回nil。
1 2 3 4 5 127.0.0.1:6379> mget key1 key2 key3 1) "HongWan1" 2) "HongWan2" 3) (nil)
incr
对key的值做加加操作,并返回新的值。注意incr一个不是int的value会返回错误,incr一个不存在的key,则设置key为1 。
1 2 3 4 5 6 127.0.0.1:6379> set age 20 OK 127.0.0.1:6379> incr age (integer ) 21 127.0.0.1:6379> get age "21"
incrby
同incr类似,加指定值 ,key不存在时候会设置key,并认为原来的value是 0 。
1 2 3 4 5 6 7 8 127.0.0.1:6379> get age "21" 127.0.0.1:6379> incrby age 5 (integer ) 26 127.0.0.1:6379> get name "HongWan_new" 127.0.0.1:6379> get age "26"
decr
对key的值做的是减减操作,decr一个不存在key,则设置key为-1。
1 2 3 4 5 6 127.0.0.1:6379> get age "26" 127.0.0.1:6379> decr age (integer ) 25 127.0.0.1:6379> get age "25"
decrby
同decr,减指定值。
1 2 3 4 5 6 127.0.0.1:6379> get age "25" 127.0.0.1:6379> decrby age 5 (integer ) 20 127.0.0.1:6379> get age "20"
decrby完全是为了可读性,我们完全可以通过incrby一个负值来实现同样效果,反之一样。
1 2 3 4 5 6 127.0.0.1:6379> get age "20" 127.0.0.1:6379> incrby age -5 (integer ) 15 127.0.0.1:6379> get age "15"
append
给指定key的字符串值追加value,返回新字符串值的长度。
1 2 3 4 5 6 127.0.0.1:6379> get name "HongWan_new" 127.0.0.1:6379> append name @126.com (integer ) 19 127.0.0.1:6379> get name "HongWan_new@126.com"
strlen
取指定key的value值的长度。
1 2 3 4 5 6 7 8 127.0.0.1:6379> get name "HongWan_new@126.com" 127.0.0.1:6379> strlen name (integer ) 19 127.0.0.1:6379> get age "15" 127.0.0.1:6379> strlen age (integer ) 2
Lists (可重复列表) list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作中key理解为链表的名字。
Redis的list类型其实就是一个每个子元素都是string类型的双向链表。链表的最大长度是(2^32)。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。
lpush
在key对应list的头部添加字符串元素。
1 2 3 4 5 6 7 127.0.0.1:6379> lpush mylist "world" (integer ) 1 127.0.0.1:6379> lpush mylist "hello" (integer ) 2 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "world"
在此处我们先插入了一个world,然后在world的头部插入了一个hello。其中lrange是用于获取mylist的内容。
rpush
在key对应list的尾部添加字符串元素。
1 2 3 4 5 6 7 127.0.0.1:6379> rpush mylist2 "hello" (integer ) 1 127.0.0.1:6379> rpush mylist2 "world" (integer ) 2 127.0.0.1:6379> lrange mylist2 0 -1 1) "hello" 2) "world"
在此处我们先插入了一个hello,然后在hello的尾部插入了一个world。
linsert
在key对应list的特定位置之前或之后添加字符串元素。
1 2 3 4 5 6 7 8 9 10 127.0.0.1:6379> rpush mylist3 "hello" (integer ) 1 127.0.0.1:6379> rpush mylist3 "world" (integer ) 2 127.0.0.1:6379> linsert mylist3 before "world" "there" (integer ) 3 127.0.0.1:6379> lrange mylist3 0 -1 1) "hello" 2) "there" 3) "world"
在此处我们先插入了一个hello,然后在hello的尾部插入了一个world,然后又在world的前面插入了there。
lset
设置list中指定下标的元素值(下标从0开始) 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 127.0.0.1:6379> rpush mylist4 "one" (integer ) 1 127.0.0.1:6379> rpush mylist4 "two" (integer ) 2 127.0.0.1:6379> rpush mylist4 "three" (integer ) 3 127.0.0.1:6379> lset mylist4 0 "four" OK 127.0.0.1:6379> lset mylist4 -2 "five" OK 127.0.0.1:6379> lrange mylist4 0 -1 1) "four" 2) "five" 3) "three"
在此处我们依次插入了one,two,three,然后将标是0的值设置为four,再将下标是-2的值设置为five。
lrem
从key对应list中删除count个和value相同的元素。
count>0时,按从头到尾的顺序删除。
1 2 3 4 5 6 7 8 9 10 11 12 13 127.0.0.1:6379> rpush mylist5 "hello" (integer ) 1 127.0.0.1:6379> rpush mylist5 "hello" (integer ) 2 127.0.0.1:6379> rpush mylist5 "foo" (integer ) 3 127.0.0.1:6379> rpush mylist5 "hello" (integer ) 4 127.0.0.1:6379> lrem mylist5 2 "hello" (integer ) 2 127.0.0.1:6379> lrange mylist5 0 -1 1) "foo" 2) "hello"
count<0时,按从尾到头的顺序删除。
1 2 3 4 5 6 7 8 9 10 11 12 13 127.0.0.1:6379> rpush mylist6 "hello" (integer ) 1 127.0.0.1:6379> rpush mylist6 "hello" (integer ) 2 127.0.0.1:6379> rpush mylist6 "foo" (integer ) 3 127.0.0.1:6379> rpush mylist6 "hello" (integer ) 4 127.0.0.1:6379> lrem mylist6 -2 "hello" (integer ) 2 127.0.0.1:6379> lrange mylist6 0 -1 1) "hello" 2) "foo"
count=0时,删除全部。
1 2 3 4 5 6 7 8 9 10 11 12 127.0.0.1:6379> rpush mylist7 "hello" (integer ) 1 127.0.0.1:6379> rpush mylist7 "hello" (integer ) 2 127.0.0.1:6379> rpush mylist7 "foo" (integer ) 3 127.0.0.1:6379> rpush mylist7 "hello" (integer ) 4 127.0.0.1:6379> lrem mylist7 0 "hello" (integer ) 3 127.0.0.1:6379> lrange mylist7 0 -1 1) "foo"
ltrim
保留指定key 的值范围内的数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 127.0.0.1:6379> rpush mylist8 "one" (integer ) 1 127.0.0.1:6379> rpush mylist8 "two" (integer ) 2 127.0.0.1:6379> rpush mylist8 "three" (integer ) 3 127.0.0.1:6379> rpush mylist8 "four" (integer ) 4 127.0.0.1:6379> ltrim mylist8 1 -1 OK 127.0.0.1:6379> lrange mylist8 0 -1 1) "two" 2) "three" 3) "four"
lpop
从list的头部删除元素,并返回删除元素。
1 2 3 4 5 6 7 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "world" 127.0.0.1:6379> lpop mylist "hello" 127.0.0.1:6379> lrange mylist 0 -1 1) "world"
rpop
从list的尾部删除元素,并返回删除元素。
1 2 3 4 5 6 7 127.0.0.1:6379> lrange mylist2 0 -1 1) "hello" 2) "world" 127.0.0.1:6379> rpop mylist2 "world" 127.0.0.1:6379> lrange mylist2 0 -1 1) "hello"
rpoplpush
从第一个list的尾部移除元素并添加到第二个list的头部,最后返回被移除的元素值,整个操作是原子的。如果第一个list是空或者不存在返回nil。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 127.0.0.1:6379> lrange mylist5 0 -1 1) "foo" 2) "hello" 127.0.0.1:6379> lrange mylist6 0 -1 1) "hello" 2) "foo" 127.0.0.1:6379> rpoplpush mylist5 mylist6 "hello" 127.0.0.1:6379> lrange mylist5 0 -1 1) "foo" 127.0.0.1:6379> lrange mylist6 0 -1 1) "hello" 2) "hello" 3) "foo"
lindex
返回名称为key的list中index位置的元素。
1 2 3 4 5 6 7 127.0.0.1:6379> lrange mylist5 0 -1 1) "three" 2) "foo" 127.0.0.1:6379> lindex mylist5 0 "three" 127.0.0.1:6379> lindex mylist5 1 "foo"
llen
返回key对应list的长度。
1 2 127.0.0.1:6379> llen mylist5 (integer ) 2
Sets (不可重复集合) Redis的set是string类型的无序集合。set元素最大可以包含(2^32)个元素。
set的是通过hash table实现的,所以添加、删除和查找的复杂度都是O(1)。hash table会随着添加或者删除自动的调整大小。
sadd
向名称为key的set中添加元素。
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> sadd myset "hello" (integer ) 1 127.0.0.1:6379> sadd myset "world" (integer ) 1 127.0.0.1:6379> sadd myset "world" (integer ) 0 127.0.0.1:6379> smembers myset 1) "world" 2) "hello"
本例中,我们向myset中添加了三个元素,但由于第三个元素跟第二个元素是相同的,所以第三个元素没有添加成功,最后我们用smembers来查看myset中的所有元素。
srem
删除名称为key的set中的元素member。
1 2 3 4 5 6 7 8 9 10 11 12 13 127.0.0.1:6379> sadd myset2 "one" (integer ) 1 127.0.0.1:6379> sadd myset2 "two" (integer ) 1 127.0.0.1:6379> sadd myset2 "three" (integer ) 1 127.0.0.1:6379> srem myset2 "one" (integer ) 1 127.0.0.1:6379> srem myset2 "four" (integer ) 0 127.0.0.1:6379> smembers myset2 1) "three" 2) "two"
本例中,我们向myset2中添加了三个元素后,再调用srem来删除one和four,但由于元素中没有four所以,此条srem命令执行失败。
spop
随机返回并删除名称为key的set中一个元素。
1 2 3 4 5 6 7 8 9 10 11 127.0.0.1:6379> sadd myset3 "one" (integer ) 1 127.0.0.1:6379> sadd myset3 "two" (integer ) 1 127.0.0.1:6379> sadd myset3 "three" (integer ) 1 127.0.0.1:6379> spop myset3 "two" 127.0.0.1:6379> smembers myset3 1) "three" 2) "one"
本例中,我们向myset3中添加了三个元素后,再调用spop来随机删除一个元素,可以看到three元素被删除了。
sdiff
返回所有给定key与第一个key的差集。
1 2 3 4 5 6 7 8 127.0.0.1:6379> smembers myset2 1) "three" 2) "two" 127.0.0.1:6379> smembers myset3 1) "three" 2) "one" 127.0.0.1:6379> sdiff myset2 myset3 1) "two"
本例中,我们可以看到myset2中的元素与myset3中不同的只是three,所以只有three被查出来了,而不是three和one,因为one是myset3的元素。
我们也可以将myset2和myset3换个顺序来看一下结果:
1 2 127.0.0.1:6379> sdiff myset3 myset2 1) "one"
这个结果中只显示了,myset3中的元素与myset2中不同的元素。
sdiffstore 返回所有给定key与第一个key的差集,并将结果存为另一个key。
1 2 3 4 5 6 7 8 9 10 127.0.0.1:6379> smembers myset2 1) "three" 2) "two" 127.0.0.1:6379> smembers myset3 1) "three" 2) "one" 127.0.0.1:6379> sdiffstore myset4 myset2 myset3 (integer ) 1 127.0.0.1:6379> smembers myset4 1) "two"
sinter
返回所有给定key的交集。
1 2 3 4 5 6 7 8 127.0.0.1:6379> smembers myset2 1) "three" 2) "two" 127.0.0.1:6379> smembers myset3 1) "three" 2) "one" 127.0.0.1:6379> sinter myset2 myset3 1) "three"
通过本例的结果可以看出, myset2和myset3的交集two被查出来了。
sinterstore
返回所有给定key的交集,并将结果存为另一个key。
1 2 3 4 5 6 7 8 9 10 127.0.0.1:6379> smembers myset2 1) "three" 2) "two" 127.0.0.1:6379> smembers myset3 1) "three" 2) "one" 127.0.0.1:6379> sinterstore myset5 myset2 myset3 (integer ) 1 127.0.0.1:6379> smembers myset5 1) "three"
通过本例的结果可以看出, myset2和myset3的交集被保存到myset5中了。
sunion
返回所有给定key的并集。
1 2 3 4 5 6 7 8 9 10 127.0.0.1:6379> smembers myset2 1) "three" 2) "two" 127.0.0.1:6379> smembers myset3 1) "three" 2) "one" 127.0.0.1:6379> sunion myset2 myset3 1) "three" 2) "one" 3) "two"
通过本例的结果可以看出, myset2和myset3的并集被查出来了。
sunionstore
返回所有给定key的并集,并将结果存为另一个key。
1 2 3 4 5 6 7 8 9 10 11 12 127.0.0.1:6379> smembers myset2 1) "three" 2) "two" 127.0.0.1:6379> smembers myset3 1) "three" 2) "one" 127.0.0.1:6379> sunionstore myset6 myset2 myset3 (integer ) 3 127.0.0.1:6379> smembers myset6 1) "three" 2) "one" 3) "two"
通过本例的结果可以看出, myset2和myset3的并集被保存到myset6中了。
smove
从第一个key对应的set中移除member并添加到第二个对应set中。
1 2 3 4 5 6 7 127.0.0.1:6379> smembers myset2 1) "three" 2) "two" 127.0.0.1:6379> smove myset2 myset7 three (integer ) 1 127.0.0.1:6379> smembers myset7 1) "three"
通过本例可以看到,myset2的three被移到myset7中了。
scard
返回名称为key的set的元素个数。
1 2 127.0.0.1:6379> scard myset2 (integer ) 1
sismember
测试member是否是名称为key的set的元素。
1 2 3 4 5 6 127.0.0.1:6379> smembers myset2 1) "two" 127.0.0.1:6379> sismember myset2 two (integer ) 1 127.0.0.1:6379> sismember myset2 one (integer ) 0
通过本例可以看到,two是myset2的成员,而one不是。
srandmember
随机返回名称为key的set的一个元素,但是不删除元素。
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> smembers myset3 1) "three" 2) "one" 127.0.0.1:6379> srandmember myset3 "three" 127.0.0.1:6379> srandmember myset3 "one" 127.0.0.1:6379> srandmember myset3 "one"
通过本例可以看到,第二次返回了元素”one”,但是并没有删除”one”元素。
Sorted sets (不可重复有序集合) sorted set是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列的mysql表,一列存value,一列存顺序。
和set一样sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score。sorted set的实现是skip list和hash table的混合体。
zadd
向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。
1 2 3 4 5 6 7 8 9 10 11 127.0.0.1:6379> zadd myzset 1 "one" (integer ) 1 127.0.0.1:6379> zadd myzset 2 "two" (integer ) 1 127.0.0.1:6379> zadd myzset 3 "two" (integer ) 0 127.0.0.1:6379> zrange myzset 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "3"
zrem
删除名称为key的zset中的元素member。
1 2 3 4 5 6 7 8 9 10 127.0.0.1:6379> zrange myzset 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "3" 127.0.0.1:6379> zrem myzset two (integer ) 1 127.0.0.1:6379> zrange myzset 0 -1 withscores 1) "one" 2) "1"
可以看到two被删除了。
zincrby
如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为increment。
1 2 3 4 5 6 7 8 9 10 11 127.0.0.1:6379> zadd myzset2 1 "one" (integer ) 1 127.0.0.1:6379> zadd myzset2 2 "two" (integer ) 1 127.0.0.1:6379> zincrby myzset2 2 "one" "3" 127.0.0.1:6379> zrange myzset2 0 -1 withscores 1) "two" 2) "2" 3) "one" 4) "3"
本例中将one的score从1增加了2,增加到了3。
zrank
返回名称为key的zset中member元素的排名(按score从小到大排序)即下标。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 127.0.0.1:6379> zadd myzset3 1 "one" (integer ) 1 127.0.0.1:6379> zadd myzset3 2 "two" (integer ) 1 127.0.0.1:6379> zadd myzset3 3 "three" (integer ) 1 127.0.0.1:6379> zadd myzset3 5 "five" (integer ) 1 127.0.0.1:6379> zrange myzset3 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" 7) "five" 8) "5" 127.0.0.1:6379> zrank myzset3 two (integer ) 1
zrevrank
返回名称为key的zset中member元素的排名(按score从大到小排序)即下标。
1 2 3 4 5 6 7 8 9 10 11 127.0.0.1:6379> zrange myzset3 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" 7) "five" 8) "5" 127.0.0.1:6379> zrevrank myzset3 two (integer ) 2
按从大到小排序的话two是第三个元素,下标是2。
zrevrange
返回名称为key的zset(按score从大到小排序)中的index从start到end的所有元素。
1 2 3 4 5 6 7 8 9 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores 1) "five" 2) "5" 3) "three" 4) "3" 5) "two" 6) "2" 7) "one" 8) "1"
zrangebyscore
返回集合中score在给定区间的元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 127.0.0.1:6379> zrange myzset3 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" 7) "five" 8) "5" 127.0.0.1:6379> zrangebyscore myzset3 2 3 withscores 1) "two" 2) "2" 3) "three" 4) "3"
zcount
返回集合中score在给定区间的数量。
1 2 3 4 5 6 7 8 9 10 11 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores 1) "five" 2) "5" 3) "three" 4) "3" 5) "two" 6) "2" 7) "one" 8) "1" 127.0.0.1:6379> zcount myzset3 2 3 (integer ) 2
zcard
返回集合中元素个数。
1 2 3 4 5 6 7 8 9 10 11 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores 1) "five" 2) "5" 3) "three" 4) "3" 5) "two" 6) "2" 7) "one" 8) "1" 127.0.0.1:6379> zcard myzset3 (integer ) 4
zscore
返回给定元素对应的score。
1 2 3 4 5 6 7 8 9 10 11 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores 1) "five" 2) "5" 3) "three" 4) "3" 5) "two" 6) "2" 7) "one" 8) "1" 127.0.0.1:6379> zscore myzset3 two "2"
zremrangebyrank
删除集合中排名在给定区间的元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores 1) "five" 2) "5" 3) "three" 4) "3" 5) "two" 6) "2" 7) "one" 8) "1" 127.0.0.1:6379> zremrangebyrank myzset3 3 3 (integer ) 1 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores 1) "three" 2) "3" 3) "two" 4) "2" 5) "one" 6) "1"
在本例中我们将myzset3中按从小到大排序结果的下标为3的元素删除了。
zremrangebyscore
删除集合中score在给定区间的元素。
1 2 3 4 5 6 7 8 9 10 11 12 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores 1) "three" 2) "3" 3) "two" 4) "2" 5) "one" 6) "1" 127.0.0.1:6379> zremrangebyscore myzset3 1 2 (integer ) 2 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores 1) "three" 2) "3"
在本例中我们将myzset3中按从小到大排序结果的score在1~2之间的元素删除了。
Hashes (哈希表) Redis hash是一个string类型的field和value的映射表。它的添加、删除操作都是O(1)(平均),hash特别适合用于存储对象。
相较于将对象的每个字段存成单个string类型,将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。
hset
设置hash field为指定值,如果key不存在,则先创建。
1 2 127.0.0.1:6379> hset myhash field1 Hello (integer ) 1
hsetnx
设置hash field为指定值,如果key不存在,则先创建。如果field已经存在,返回0,nx是not exist的意思。
1 2 3 4 127.0.0.1:6379> hsetnx myhash field "Hello" (integer ) 1 127.0.0.1:6379> hsetnx myhash field "Hello" (integer ) 0
第一次执行是成功的,但第二次执行相同的命令失败,原因是field已经存在了。
hmset
同时设置hash的多个field。
1 2 127.0.0.1:6379> hmset myhash field1 Hello field2 World OK
hget
获取指定的hash field。
1 2 3 4 5 6 127.0.0.1:6379> hget myhash field1 "Hello" 127.0.0.1:6379> hget myhash field2 "World" 127.0.0.1:6379> hget myhash field3 (nil)
由于数据库没有field3,所以取到的是一个空值nil。
hmget
获取全部指定的hash filed。
1 2 3 4 127.0.0.1:6379> hmget myhash field1 field2 field3 1) "Hello" 2) "World" 3) (nil)
由于数据库没有field3,所以取到的是一个空值nil。
hincrby
给指定的hash filed 加上给定值。
1 2 3 4 5 6 7 8 127.0.0.1:6379> hset myhash field3 20 (integer ) 1 127.0.0.1:6379> hget myhash field3 "20" 127.0.0.1:6379> hincrby myhash field3 -8 (integer ) 12 127.0.0.1:6379> hget myhash field3 "12"
在本例中我们将field3的值从20降到了12,即做了一个减8的操作。
hexists
测试指定field是否存在。
1 2 3 4 127.0.0.1:6379> hexists myhash field1 (integer ) 1 127.0.0.1:6379> hexists myhash field9 (integer ) 0
通过上例可以说明field1存在,但field9是不存在的。
hlen
返回指定hash的field数量。
1 2 127.0.0.1:6379> hlen myhash (integer ) 4
通过上例可以看到myhash中有4个field。
hdel
删除指定hash的指定field。
1 2 3 4 5 6 127.0.0.1:6379> hlen myhash (integer ) 4 127.0.0.1:6379> hdel myhash field1 (integer ) 1 127.0.0.1:6379> hlen myhash (integer ) 3
hkeys
返回hash的所有field。
1 2 3 4 127.0.0.1:6379> hkeys myhash 1) "field" 2) "field2" 3) "field3"
hvals
返回hash的所有value。
1 2 3 4 127.0.0.1:6379> hvals myhash 1) "Hello" 2) "World" 3) "12"
hgetall
获取某个hash中全部的filed及value。
1 2 3 4 5 6 7 127.0.0.1:6379> hgetall myhash 1) "field" 2) "Hello" 3) "field2" 4) "World" 5) "field3" 6) "12"
一下子将myhash中所有的field及对应的value都取出来了。