数据结构类型 |
Value可以作为 |
读写操作 |
String |
字符串、整数和浮点数 |
读写整个或部分字符串,对整数/浮点数递增/递减 |
List |
字符串链表 |
对链表两端执行push/pop操作,读一项或多项字符串,按照值查找或删除某个字符串 |
Hash |
无序的key到value的hashtable |
插入、删除和读取某项,读写整个hashtable |
Set |
无序的字符串集合,字符串不能重复 |
插入、删除和读取某个字符串,查看某个字符串是否属于集合,对集合执行归、并、差操作 |
Zset |
字符串集合,每个字符串映射到一个浮点数分数,按分数排序 |
插入、删除和读取某项,根据分数范围读取 |
- String
String可以保存二进制字节的序列。通常在Redis的String用来存储三种类型的值
二进制序列的字符串
整型数据
浮点数据
- 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 |
- 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这种数据结构,并且提供了更广泛的命令和方法。
- List
Redis在key-value系统中的独特之处在于它支持一个链表的结构。List在Redis存储有序的字符串序列。
- 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列表使其具有特定的大小等。
- 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表示阻塞时间可以无限延长 |
- Set
在Redis中,Set和List类似,它们都是一个字符串序列,但不同之处在于Set内部使用哈希表来保持所有字符串的唯一性(虽然没有关联的值)。
- 单个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中的一个元素 |
- 操作多个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,而不是简单的返回结果 |
- Hash
Hash、哈希和散列,它们时同义词,都是指的Redis中的Hash这种数据结构
在Redis中,LIst和Set都包含多个元素,而哈希表用来存储key/value,可以存储在哈希表中的value和存储在String中的元素一样:纯粹的字符串,或可以理解为数的数值,该数值可以递增或递减。
在很多方面,我们可以把哈希看成是Redis自身的微型版本,一些String命令,只要稍作修改,就能应用在哈希的值上面。
- 对单个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,之后再指定数字增加的操作。 |
- 批量操作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 |
- 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之间的所有元素 |
- 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关联值得类型,该命令将以字符串的格式返回 |
- 事务
和众多其他数据库一样,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 |
- 主从模式
为了降低每个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