前言

作为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。

127.0.0.1:6379> set name wwl
OK

setnx

设置key对应的值为string类型的value。如果key已经存在,返回0,nx是not exist的意思。

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,并指定此键值对应的有效期。

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值的子字符串。

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表示没有任何值被设置。

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。

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。

127.0.0.1:6379> get name
"HongWan_new"
## 我们获取一个库中不存在的键name1,那么它会返回一个nil以表时无此键值对
redis 127.0.0.1:6379> get name1
(nil)

getset

设置key的值,并返回key的旧值。

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,并会设置新值。

redis 127.0.0.1:6379> getset name1 aaa
(nil)
127.0.0.1:6379> get name1
"aaa"

getrange

获取指定key的value值的子字符串。

127.0.0.1:6379> get name
"HongWan_new"
127.0.0.1:6379> getrange name 0 6
"HongWan"
## 字符串左面下标是从0开始的
127.0.0.1:6379> getrange name -7 -1
"Wan_new"
## 字符串右面下标是从-1开始的
127.0.0.1:6379> getrange name 7 100
"_new"
## 当下标超出字符串长度时,将默认为是同方向的最大下标

mget

一次获取多个key的值,如果对应key不存在,则对应返回nil。

127.0.0.1:6379> mget key1 key2 key3
1) "HongWan1"
2) "HongWan2"
3) (nil)
## key3由于没有这个键定义,所以返回nil。

incr

对key的值做加加操作,并返回新的值。注意incr一个不是int的value会返回错误,incr一个不存在的key,则设置key为1 。

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 。

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。

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,减指定值。

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一个负值来实现同样效果,反之一样。

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,返回新字符串值的长度。

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值的长度。

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的头部添加字符串元素。

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的尾部添加字符串元素。

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的特定位置之前或之后添加字符串元素。

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开始) 。

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时,按从头到尾的顺序删除。

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时,按从尾到头的顺序删除。

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时,删除全部。

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 的值范围内的数据。

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的头部删除元素,并返回删除元素。

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的尾部删除元素,并返回删除元素。

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。

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位置的元素。

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的长度。

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中添加元素。

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。

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中一个元素。

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的差集。

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换个顺序来看一下结果:

127.0.0.1:6379> sdiff myset3 myset2
1) "one"

这个结果中只显示了,myset3中的元素与myset2中不同的元素。

sdiffstore

返回所有给定key与第一个key的差集,并将结果存为另一个key。

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的交集。

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。

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的并集。

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。

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中。

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的元素个数。

127.0.0.1:6379> scard myset2
(integer) 1

sismember

测试member是否是名称为key的set的元素。

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的一个元素,但是不删除元素。

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更新该元素的顺序。

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。

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。

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从小到大排序)即下标。

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从大到小排序)即下标。

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的所有元素。

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在给定区间的元素。

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在给定区间的数量。

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

返回集合中元素个数。

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。

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

删除集合中排名在给定区间的元素。

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在给定区间的元素。

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不存在,则先创建。

127.0.0.1:6379> hset myhash field1 Hello
(integer) 1

hsetnx

设置hash field为指定值,如果key不存在,则先创建。如果field已经存在,返回0,nx是not exist的意思。

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。

127.0.0.1:6379> hmset myhash field1 Hello field2 World
OK

hget

获取指定的hash field。

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。

127.0.0.1:6379> hmget myhash field1 field2 field3
1) "Hello"
2) "World"
3) (nil)

由于数据库没有field3,所以取到的是一个空值nil。

hincrby

给指定的hash filed 加上给定值。

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是否存在。

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数量。

127.0.0.1:6379> hlen myhash
(integer) 4

通过上例可以看到myhash中有4个field。

hdel

删除指定hash的指定field。

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。

127.0.0.1:6379>  hkeys myhash
1) "field"
2) "field2"
3) "field3"

hvals

返回hash的所有value。

127.0.0.1:6379> hvals myhash
1) "Hello"
2) "World"
3) "12"

hgetall

获取某个hash中全部的filed及value。

127.0.0.1:6379> hgetall myhash
1) "field"
2) "Hello"
3) "field2"
4) "World"
5) "field3"
6) "12"

一下子将myhash中所有的field及对应的value都取出来了。

Redis 数据类型及操作的更多相关文章

  1. 缓存数据库-redis数据类型和操作(list)

    转: 狼来的日子里! 奋发博取 缓存数据库-redis数据类型和操作(list) 一:Redis 列表(List) Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列表的头部( ...

  2. Redis数据类型及其操作

    redis数据类型即操作 1. 字符串 set 设置字符串 格式: set key value 例子: set name kainhuck get 获取字符串的值 格式: get key 例子: ge ...

  3. Redis数据类型和操作

    <"Java技术员"成长手册>,包含框架.存储.搜索.优化.分布式等必备知识,都收集在GitHub JavaEgg ,N线互联网开发必备技能兵器谱,欢迎指导 Redis ...

  4. 缓存数据库-redis数据类型和操作(string)

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合) 一:String(字符串) string是redis ...

  5. Redis数据类型及操作详解

    Redis数据库,是nosql的一种.与传统关系型数据库(如mysql.sqlserver等)相比,他在处理大数据量上相当有优势,扩展性和可用性高,这是传统型数据库所达不到的. Redis是一个key ...

  6. 缓存数据库-redis数据类型和操作(sorted set)

    一:Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是 ...

  7. 缓存数据库-redis数据类型和操作(set)

    一:Redis 集合(Set) Redis的Set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复 ...

  8. 缓存数据库-redis数据类型和操作(hash)

    一:Redis 哈希(Hash) Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. Redis 中每个 hash 可以存储 232 - 1 ...

  9. Redis入门教程:特性及数据类型的操作

    虽然Redis已经很火了,相信还是有很多同学对Redis只是有所听闻或者了解并不全面,下面是一个比较系统的Redis介绍,对Redis的特性及各种数据类型及操作进行了介绍.是一个很不错的Redis入门 ...

随机推荐

  1. xdebug插件攻击

    title: xdebug插件攻击 date: 2017-09-30 17:08:38 tags: 前一阵突然看到一个有关于xdebug的一个攻击面,不得不说这个想法还是很有意思的.自己搭环境记录一下 ...

  2. php面试笔记(3)-php基础知识-运算符

    本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 在面试中,考官往往喜欢基础扎实的面试者,而运算符相关的考 ...

  3. 兄弟连 企业shell笔试题 16-31

    企业实践题16:企业案例:写网络服务独立进程模式下rsync的系统启动脚本 例如:/etc/init.d/rsyncd{start|stop|restart} .要求:1.要使用系统函数库技巧.2.要 ...

  4. 在React中使用WebUploader实现大文件分片上传的踩坑日记!

    前段时间公司项目有个大文件分片上传的需求,项目是用React写的,大文件分片上传这个功能使用了WebUploader这个组件. 具体交互是: 1. 点击上传文件button后出现弹窗,弹窗内有选择文件 ...

  5. 剖析Java OutOfMemoryError异常

    剖析Java OutOfMemoryError异常 在JVM中,除了程序计数器外,虚拟机内存中的其他几个运行时区域都有发生OutOfMemoryError异常的可能,本篇就来深入剖析一下各个区域出现O ...

  6. css3新增边框、阴影、边框、背景、文本、字体

    css3和css有什么区别?简单来讲css3是css(层叠样式表)技术的升级版本,css3新特征有很多,例如圆角效果.图形化边界.块阴影与文字阴影.使用RGBA实现透明效果.渐变效果.使用@Font- ...

  7. 13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用

    1.ListView ListView 是 Android 系统为我们提供的一种列表显示的一种控件,使用它可以用来显示我们常见的列表形式.继承自抽象类 AdapterView.继承图如下所示: 以微信 ...

  8. MySQL导出数据时提示文件损坏

    使用Navicat工具,优先将整个数据库的表和数据导出. 如果遇到文件损坏错误可以在表实例界面选中所有表,然后将表转储为SQL文件(结构和数据). 在目标数据库执行导出的SQL文件,导入结构和数据. ...

  9. mysql中EXPLAIN 的作用

    (一)id列: (1).id 相同执行顺序由上到下 mysql> explain -> SELECT*FROM tb_order tb1 -> LEFT JOIN tb_produc ...

  10. vuex学习详细解(主页目录

    学习vuex过程中,通过 vue-cli命令来配置和使用vuex笔记整理 vue-cli中配置vuex流程和注意事项 vuex目录配置 vuex的states.js vuex的getters.js v ...