Redis所支持的数据结构

数据结构类型

Value可以作为

读写操作

String

字符串、整数和浮点数

读写整个或部分字符串,对整数/浮点数递增/递减

List

字符串链表

对链表两端执行push/pop操作,读一项或多项字符串,按照值查找或删除某个字符串

Hash

无序的key到value的hashtable

插入、删除和读取某项,读写整个hashtable

Set

无序的字符串集合,字符串不能重复

插入、删除和读取某个字符串,查看某个字符串是否属于集合,对集合执行归、并、差操作

Zset

字符串集合,每个字符串映射到一个浮点数分数,按分数排序

插入、删除和读取某项,根据分数范围读取

  1. String

String可以保存二进制字节的序列。通常在Redis的String用来存储三种类型的值

二进制序列的字符串

整型数据

浮点数据

  1. String作为字符串

在Redis中,String作为字符串时,和其他key-value系统中见到的是类似的。对于一个String,我们可以GET、SET及DEL其value。

命令/Command

例子及描述

GET

GET key 读取此key对应的value

SET

SET key newvalue 设置此key对应的value

除了能够GET、SET、DEL String的value,还有其他命令用于读写的String的命令,具体如下:

命令/Command

例子及描述

APPEND

APPEND key value 如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值的末尾。如果key不存在,APPEND就简单的将给定的key设为value,就像执行SET key value一样

GETRANGE

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

SETRANGE

SETRANGE key offset value 用value参数覆写(overwrite)给定key所存储得字符串值,从偏移量offset开始

不存在的key当作空白字符串处理

SETRANGE命令会确保字符串足够长以便将value设置在指定的偏移量上,如果给定的key原来存储的字符串长度比偏移量小(比如字符串只有5个字符长,但你设置的offset是10),那么原字符和偏移量之间的空白将用零字节(\x00)来填充

EXISTS

EXISTS key 判断key是否存在,如果存在返回1,否则返回0

 

 

 

  1. String作为整数或浮点数

String作为整数或浮点数时,可以递增或递减任意数值(在递增或递减之后,如有必要,整数转换成浮点数)。Redis这种将String作为整数和浮点数的能力,使它比只允许表示为字符串值提供了更多的灵活性。

命令/Command

例子及描述

INCRBY

INCRBY key amount 将key所对应的value增大amount

DECRBY

DECRBY key amout 将key所对应的value减小amount

INCRBYFLOAT

INCRBYFLOAT key amount 将key所对应的value增大amount,amount可以作为浮点数

使用APPEND和SETRANGE等方法,我们可以使用String存储某些类型的序列,但我们对这个序列只有非常有限的操作方法,而且不太方便。所幸Redis提供了List这种数据结构,并且提供了更广泛的命令和方法。

  1. List

Redis在key-value系统中的独特之处在于它支持一个链表的结构。List在Redis存储有序的字符串序列。

  1. List基本命令

命令/Command

例子及描述

RPUSH

RPUSH list-key item 从右边插入一个字符串

LPUSH

LPUSH list-ley item 从左边插入一个字符串

LRANGE

LRANGE list-key start end 从list中取得一个范围中的字符串

LINDEX

LINDEX list-key index 从给定位置取得一个字符串

LPOP

LPOP list-key 弹出左边/头部的字符串并返回它

RPOP

RPOP list-key 弹出右边/尾部的字符串并返回它

LLEN

LLEN list-key 返回list-key的长度

通过以上命令,List已经是一个可以解决各种问题的游泳数据结构,但是,List还有一些高级命令,如可以删除项,在中间插入项,修剪List列表使其具有特定的大小等。

  1. List高级命令

命令/Command

例子及描述

LTRIM

LTRIM list-key start end 对List进行修剪,就是说,让List只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

LINSERT

LINSERT list-key BEFORE|AFTER pivot value 将value值插入到列表中,位于值pivot之前或之后

LSET

LSET list-key index value 将列表list-key下标为index的元素的值设置为value,当index参数超出范围,或对一个空列表进行LSET时,返回一个错误

RPOPLPUSH

RPOPLPUSH source destination

命令RPOPLPUSH在一个原子时间内,执行以下两个操作:

将列表source中的最后一个元素弹出,并返回给客户端

将source弹出的元素插入到列表destination,作为destination列表的头元素

BLPOP

BLPOP key [key...] timeout

BLPOP是列表的阻塞式(blocking)弹出原语

它是LPOP命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被BLPOP命令阻塞,知道等待超时或发现可弹出元素为止

BRPOP

BRPOP key [key...] timeout

BRPOP是列表的阻塞式(blocking)弹出原语

它是RPOP命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被BRPOP命令阻塞,知道等待超时或发现可弹出元素为止

BRPOPLPUSH

BRPOPLPUSH source destination timeout

BRPOPLPUSH是RPOPLPUSH的阻塞版本,当给定列表source不为空时,BRPOPLPUSH的表现和RPOPLPUSH一样

当列表source为空时,BRPOPLPUSH命令将阻塞连接,知道等待超时,或由另一个客户端对source执行LPUSH或RPUSH命令为止

超时参数timeout接受一个以秒为单位的数字作为值。超时参数设为0表示阻塞时间可以无限延长

 

  1. Set

在Redis中,Set和List类似,它们都是一个字符串序列,但不同之处在于Set内部使用哈希表来保持所有字符串的唯一性(虽然没有关联的值)。

  1. 单个Set的操作命令

命令/Command

例子及描述

SADD

SADD key item item2 ... 将某个/多个元素加入key所代表的Set中,返回成功插入的元素个数,因此0表示一个元素都没有插入成功

SREM

SREM key item1 item2 将某个/多个元素从key所代表的Set中删除,返回成功删除的元素个数

SISMEMBER

SISMEMBER key item 判断item是否是key所代表的Set的元素,返回值1表示是,0表示不是

SMEMBERS

SMEMBERS key 返回key所代表的Set中的所有元素

SCARD

SCARD key 返回key所代表的Set中元素的个数

SRANDMEMBER

SRANDMEMBER key 返回key所代表的Set中的一个随机元素

SPOP

SPOP key 随机删除并返回key所代表的Set中的一个元素

 

  1. 操作多个Set的命令

Set除了对一个Set中的元素进行增加、删除操作之外,还可以同时操作多个Set。可以将一个Set的元素移动到另一个Set中,也可以对多个Set进行并、交、差的操作

命令/Command

例子及描述

SMOVE

SMOVE source destination member 将member元素从source所代表的Set移动到destination所代表的Set

SINTER

SINTER key1 [key2...]返回一个Set的全部元素,该Set是所有给定Set(key1 key2...)的交集

SINTERSTORE

SINTERSTORE destination key1 [key2...]这个命令类似于SINTER命令,但它将结果保存都destination所代表的Set,而不是简单的返回

SUNION

SUNION key1 [key2...] 返回一个Set的全部元素,该Set是所有给定Set(key1 key2...)地并集

SUNIONSTORE

SUNIONSTORE destination key1 [key2...] 这个命令类似于SUNION命令,但它将结果保存到destination所代表的Set,而不是简单的返回

SDIFF

SDIFF key1 [key2...]返回一个Set的全部元素,该Set是所有给定Set(key1,key2...)之间的差集。注意:key1,key2所对应Set的差集和key2,key1所对应的差集结果不一样,也就是差集不是对称的

SDIFFSTORE

SDIFFSTIORE destination key1 [key2...]这个命令的作用和SDIFF类似,但它将结果保存到destination所代表的Set,而不是简单的返回结果

 

  1. Hash

Hash、哈希和散列,它们时同义词,都是指的Redis中的Hash这种数据结构

在Redis中,LIst和Set都包含多个元素,而哈希表用来存储key/value,可以存储在哈希表中的value和存储在String中的元素一样:纯粹的字符串,或可以理解为数的数值,该数值可以递增或递减。

在很多方面,我们可以把哈希看成是Redis自身的微型版本,一些String命令,只要稍作修改,就能应用在哈希的值上面。

  1. 对单个key/value操作的命令

命令/Command

例子及描述

HSET

HSET key filed value 为指定的key设定field/value对,如果key不存在,该命令将创建新key以参数中的field/value对,如果参数中的field在该key中已经存在,则用新值覆盖其原有值。返回值1表示新的field被设置了新值,0表示field已经存在,用新值覆盖原有值

HGET

HGET key field 返回指定key中指定field的关联值,如果参数中的key或field不存在,返回nil

HEXISTS

HEXISTS key field 判断指定key中的指定field是否存在,返回1表示存在,返回0表示参数中的field或key不存在

HLEN

HLEN key 获取该key所包含的field的数量

HDEL

HDEL key field [field...]从指定key的hashtable中删除参数中指定的一到多个字段,如果不存在的字段将被忽略。如果key不存在,则将返回0.

HSETNX

HSETNX key field value 只有当参数中的key或value不存在的清空下,为指定的key设定field/value对,否则该命令不会进行任何操作

HINCRBY

HINCRBY key field increment增加指定key中指定field关联的value的值。如果key或field不存在,该命令将会创建一个新key或field,并将其关联的value初始化为0,之后再指定数字增加的操作。

 

  1. 批量操作key/value的命令

这些命令和单个key/value命令很相似,但它们能同时操作多个key/value。这些命令减少了客户端的调用次数以及客户端和Redis之间的网络时间,从而方便了编程,改善了性能。

命令/Command

例子及描述

HGETALL

HGETALL key 获取该key包含的所有field/value,其返回格式为一个field,一个value的列表

HKEYS

HKEYS key 返回指定key的所有fields名的列表

HVALS

HVALS key 返回指定key的所有values的列表

HMGET

HMGET key field [field...]获取参数中指定fields关联的一组values。

HMSET

HMSET key field value[key value...]逐对依次设置参数中给出的field/value对。如果其中某个field已经存在,则用新值覆盖原有值,如果key不存在,则创建新key,同时设定参数中的field/value

 

 

  1. Zset有序集合

Zset和Set类型极为相似,它们都是字符串的集合,都不允许重复的元素出现在一个Set中。它们之间的主要差别是Zset中的每一个元素都会由一个分数(score)与之关联,Redis正式通过分数来为集合中的元素进行从小到大的排序。然而需要额外指出的是,尽管Zsets中的元素必须是唯一的,但是分数(score)却是可以重复的。

在Zset中添加、删除或更新一个元素都是非常快速的操作,其时间复杂度为集合中元素数量的对数。由于Zset中的元素在集合中的位置是有序的,因此,即便是访问位于集合中的元素也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其他类型的数据库中是很难实现的。

操作Zset命令

命令/Command

例子及描述

ZADD

ZADD key score member [score][member]添加参数中指定的所有元素及其分数到指定key的Zset中。

ZCARD

ZCARD key 获取与该key相关的Zsets中包含的元素数量

ZCOUNT

ZCOUNT key min max 该命令用于获取分数在min和max之间的元素数量

ZINCRBY

ZINCRBY key increment member 该命令将为指定key中的指定元素增加指定的分数。如果元素不存在,该命令将添加该元素并假设其初始分数为0,此后再将其分数加上increment。如果key不存在,该命令将创建该key及其关联的Zsets,并包含参数指定的元素,其分数为increment参数。

ZRANGE

ZRANGE key start stop[WITHSCORES]该命令返回顺序在参数start和stop指定范围内的元素,这里start和stop参数都是0-based,即0表示第一个元素,-1表示最后一个元素,如果start大于该Zsets的最大索引值,或start>stop,此时一个空集合将被返回。如果命令中带有WITHSCORES选项,该命令在返回的结果中将包含每个元素的分数值

ZRANGEBYSCORE

ZRANGEBYSCORE key min max [WITHSCORES][LIMIT offset count]该命令将返回指定key中分数在min和max之间的所有元素,其中返回的元素是按照其分数从低到高的顺序返回。可选参数LIMIT用限制返回元素的数量范围。Offset表示从符合条件的第offset个元素开始返回,同时返回count个元素。

ZRANK

ZRANK key member Zset中的元素都是按照分数从低到高的顺序存储,该命令将返回参数中指定元素的位置值,其中0表示第一个元素,它是Zset中分数最低的元素

ZREM

ZREM key member [member...] 该命令将移除参数中指定的成员,其中不存在的成员将被忽略。

ZREVRANGE

ZREVRANGE key start stop [WITHSCORES] 该命令的公和ZRANGE基本相同,唯一的差别在于该命令是通过反向排序获取指定位置的元素,即从高到低的顺序。

ZSCORE

ZSCORE key member 获取指定key的指定元素的分数

ZREVRANGEBYSCORE

ZREVRANGEBYSCORE key max min[WITHSCORES][LIMIT offset count]该命令除了排序方式是基于从高到低的分数排序之外,其他功能和参数含义均与ZRANGEBYSCORE相同

ZREMRANGEBYRANK

ZREMRANGEBYRANK key start stop 删除索引位置位于start和stop之间的成员,这里start和stop参数都是0-based,即0表示分数最低的成员,-1表示最后一个成员,即分数最高的元素

ZREMRANGEBYSCORE

ZREMRANGEBYSCORE key min max 删除分数在min和max之间的所有元素

  1. KEY操作命令

上述内容主要是与Redis数据类型相关的命令,如String、List、Set、Hash和Zset,这些命令都一个共同点,即所有的操作都是针对于key关联的value的。接下来,将主要讲述于key相关的Redis命令,学习这些命令对于学习Redis是非常重要的基础。

命令/Command

例子及描述

KEYS

Keys pattern 获取所有匹配pattern参数的keys。需要说明的是,在我们的正常操作中应该尽量避免对该命令的调用,因为对于大型数据库而言,该命令是非常耗时的,对Redis服务器的性能打击也是比较大的。Pattern支持glob-style的通配符格式,如*表示任意一个或多个字符,?表示任意字符

DEL

DEL key [key2...]从数据库中删除参数中指定的keys,如果指定的key不存在则忽略。

EXISTS

EXISTS key 判断key是否存在

MOVE

MOVE key db 将当前数据库中指定的key移动到指定的数据库中,如果该key在目标数据库中已经存在或在当前数据库中并不存在,该命令将不做任何操作并返回0

RENAME

RENAME key newkey 为指定的key重新命名,如果参数中的两个key相同或者原key不存在,该命令都会返回相关的错误信息,如果newkey已经存在,则直接覆盖

PERSIST

PERSIST key 如果key存在过期时间,该命令会将其过期时间清除使该key不再有超时,而是可以持久化存储

EXPIRE

EXPIRE key seconds 该命令为参数中指定的key设定超时的秒数,在超过该描述后,key被自动删除,如果该key在超时前被修改,与该key关联的超时将被移除

EXPIREAT

EXPRIREAT key timestamp 该命令的逻辑功能和EXPIRE完全相同,唯一的差别是该命令指定的超时时间是绝对时间,而不是相对时间。该时间参数是Unix timestamp格式的,即从1970年1月1日开始到现在的秒数

TTL

TTL key 获取该key所剩的超时描述

RANDOMKEY

RANDOMKEY 从当前打开的数据库中随机的返回一个key

TYPE

TYPE key 获取与参数中指定key关联值得类型,该命令将以字符串的格式返回

  1. 事务

和众多其他数据库一样,Redis作为NoSQL数据库也同样提供了事务机制,在Redis中,MULTI/EXEC/DISCARD/WATCH这个四个命令是实现事务的基石。

命令/Command

命令描述

返回值

MULTI

用于标记事务的开始,其后执行的命令都将被存入命令队列,知道执行EXEC时,这些命令才会被执行

始终返回OK

EXEC

执行在一个事务内命令队列中的所有命令,同时将当前连接的状态恢复为正常状态,即非事务状态

原子性的返回事务中各条命令的返回结果

DISCARD

回滚事务队列中的所有命令,同时再将当前连接的状态恢复为正常状态。

始终返回OK

WATCH

WATCH key [key2...]在MULTI命令执行之前,可以指定待监控的keys,然而在执行EXEC之前,如果被监控的keys发生修改,EXEC将放弃执行该事务队列中的所有命令

始终返回OK

UNWATCH

取消当前事务中指定监控的keys,如果执行了EXEC或DISCARD命令,则无需再手动执行该命令了,因为在此之后,事务中所有被监控的keys都将自动取消

始终返回OK

  1. 主从模式

为了降低每个Redis服务器的负载,可以多设置几个Redis服务器,并做主从模式

一个服务器负载“写”(添加、删除、修改)数据,其他服务器负载“读数据”

主服务器数据会“自动”同步给从服务器

 

在PHP中使用Redis

 

https://github.com/phpredis/phpredis#type

 

安装php的redis扩展

https://pecl.php.net/package/redis/2.2.7/windows

https://pecl.php.net/package/igbinary/2.0.5/windows

 

通过php操作redis

猜你喜欢

转载自blog.csdn.net/weixin_42786143/article/details/81211581