失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Redis(三) 支持数据类型及常用操作命令

Redis(三) 支持数据类型及常用操作命令

时间:2024-06-12 18:10:19

相关推荐

Redis(三) 支持数据类型及常用操作命令

Redis支持的数据结构及命令

第1章 支持数据结构类型

你也许已经知道Redis并不是简单的key-value存储,实际上他是一个数据结构服务器,支持不同类型的值。也就是说,你不必仅仅把字符串当作键所指向的值。下列这些数据类型都可作为值类型:

第2章 Redis常用命令

Redis命令十分丰富,包括的命令组有Cluster、Connection、Geo、Hashes、HyperLogLog、Keys、Lists、Pub/Sub、Scripting、Server、Sets、Sorted Sets、Strings、Transactions一共14个redis命令组两百多个redis命令。

2.1 针对Key的命令

2.1.1 DEL

删除给定的一个或多个key,不存在的key会被忽略。

q 删除单个key

10.0.0.16:6379>SETnameliutaoOK10.0.0.16:6379>DELname(integer)1

q 删除一个不存在的key

10.0.0.16:6379>EXISTShehe(integer)010.0.0.16:6379>DELhehe#<==失败,没有key被删除(integer)0

q 同时删除多个key

10.0.0.16:6379>SETname"redis"OK10.0.0.16:6379>SETtype"key-valuestore"OK10.0.0.16:6379>SETwebsite""OK10.0.0.16:6379>DELnametypewebsite(integer)3

2.1.2 EXISTS

检查给定key是否存在。若key存在,返回1,否则返回0。

10.0.0.16:6379>SETdb"redis"OK10.0.0.16:6379>EXISTSdb(integer)110.0.0.16:6379>DELdb(integer)110.0.0.16:6379>EXISTSdb(integer)0

2.1.3 EXPIRE

EXPIRE key seconds

为给定key设置生存时间,当key过期时(生存时间为0),它会被自动删除。在 Redis 中,带有生存时间的key被称为『易失的』(volatile)。使用PERSIST命令可以在不删除key的情况下,移除key的生存时间,让key重新成为一个『持久的』(persistent)key。

10.0.0.16:6379>SETcache_page""OK10.0.0.16:6379>EXPIREcache_page30(integer)110.0.0.16:6379>TTLcache_page(integer)2610.0.0.16:6379>EXPIREcache_page3000(integer)110.0.0.16:6379>TTLcache_page(integer)299910.0.0.16:6379>PERSISTcache_page(integer)110.0.0.16:6379>TTLcache_page(integer)-1

2.1.4 KEYS

KEYS pattern,查询符合给定模式pattern的key。

KEYS * :匹配数据库中所有的key;

KEYS h?llo:匹配hello,hallo和hxllo等。

KEYSh*llo:匹配hllo和heeeeello等。

KEYSh[ae]llo:匹配hello和hallo,但不匹配hillo。

注:KEYS的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的key,你最好还是用 Redis 的集合结构(set)来代替。

10.0.0.16:6379>MSETone1two2three3four4OK10.0.0.16:6379>KEYS*o*1)"four"2)"two"3)"one"10.0.0.16:6379>KEYSt??1)"two"10.0.0.16:6379>KEYSt????1)"three"10.0.0.16:6379>KEYSt[w]*1)"two"10.0.0.16:6379>KEYS*1)"three"2)"four"3)"two"4)"one"5)"greeting"6)"cache_page"

2.1.5 MIGRATE

MIGRATE host port key destination-db timeout [COPY] [REPLACE]

将key原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功,key保证会出现在目标实例上,而当前实例上的key会被删除。这个命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等待超时。

命令的内部实现是这样的:它在当前实例对给定key执行DUMP命令 ,将它序列化,然后传送到目标实例,目标实例再使用RESTORE对数据进行反序列化,并将反序列化所得的数据添加到数据库中;当前实例就像目标实例的客户端那样,只要看到RESTORE命令返回OK,它就会调用DEL删除自己数据库上的key。

timeout参数以毫秒为格式,指定当前实例和目标实例进行沟通的最大间隔时间。这说明操作并不一定要在timeout毫秒内完成,只是说数据传送的时间不能超过这个timeout数。

MIGRATE命令需要在给定的时间规定内完成 IO 操作。如果在传送数据时发生 IO 错误,或者达到了超时时间,那么命令会停止执行,并返回一个特殊的错误:IOERR。当IOERR出现时,有以下两种可能:

1)key可能存在于两个实例

2)key可能只存在于当前实例

唯一不可能发生的情况就是丢失key,因此,如果一个客户端执行MIGRATE命令,并且不幸遇上IOERR错误,那么这个客户端唯一要做的就是检查自己数据库上的key是否已经被正确地删除。如果有其他错误发生,那么MIGRATE保证key只会出现在当前实例中。(当然,目标实例的给定数据库上可能有和key同名的键,不过这和MIGRATE命令没有关系)。

可选项:

COPY:不移除源实例上的key。

REPLACE:替换目标实例上已存在的key。

在10.0.0.16上操作:

10.0.0.16:6379>flushdbOK10.0.0.16:6379>keys*(emptylistorset)10.0.0.16:6379>clear10.0.0.16:6379>SETgreeting"Hellpfrom10.0.0.166379instance"OK10.0.0.16:6379>MIGRATE10.0.0.116379greeting01000OK10.0.0.16:6379>EXISTSgreeting(integer)0

在10.0.0.11上操作:

10.0.0.11:6379>keys*1)"greeting"10.0.0.11:6379>getgreeting"Hellpfrom10.0.0.166379instance"

2.1.6 TYPE

返回key所存储的值的类型

返回值:

none(key不存在)

string(字符串)

list(列表)

set(集合)

zset(有序集)

hash(哈希表)

10.0.0.16:6379>SETweather"sunny"OK10.0.0.16:6379>TYPEweatherstring10.0.0.16:6379>LPUSHbook_list"programminginscala"(integer)110.0.0.16:6379>TYPEbook_listlist10.0.0.16:6379>SADDpat"dog"(integer)110.0.0.16:6379>TYPEpatset

2.2 针对String

2.2.1 APPEND

如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值的末尾。

如果key不存在,APPEND就简单地将给定key设为value,就像执行SETkeyvalue一样。

10.0.0.16:6379>EXISTSmyphone(integer)010.0.0.16:6379>APPENDmyphone"nokia"(integer)510.0.0.16:6379>APPENDmyphone"-1110"(integer)1110.0.0.16:6379>GETmyphone"nokia-1110"

2.2.2 DECR

DECR key

将key中储存的数字值减一。

如果key不存在,那么key的值会先被初始化为0,然后再执行DECR操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

10.0.0.16:6379>SETfailure_times10OK10.0.0.16:6379>DECRfailure_times(integer)910.0.0.16:6379>DECRfailure_times(integer)810.0.0.16:6379>EXISTScount(integer)010.0.0.16:6379>DECRcount(integer)-110.0.0.16:6379>setcompanyYOUR_CODE_SUCKS.LICOK10.0.0.16:6379>DECRcompany(error)ERRvalueisnotanintegeroroutofrange

2.2.3 DECRBY

DECR key decrement

将key中储存的数字值减去减量decrement。

如果key不存在,那么key的值会先被初始化为0,然后再执行DECRBY操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

10.0.0.16:6379>SETcount100OK10.0.0.16:6379>DECRBYcount20(integer)8010.0.0.16:6379>EXISTSpages(integer)010.0.0.16:6379>DECRBYpages10(integer)-10

2.2.4 GET

GET key

返回key所关联的字符串值。

如果key不存在那么返回特殊值nil。

假如key储存的值不是字符串类型,返回一个错误,因为GET只能用于处理字符串值。

10.0.0.16:6379>GETdb(nil)10.0.0.16:6379>SETdbredisOK10.0.0.16:6379>GETdb"redis"10.0.0.16:6379>DELdb(integer)110.0.0.16:6379>LPUSHdbredismongdbmysql(integer)310.0.0.16:6379>GETdb(error)WRONGTYPEOperationagainstakeyholdingthewrongkindofvalue

2.2.5 GETRANGE

GETRANGE key start end

返回key中字符串值的子字符串,字符串的截取范围由start和end两个偏移量决定(包括start和end在内)。

负数偏移量表示从字符串最后开始计数,-1表示最后一个字符,-2表示倒数第二个,以此类推。

GETRANGE通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。

10.0.0.16:6379>SETgreeting"hello,myfriend"OK10.0.0.16:6379>GETRANGEgreeting04"hello"10.0.0.16:6379>GETRANGEgreeting-1-5#<==不支持回绕操作""10.0.0.16:6379>GETRANGEgreeting-5-1"riend"10.0.0.16:6379>GETRANGEgreeting0-1"hello,myfriend"

2.2.6 INCR

INCR key

将key中储存的数字值增一。

如果key不存在,那么key的值会先被初始化为0,然后再执行INCR操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

10.0.0.16:6379>SETpage_view20OK10.0.0.16:6379>INCRpage_view(integer)2110.0.0.16:6379>INCRpage_view(integer)2210.0.0.16:6379>GETpage_view"22"

2.2.7 INCRBY

INCRBY key increment

将key所储存的值加上增量increment。

如果key不存在,那么key的值会先被初始化为0,然后再执行INCRBY命令。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

10.0.0.16:6379>SETrank50OK10.0.0.16:6379>INCRBYrank20(integer)7010.0.0.16:6379>GETrank"70"10.0.0.16:6379>EXISTScounter(integer)010.0.0.16:6379>INCRBYcounter20(integer).0.0.16:6379>GETcounter"20"10.0.0.16:6379>SETbook"longlongago..."OK10.0.0.16:6379>INCRBYbook20(error)ERRvalueisnotanintegeroroutofrange

2.2.8 MGET

MGET key [key ...]

返回所有(一个或多个)给定key的值。

如果给定的key里面,有某个key不存在,那么这个key返回特殊值nil。因此,该命令永不失败。

10.0.0.16:6379>OK10.0.0.16:6379>OK10.0.0.16:6379>MGETredismongodb1)""2)""10.0.0.16:6379>MGETredismongodbmysql1)""2)""3)(nil)

2.2.9 MSET

MSET key value [key value ...]

同时设置一个或多个key-value对。

如果某个给定key已经存在,那么MSET会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用MSETNX命令:它只会在所有给定key都不存在的情况下进行设置操作。

MSET是一个原子性(atomic)操作,所有给定key都会在同一时间内被设置,某些给定key被更新而另一些给定key没有改变的情况,不可能发生。

10.0.0.16:6379>MSETdate".3.30"time"11:00a.m."weather"sunny"OK10.0.0.16:6379>MGETdatetimeweather1)".3.30"2)"11:00a.m."3)"sunny"10.0.0.16:6379>SETgoogle"google.hk"OK10.0.0.16:6379>MSETgoogle""OK10.0.0.16:6379>GETgoogle""

2.2.10 STRING

STRLEN key

返回key所储存的字符串值的长度。

当key储存的不是字符串值时,返回一个错误。

10.0.0.16:6379>SETmykey"HelloWorld"OK10.0.0.16:6379>STRLENmykey(integer)1110.0.0.16:6379>STRLENnonexisting(integer)0

2.3 针对Hash

2.3.1 HDEL

HDEL key field [field ...]

删除哈希表key中的一个或多个指定域,不存在的域将被忽略。

10.0.0.16:6379>HMSETabbraapplebbananaccatddogOK10.0.0.16:6379>HGETALLabbr1)"a"2)"apple"3)"b"4)"banana"5)"c"6)"cat"7)"d"8)"dog"10.0.0.16:6379>HDELabbra(integer)110.0.0.16:6379>HDELabbrnot-exists-field(integer)010.0.0.16:6379>HDELabbrbc(integer)210.0.0.16:6379>HGETALLabbr1)"d"2)"dog"

2.3.2 HEXISTS

HEXISTS key field

查看哈希表key中,给定域field是否存在。

10.0.0.16:6379>HEXISTSphonemyphone(integer)010.0.0.16:6379>HSETphonemyphonenokia-1110(integer)110.0.0.16:6379>HEXISTSphonemyphone(integer)1

2.3.3 HGET

HGET key field

返回哈希表key中给定域field的值。

10.0.0.16:6379>(integer)110.0.0.16:6379>HGETsiteredis""10.0.0.16:6379>HGETsitemysql(nil)

2.3.4 HGETALL

HGETALL key

返回哈希表key中,所有的域和值。

在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。

10.0.0.16:6379>HMSETpeoplejacak"JackSparrow"gump"ForrestGump"OK10.0.0.16:6379>HGETALLpeople1)"jacak"2)"JackSparrow"3)"gump"4)"ForrestGump"

2.3.5 HINCRBY

HINCRBY key field increment

为哈希表key中的域field的值加上增量increment。

增量也可以为负数,相当于对给定域进行减法操作。

如果key不存在,一个新的哈希表被创建并执行HINCRBY命令。

如果域field不存在,那么在执行命令前,域的值被初始化为0。

对一个储存字符串值的域field执行HINCRBY命令将造成一个错误。

本操作的值被限制在 64 位(bit)有符号数字表示之内。

#increment为正数redis>HEXISTScounterpage_view#对空域进行设置(integer)0redis>HINCRBYcounterpage_view200(integer)200redis>HGETcounterpage_view"200"#increment为负数redis>HGETcounterpage_view"200"redis>HINCRBYcounterpage_view-50(integer)150redis>HGETcounterpage_view"150"#尝试对字符串值的域执行HINCRBY命令redis>HSETmyhashstringhello,world#设定一个字符串值(integer)1redis>HGETmyhashstring"hello,world"redis>HINCRBYmyhashstring1#命令执行失败,错误。(error)ERRhashvalueisnotanintegerredis>HGETmyhashstring#原值不变"hello,world"

2.3.6 HKEYS

HKEYS key

返回哈希表key中的所有域。

#哈希表非空redis>OKredis>HKEYSwebsite1)"google"2)"yahoo"#空哈希表/key不存在redis>EXISTSfake_key(integer)0redis>HKEYSfake_key(emptylistorset)

2.3.7 HMGET

HMGET key field [field ...]

返回哈希表key中,一个或多个给定域的值。

如果给定的域不存在于哈希表,那么返回一个nil值。

因为不存在的key被当作一个空哈希表来处理,所以对一个不存在的key进行HMGET操作将返回一个只带有nil值的表。

redis>HMSETpetdog"doudou"cat"nounou"#一次设置多个域OKredis>HMGETpetdogcatfake_pet#返回值的顺序和传入参数的顺序一样1)"doudou"2)"nounou"3)(nil)#不存在的域返回nil值

2.3.8 HMSET

HMSET key field value [field value ...]

同时将多个field-value(域-值)对设置到哈希表key中。

此命令会覆盖哈希表中已存在的域。

如果key不存在,一个空哈希表被创建并执行HMSET操作。

redis>OKredis>HGETwebsitegoogle""redis>

2.3.9 HSET

HSET key field value

将哈希表key中的域field的值设为value。

如果key不存在,一个新的哈希表被创建并进行HSET操作。

如果域field已经存在于哈希表中,旧值将被覆盖。

redis>HSETwebsitegoogle""#设置一个新域(integer)1redis>HSETwebsitegoogle""#覆盖一个旧域(integer)0

2.3.10 HVALS

HVALS key

返回哈希表key中所有域的值。

#非空哈希表redis>OKredis>HVALSwebsite1)""2)""#空哈希表/不存在的keyredis>EXISTSnot_exists(integer)0redis>HVALSnot_exists(emptylistorset)

2.4 针对List

2.4.1 LINDEX

LINDEX key index

返回列表key中,下标为index的元素。

下标(index)参数start和stop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。

你也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。

如果key不是列表类型,返回一个错误。

redis>LPUSHmylist"World"(integer)1redis>LPUSHmylist"Hello"(integer)2redis>LINDEXmylist0"Hello"redis>LINDEXmylist-1"World"redis>LINDEXmylist3#index不在mylist的区间范围内(nil)

2.4.2 LINSERT

LINSERT key BEFORE|AFTER pivot value

将值value插入到列表key当中,位于值pivot之前或之后。

当pivot不存在于列表key时,不执行任何操作。

当key不存在时,key被视为空列表,不执行任何操作。

如果key不是列表类型,返回一个错误。

redis>RPUSHmylist"Hello"(integer)1redis>RPUSHmylist"World"(integer)2redis>LINSERTmylistBEFORE"World""There"(integer)3redis>LRANGEmylist0-11)"Hello"2)"There"3)"World"#对一个非空列表插入,查找一个不存在的pivotredis>LINSERTmylistBEFORE"go""let's"(integer)-1#失败#对一个空列表执行LINSERT命令redis>EXISTSfake_list(integer)0redis>LINSERTfake_listBEFORE"nono""gogogog"(integer)0#失败

2.4.3 LPOP

LPOP key

移除并返回列表key的头元素。

redis>LLENcourse(integer)0redis>RPUSHcoursealgorithm001(integer)1redis>RPUSHcoursec++101(integer)2redis>LPOPcourse#移除头元素"algorithm001"

2.4.4 LPUSH

LPUSH key value [value ...]

将一个或多个值value插入到列表key的表头

如果有多个value值,那么各个value值按从左到右的顺序依次插入到表头: 比如说,对空列表mylist执行命令LPUSHmylistabc,列表的值将是cba,这等同于原子性地执行LPUSHmylista、LPUSHmylistb和LPUSHmylistc三个命令。

如果key不存在,一个空列表会被创建并执行LPUSH操作。

当key存在但不是列表类型时,返回一个错误。

#加入单个元素redis>LPUSHlanguagespython(integer)1#加入重复元素redis>LPUSHlanguagespython(integer)2redis>LRANGElanguages0-1#列表允许重复元素1)"python"2)"python"#加入多个元素redis>LPUSHmylistabc(integer)3redis>LRANGEmylist0-11)"c"2)"b"3)"a"

2.4.5 RPOP

RPOP key

移除并返回列表key的尾元素。

redis>RPUSHmylist"one"(integer)1redis>RPUSHmylist"two"(integer)2redis>RPUSHmylist"three"(integer)3redis>RPOPmylist#返回被弹出的元素"three"redis>LRANGEmylist0-1#列表剩下的元素1)"one"2)"two"

2.4.6 RPUSH

RPUSH key value [value ...]

将一个或多个值value插入到列表key的表尾(最右边)。

如果有多个value值,那么各个value值按从左到右的顺序依次插入到表尾:比如对一个空列表mylist执行RPUSHmylistabc,得出的结果列表为abc,等同于执行命令RPUSHmylista、RPUSHmylistb、RPUSHmylistc。

如果key不存在,一个空列表会被创建并执行RPUSH操作。

当key存在但不是列表类型时,返回一个错误。

#添加单个元素redis>RPUSHlanguagesc(integer)1#添加重复元素redis>RPUSHlanguagesc(integer)2redis>LRANGElanguages0-1#列表允许重复元素1)"c"2)"c"#添加多个元素redis>RPUSHmylistabc(integer)3redis>LRANGEmylist0-11)"a"2)"b"3)"c"

2.5 针对SET

2.5.1 SADD

SADD key member [member ...]

将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略。

假如key不存在,则创建一个只包含member元素作成员的集合。

当key不是集合类型时,返回一个错误。

#添加单个元素redis>SADDbbs""(integer)1#添加重复元素redis>SADDbbs""(integer)0#添加多个元素redis>SADDbbs""""(integer)2redis>SMEMBERSbbs1)""2)""3)""

2.5.2 SCARD

SCARD key

返回集合key的基数(集合中元素的数量)。

redis>SADDtoolpcprinterphone(integer)3redis>SCARDtool#非空集合(integer)3redis>DELtool(integer)1redis>SCARDtool#空集合(integer)0

2.5.3 SDIFF

SDIFF key [key ...]

返回一个集合的全部成员,该集合是所有给定集合之间的差集。

不存在的key被视为空集。

redis>SMEMBERSpeter's_movies1)"betman"2)"startwar"3)""redis>SMEMBERSjoe's_movies1)"hi,lady"2)"FastFive"3)""redis>SDIFFpeter's_moviesjoe's_movies1)"betman"2)"startwar"

2.5.4 SISMEMBER

SISMEMBER key member

判断member元素是否集合key的成员。

如果member元素是集合的成员,返回1。

如果member元素不是集合的成员,或key不存在,返回0。

redis>SMEMBERSjoe's_movies1)"hi,lady"2)"FastFive"3)""redis>SISMEMBERjoe's_movies"betman"(integer)0redis>SISMEMBERjoe's_movies"FastFive"(integer)1

2.5.5 SMEMBERS

SMEMBERS key

返回集合key中的所有成员。

不存在的key被视为空集合。

#key不存在或集合为空redis>EXISTSnot_exists_key(integer)0redis>SMEMBERSnot_exists_key(emptylistorset)#非空集合redis>SADDlanguageRubyPythonClojure(integer)3redis>SMEMBERSlanguage1)"Python"2)"Ruby"3)"Clojure"

2.5.6 SMOVE

SMOVE source destination member

将member元素从source集合移动到destination集合。

SMOVE是原子性操作。

如果source集合不存在或不包含指定的member元素,则SMOVE命令不执行任何操作,仅返回0。否则,member元素从source集合中被移除,并添加到destination集合中去。

当destination集合已经包含member元素时,SMOVE命令只是简单地将source集合中的member元素删除。

当source或destination不是集合类型时,返回一个错误。

redis>SMEMBERSsongs1)"BillieJean"2)"BelieveMe"redis>SMEMBERSmy_songs(emptylistorset)redis>SMOVEsongsmy_songs"BelieveMe"(integer)1redis>SMEMBERSsongs1)"BillieJean"redis>SMEMBERSmy_songs1)"BelieveMe"

2.5.7 SREM

SREM key member [member ...]

移除集合key中的一个或多个member元素,不存在的member元素会被忽略。

当key不是集合类型,返回一个错误。

#测试数据redis>SMEMBERSlanguages1)"c"2)"lisp"3)"python"4)"ruby"#移除单个元素redis>SREMlanguagesruby(integer)1#移除不存在元素redis>SREMlanguagesnon-exists-language(integer)0#移除多个元素redis>SREMlanguageslisppythonc(integer)3redis>SMEMBERSlanguages(emptylistorset)

2.5.8 SUNION

SUNION key [key ...]

返回一个集合的全部成员,该集合是所有给定集合的并集。

不存在的key被视为空集。

redis>SMEMBERSsongs1)"BillieJean"redis>SMEMBERSmy_songs1)"BelieveMe"redis>SUNIONsongsmy_songs1)"BillieJean"2)"BelieveMe"

详细命令列表请查看官方帮助文档:https://redis.io/commands

如果觉得《Redis(三) 支持数据类型及常用操作命令》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。