Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
对于String, List,Set,SortedSet,Hash等五种数据结构,可以结合Java中的对应的类来进行理解,其中String数据结构对应Object类 (任意对象都会序列化成string来存储),List数据结构对应java.util.List接口的实现类java.util.LinkedList,Set数据结构对应java.util.Set接口,SortedSet数据结构对应java.util.SortedSet接口,Hash数据结构对应java.util.HashMap类。
String
String类型是Redis中最为基础的数据存储类型,是二进制安全的字符串,该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中String类型的Value最多可以容纳的数据长度是512M。相对于其他的几种数据结构,只有String类型的命令在写入key的时候可以带有默认的过期时间,对于其他的数据结构,key默认是不过期的,如果需要设置过期时间,必须显示调用expire函数设置过期时间。
使用场景
value较小、模型简单的 value可以使用String类型存储,对于一些特殊的数据结构,比如List、Set等,建议采用相应的下面介绍的List和Set数据结构进行存储,这样不仅可以节省存储空间还可以提高操作效率。
常用命令
SET
SET key value [EX seconds] [PX milliseconds] [NX|XX]
- 将字符串值
value
关联到key
。 - 如果
key
已经持有其他值,SET
就覆写旧值, 无视类型。 - 当
SET
命令对一个带有生存时间(TTL)的键进行设置之后, 该键原有的 TTL 将被清除。
可选参数
从 Redis 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改:
EX seconds
: 将键的过期时间设置为seconds
秒。 执行SET key value EX seconds
的效果等同于执行SETEX key seconds value
。PX milliseconds
: 将键的过期时间设置为milliseconds
毫秒。 执行SET key value PX milliseconds
的效果等同于执行PSETEX key milliseconds value
。NX
: 只在键不存在时, 才对键进行设置操作。 执行SET key value NX
的效果等同于执行SETNX key value
。XX
: 只在键已经存在时, 才对键进行设置操作。
SETNX
SETNX key value
- 只在键
key
不存在的情况下, 将键key
的值设置为value
。 - 若键
key
已经存在, 则SETNX
命令不做任何动作。 SETNX
是『SET if Not eXists』
(如果不存在,则 SET)的简写。
INCR
INCR key
- 为键 key 储存的数字值加上一。
- 如果键 key 不存在, 那么它的值会先被初始化为 0 , 然后再执行 INCR 命令。
- 如果键 key 储存的值不能被解释为数字, 那么 INCR 命令将返回一个错误。
- 本操作的值限制在 64 位(bit)有符号数字表示之内。
Note
INCR 命令是一个针对字符串的操作。 因为 Redis 并没有专用的整数类型, 所以键 key 储存的值在执行 INCR 命令时会被解释为十进制 64 位有符号整数。
MSET
MSET key value [key value …]
- 同时为多个键设置值。
- 如果某个给定键已经存在, 那么 MSET 将使用新值去覆盖旧值, 如果这不是你所希望的效果, 请考虑使用
MSETNX
命令, 这个命令只会在所有给定键都不存在的情况下进行设置。 - MSET 是一个原子性(atomic)操作, 所有给定键都会在同一时间内被设置, 不会出现某些键被设置了但是另一些键没有被设置的情况。
MSETNX
MSETNX key value [key value …]
- 当且仅当所有给定键都不存在时, 为所有给定键设置值。
- 即使只有一个给定键已经存在, MSETNX 命令也会拒绝执行对所有键的设置操作。
- MSETNX 是一个原子性(atomic)操作, 所有给定键要么就全部都被设置, 要么就全部都不设置, 不可能出现第三种状态。
其他
命令 | 语法 | 说明 | 参数 |
---|---|---|---|
SETEX | SETEX key seconds value | 将键 key 的值设置为 value , 并将键 key 的生存时间设置为 seconds 秒钟。1. 如果键 key 已经存在, 那么 SETEX 命令将覆盖已有的值。2. SETEX 命令的效果和以下两个命令的效果类似:SET key value EXPIRE key seconds# 设置生存时间 3. SETEX 和这两个命令的不同之处在于 SETEX 是一个原子(atomic)操作, 它可以在同一时间内完成设置值和设置过期时间这两个操作, 因此 SETEX 命令在储存缓存的时候非常实用。 | |
PSETEX | PSETEX key milliseconds value | 同SETEX ,用于设置毫秒 | |
GET | GET key | 返回与键 key 相关联的字符串值。1. 如果键 key 不存在, 那么返回特殊值 nil ; 否则, 返回键 key 的值。2. 如果键 key 的值并非字符串类型, 那么返回一个错误, 因为 GET 命令只能用于字符串值。 | |
GETSET | GETSET key value | 将键 key 的值设为 value , 并返回键 key 在被设置之前的旧值。 | |
STRLEN | STRLEN key | 返回键 key 储存的字符串值的长度。 | |
APPEND | APPEND key value | 如果键 key 已经存在并且它的值是一个字符串, APPEND 命令将把 value 追加到键 key 现有值的末尾。如果 key 不存在, APPEND 就简单地将键 key 的值设为 value , 就像执行 SET key value 一样。追加 value 之后, 返回键 key 的值的长度。 | |
INCRBY | INCRBY key increment | 为键 key 储存的数字值加上增量 increment 。 | |
DECR | DECR key | 为键 key 储存的数字值减去一。 | |
DECRBY | DECRBY key decrement | 将键 key 储存的整数值减去减量 decrement 。 | |
MGET | MGET key [key …] | 返回给定的一个或多个字符串键的值。如果给定的字符串键里面, 有某个键不存在, 那么这个键的值将以特殊值 nil 表示。 |
List
List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。
从元素插入和删除的效率视角来看,如果是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。
使用场景
在评级系统中,比如社会化新闻网站,你可以把每个新提交的链接添加到一个list,用LRANGE可简单的对结果分页;在博客引擎实现中,你可为每篇日志设置一个list,在该list中推入进博客评论等等。
Set
Set类型是没有排序的字符串集合,和List类型一样,也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。和List类型不同的是,Set集合中不允许出现重复的元素,如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。
使用场景
可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
SortedSet
SortedSet和Set类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是SortedSet中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。需要额外指出的是,尽管SortedSet中的成员必须是唯一的,但是分数(score)却是可以重复的。在SortedSet中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为O(logn)。由于SortedSet中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。
使用场景:
可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP TEN的用户信息。当然也可以利用ZRANK命令通过username来获取玩家的排行信息。最后将组合使用ZRANGE和ZRANK命令快速的获取和某个玩家积分相近的其他用户的信息。
SortedSet类型还可用于构建索引数据。
建立一个SortedSet中元素个数不要超过 1 W。
Hash
Hash类型相当于Java中的HashMap。所以该类型非常适合于存储值对象的信息,比如User对象含有Username、Password和Age等属性,可以使用hash来存储User,每个field对应一个属性,好处是可以做到部分更新、获取。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。
使用场景:
- 对于海量数据的情况,可以自己对数据进行分桶,然后使用Hash结构来存储。对于很多value为简单的字符串,做过测试,采用hash存储更节省空间。
- 将对象存储为Hash结构而不是String,可以每次只更新、获取Hash中的一个field,这样可以提高效率。
命令参考大全
http://redisdoc.com/