前言

作为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. windows系统快速安装pytorch的详细教程

    pip和conda的区别 之前一直使用conda和pip ,有时候经常会两者混用.但是今天才发现二者装的东西不是在一个地方的,所以发现有的东西自己装了,但是在运行环境的时候发现包老是识别不了,一直都特 ...

  2. 2018icpc南京网络赛-L Magical Girl Haze (分层图最短路)

    题意: 有向图,可以把k条路的长度变为0,求1到n的最短路 思路: 将图复制k份,一共k+1层图,对于每一条i→j,都连一条低层的i→高层的j,并且权值为0 即对每一对<i,j,w>,都加 ...

  3. 《Python学习手册 第五版》 -第1章 问答环节

    第一章的主要内容是解疑答惑的,这个部分也是很适合初学者的,回答了大部分初学者所关注的问题 1.为什么使用Python,或者说Python的优点, 作者是分为两个部分来谈的,人们使用中的经验总结以及Py ...

  4. 1. 学习Linux操作系统

    1.熟练使用Linux命令行(鸟哥的Linux私房菜.Linux系统管理技术手册) 2.学会Linux程序设计(UNIX环境高级编程) 3.了解Linux内核机制(深入理解LINUX内核) 4.阅读L ...

  5. eclipse里新建work set,将项目分组放在不同文件夹

    想必大家的Eclipse里也会有这么多得工程...... 每次工作使用到的项目肯定不会太多...... 每次从这么大数量的工程当中找到自己要使用的, 必须大规模的滚动滚动条......有点不和谐了. ...

  6. Cacti 邮件 报警

    一.使用cacti发一封测试邮件   1.使用第三方SMTP 访问 到达  设置——Mail 选项 设置如下: 1处填写收件箱地址 2.处填写发件箱地址 3.处填写smtp服务器地址 4处填写发件箱用 ...

  7. Vlan 间路由的方法

    vlan间路由的方法主要有三种 1.通过路由器上多个接口实现 2.通过路由器上一个接口即单臂路由实现 3.通过三层交换实现   下面将每一中实现方法配合实验说明     第一:通过路由器上多个接口实现 ...

  8. CoachAI 2019年12月~2020年3月实习总结

    CoachAI 2019年12月~2020年3月实习总结 一句话总结: 方向对口,大有所得. CoachAI公司简介   CoachAI是一家做在线健身的公司,目前在手机端和IOS端都有自己的服务,并 ...

  9. 显示二维码-智能TFT模块

    应用范例: 使用 TOPWAY Smart LCD (HMT050CC-C) 显示二维码 第一步 建立工程 ① 开 Editor 软件, 点击菜单栏建立新工程File --> New Proje ...

  10. 我不知道的js(一)作用域与闭包

    作用域与闭包 作用域 什么是作用域 作用域就是一套规则,它负责解决(1)将变量存在哪儿?(2)如何找到变量?的问题 作用域工作的前提 谁赋予了作用域的权利?--js引擎 传统编译语言编译的过程 分词/ ...