redis的数据类型和基本操作

Redis 的Key

Redis 的 key 是字符串类型,但是 key 中不能包括边界字符,由于 key 不是 binary safe的字符串,所以像"my key"和"mykey\n"这样包含空格和换行的 key 是不允许的。

  • exits key 检测指定 key 是否存在,返回 1 表示存在,0 不存在
  • del key1 key2 ...... keyN 删除给定 key,返回删除 key 的数目,0 表示给定 key 都不存在
  • rename oldkey newkey 重命名一个 key,如果 newkey 存在,将会被覆盖,返回 1 表示成功,0 失败。可能是 oldkey 不存在或者和 newkey 相同。
  • expire key seconds 为 key 指定过期时间,单位是秒。返回 1 成功,0 表示 key 已经设置过过期时间或者不存在。

Redis 的vaule

redis 提供五种数据类型: string,hash, list,set 及zset。

string 类型

string 是最基本的类型。可以作为以下类型使用:

  • 字符串
  • byte数组:string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。从内部实现来看其实 string 可以看作 byte数组,最大上限是 1G 字节。
  • 长整数:类似于Long或者Int,但是由于redis是C语言编写的,所以在32位的机器上是32位,64位机器上是64位。
  • 浮点型:双精度浮点数。类似于Double。

string 类型数据操作指令简介:

  • set key value 设置 key 对应 string 类型的值,返回 1 表示成功,0 失败。
  • setnx key value 如果 key 不存在,设置 key 对应 string 类型的值。如果 key 已经存在,返回 0。
  • get key 获取 key 对应的 string 值,如果 key 不存在返回 nil
  • mget key1 key2 ...... keyN 一次获取多个 key 的值,如果对应 key 不存在,则对应返回 nil。
  • mset key1 value1 ...... keyN valueN 一次设置多个 key 的值,成功返回 1 表示所有的值都设置了,失败返回 0 表示没有任何值被设置。
  • msetnx key1 value1 ...... keyN valueN 一次设置多个 key 的值,但是不会覆盖已经存在的 key
  • incrby key integer 对 key 加上指定值 ,key 不存在时候会设置 key,并认为原来的 value是 0。
  • GETRANGE
  • SETRANGE
  • APPEND
  • SETEX key seconds valu:将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。 
  • GETBIT key offset字符串值指定偏移量上的位(bit)。
  • SETBIT key offset字符串值指定偏移量上的位(bit)。

List(列表)

Redis列表是简单的字符串列表,实现是双向链表。

可以作为:双向链表,双端队列,栈,BlockingQueue等。

命令:

  • BLPOP
    BLPOP key1 [key2 ] timeout 取出并获取列表中的第一个元素,或阻塞,直到有可用
  • BRPOP
    BRPOP key1 [key2 ] timeout 取出并获取列表中的最后一个元素,或阻塞,直到有可用
  • BRPOPLPUSH
    BRPOPLPUSH source destination timeout 从列表中弹出一个值,它推到另一个列表并返回它;或阻塞,直到有可用
  • LINDEX
    LINDEX key index 从一个列表其索引获取对应的元素
  • LINSERT
    LINSERT key BEFORE|AFTER pivot value 在列表中的其他元素之后或之前插入一个元素
  • LLEN
    LLEN key 获取列表的长度
  • LPOP
    LPOP key 获取并取出列表中的第一个元素
  • LPUSH
    LPUSH key value1 [value2] 在前面加上一个或多个值的列表
  • LPUSHX
    LPUSHX key value 在前面加上一个值列表,仅当列表中存在
  • LRANGE
    LRANGE key start stop 从一个列表获取各种元素
  • LREM
    LREM key count value 从列表中删除元素
  • LSET
    LSET key index value 在列表中的索引设置一个元素的值
  • LTRIM
    LTRIM key start stop 修剪列表到指定的范围内
  • RPOP
    RPOP key 取出并获取列表中的最后一个元素
  • RPOPLPUSH
    RPOPLPUSH source destination 删除最后一个元素的列表,将其附加到另一个列表并返回它
  • RPUSH
    RPUSH key value1 [value2] 添加一个或多个值到列表
  • RPUSHX
    RPUSHX key value 添加一个值列表,仅当列表中存在

Set(集合)

可以理解为一堆值不重复的列表,类似数学领域中的集合概念,且Redis也提供了针对集合的求交集、并集、差集等操作。

set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

相关命令

  • SADD
    SADD key member [member ...] 添加一个或者多个元素到集合(set)里
  • SACRD
    SCARD key 获取集合里面的元素数量
  • SDIFF
    SDIFF key [key ...] 获得队列不存在的元素
  • SDIFFSTORE
    SDIFFSTORE destination key [key ...] 获得队列不存在的元素,并存储在一个关键的结果集
  • SINTER
    SINTER key [key ...] 获得两个集合的交集
  • SINTERSTORE
    SINTERSTORE destination key [key ...] 获得两个集合的交集,并存储在一个集合中
  • SISMEMBER
    SISMEMBER key member 确定一个给定的值是一个集合的成员
  • SMEMBERS
    SMEMBERS key 获取集合里面的所有key
  • SMOVE
    SMOVE source destination member 移动集合里面的一个key到另一个集合
  • SPOP
    SPOP key [count] 获取并删除一个集合里面的元素
  • SRANDMEMBER
    SRANDMEMBER key [count] 从集合里面随机获取一个元素
  • SREM
    SREM key member [member ...] 从集合里删除一个或多个元素,不存在的元素会被忽略
  • SUNION
    SUNION key [key ...] 添加多个set元素
  • SUNIONSTORE
    SUNIONSTORE destination key [key ...] 合并set元素,并将结果存入新的set里面
  • SSCAN
    SSCAN key cursor [MATCH pattern] [COUNT count] 迭代set里面的元素

 

Hash(字典,哈希表)

就是HashMap。

相关命令

  • HDEL
    HDEL key field[field...] 删除对象的一个或几个属性域,不存在的属性将被忽略
  • HEXISTS
    HEXISTS key field 查看对象是否存在该属性域
  • HGET
    HGET key field 获取对象中该field属性域的值
  • HGETALL
    HGETALL key 获取对象的所有属性域和值
  • HINCRBY
    HINCRBY key field value 将该对象中指定域的值增加给定的value,原子自增操作,只能是integer的属性值可以使用
  • HINCRBYFLOAT
    HINCRBYFLOAT key field increment 将该对象中指定域的值增加给定的浮点数
  • HKEYS
    HKEYS key 获取对象的所有属性字段
  • HVALS
    HVALS key 获取对象的所有属性值
  • HLEN
    HLEN key 获取对象的所有属性字段的总数
  • HMGET
    HMGET key field[field...] 获取对象的一个或多个指定字段的值
  • HSET
    HSET key field value 设置对象指定字段的值
  • HMSET
    HMSET key field value [field value ...] 同时设置对象中一个或多个字段的值
  • HSETNX
    HSETNX key field value 只在对象不存在指定的字段时才设置字段的值
  • HSTRLEN
    HSTRLEN key field 返回对象指定field的value的字符串长度,如果该对象或者field不存在,返回0.
  • HSCAN
    HSCAN key cursor [MATCH pattern] [COUNT count] 类似SCAN命令

ZSet(有序集合)

注意:ZSet内部是一个Set和跳跃链表。Set内部是一个Hash。

Redis有序集合类似Redis集合,不同的是增加了一个功能,即集合是有序的。一个有序集合的每个成员带有分数,用于进行排序。

Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员(这一段有问题,应该是hashmap中存储所有的成员来保证唯一性,skitlist用来保证顺序,里面存储的应该是core和指向成员的指针),排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

关于跳跃链表:

跳跃链表是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间),并且对并发算法友好。

基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以快速的跳过部分列表(因此得名)。所有操作都以对数随机化的时间进行。

跳跃列表是按层建造的。底层是一个普通的有序链表。每个更高层都充当下面列表的"快速跑道",这里在层 i 中的元素按某个固定的概率 p 出现在层 i+1 中。平均起来,每个元素都在 1/(1-p) 个列表中出现,而最高层的元素(通常是在跳跃列表前端的一个特殊的头元素)在 O(log1/pn) 个列表中出现。

跳跃表参考:http://www.cnblogs.com/acfox/p/3688607.html

总之,跳跃表是有序的。作为索引的作用来实现ZSet。

使用场景

Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构。
可以作为PriorityQueue。不过元素不能重复。

相关命令

  • ZADD
    ZADD key score1 member1 [score2 member2] 添加一个或多个成员到有序集合,或者如果它已经存在更新其分数
  • ZCARD
    ZCARD key 得到的有序集合成员的数量
  • ZCOUNT
    ZCOUNT key min max 计算一个有序集合成员与给定值范围内的分数
  • ZINCRBY
    ZINCRBY key increment member 在有序集合增加成员的分数
  • ZINTERSTORE
    ZINTERSTORE destination numkeys key [key ...] 多重交叉排序集合,并存储生成一个新的键有序集合。
  • ZLEXCOUNT
    ZLEXCOUNT key min max 计算一个给定的字典范围之间的有序集合成员的数量
  • ZRANGE
    ZRANGE key start stop [WITHSCORES] 由索引返回一个成员范围的有序集合(从低到高)
  • ZRANGEBYLEX
    ZRANGEBYLEX key min max [LIMIT offset count]返回一个成员范围的有序集合(由字典范围)
  • ZRANGEBYSCORE
    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 返回有序集key中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员,有序集成员按 score 值递增(从小到大)次序排列
  • ZRANK
    ZRANK key member 确定成员的索引中有序集合
  • ZREM
    ZREM key member [member ...] 从有序集合中删除一个或多个成员,不存在的成员将被忽略
  • ZREMRANGEBYLEX
    ZREMRANGEBYLEX key min max 删除所有成员在给定的字典范围之间的有序集合
  • ZREMRANGEBYRANK
    ZREMRANGEBYRANK key start stop 在给定的索引之内删除所有成员的有序集合
  • ZREMRANGEBYSCORE
    ZREMRANGEBYSCORE key min max 在给定的分数之内删除所有成员的有序集合
  • ZREVRANGE
    ZREVRANGE key start stop [WITHSCORES] 返回一个成员范围的有序集合,通过索引,以分数排序,从高分到低分
  • ZREVRANGEBYSCORE
    ZREVRANGEBYSCORE key max min [WITHSCORES] 返回一个成员范围的有序集合,以socre排序从高到低
  • ZREVRANK
    ZREVRANK key member 确定一个有序集合成员的索引,以分数排序,从高分到低分
  • ZSCORE
    ZSCORE key member 获取给定成员相关联的分数在一个有序集合
  • ZUNIONSTORE
    ZUNIONSTORE destination numkeys key [key ...] 添加多个集排序,所得排序集合存储在一个新的键
  • ZSCAN
    ZSCAN key cursor [MATCH pattern] [COUNT count] 增量迭代排序元素集和相关的分数

posted on 2017-07-23 19:41  张小贱1987  阅读(240)  评论(0编辑  收藏  举报

导航