Redis数据结构

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]
  1. 将字符串值 value 关联到 key
  2. 如果 key 已经持有其他值, SET 就覆写旧值, 无视类型。
  3. 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
  1. 只在键 key 不存在的情况下, 将键 key 的值设置为 value
  2. 若键 key 已经存在, 则 SETNX 命令不做任何动作。
  3. SETNX『SET if Not eXists』(如果不存在,则 SET)的简写。

INCR

INCR key
  1. 为键 key 储存的数字值加上一。
  2. 如果键 key 不存在, 那么它的值会先被初始化为 0 , 然后再执行 INCR 命令。
  3. 如果键 key 储存的值不能被解释为数字, 那么 INCR 命令将返回一个错误。
  4. 本操作的值限制在 64 位(bit)有符号数字表示之内。

Note

INCR 命令是一个针对字符串的操作。 因为 Redis 并没有专用的整数类型, 所以键 key 储存的值在执行 INCR 命令时会被解释为十进制 64 位有符号整数。

MSET

MSET key value [key value …]
  1. 同时为多个键设置值。
  2. 如果某个给定键已经存在, 那么 MSET 将使用新值去覆盖旧值, 如果这不是你所希望的效果, 请考虑使用 MSETNX 命令, 这个命令只会在所有给定键都不存在的情况下进行设置。
  3. MSET 是一个原子性(atomic)操作, 所有给定键都会在同一时间内被设置, 不会出现某些键被设置了但是另一些键没有被设置的情况。

MSETNX

MSETNX key value [key value …]
  1. 当且仅当所有给定键都不存在时, 为所有给定键设置值。
  2. 即使只有一个给定键已经存在, MSETNX 命令也会拒绝执行对所有键的设置操作。
  3. 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中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。

使用场景:

  1. 对于海量数据的情况,可以自己对数据进行分桶,然后使用Hash结构来存储。对于很多value为简单的字符串,做过测试,采用hash存储更节省空间。
  2. 将对象存储为Hash结构而不是String,可以每次只更新、获取Hash中的一个field,这样可以提高效率。

命令参考大全
http://redisdoc.com/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章