Redis壶中天-数据类型

常用的数据类型

字符串对象、列表对象、哈希对象、集合对象、有序集合对象

本文所使用的Redis版本为3.2.8

对象

Redis使用对象(redisObject)表示数据库中的键值,每创建一个键值对都要创建两个对象,键对象与值对象。键对象通常是字符串对象,值对象可以是任意对象。

对象构成

属性 类型 描述
type unsigned 类型
encoding unsigned 编码
*ptr void 指向底层实现数据结构的指针

类型

使用TYPE命令可查看对象中保存的数据类型

  1. 字符串对象

    1
    2
    3
    4
    127.0.0.1:6379> set msg "hello"
    OK
    127.0.0.1:6379> type msg
    string
  2. 列表对象

    1
    2
    3
    4
    127.0.0.1:6379> rpush numbers 1 2 3
    (integer) 3
    127.0.0.1:6379> type numbers
    list
  3. 哈希对象

    1
    2
    3
    4
    127.0.0.1:6379> hmset user name yrq sex male
    OK
    127.0.0.1:6379> type user
    hash
  4. 集合对象

    1
    2
    3
    4
    127.0.0.1:6379> sadd animals dog cat bird
    (integer) 3
    127.0.0.1:6379> type animals
    set
  5. 有序集合对象

    1
    2
    3
    4
    127.0.0.1:6379> zadd score 98 math 75 eng 85 bio
    (integer) 3
    127.0.0.1:6379> type score
    zset

字符串对象

  • type: REDIS_STRING
  • encoding: REDIS_ENCODING_INT | REDIS_ENCODING_RAW

编码转换

  1. 字符串中仅包含整数值,则为”int”

    1
    2
    3
    4
    127.0.0.1:6379> set a "1"
    OK
    127.0.0.1:6379> object encoding a
    "int"
  2. 通常情况下为”embstr”

    1
    2
    3
    4
    127.0.0.1:6379> set a "hello"
    OK
    127.0.0.1:6379> object encoding a
    "embstr"
  3. 当字符串被修改时编码会变为”raw”

    1
    2
    3
    4
    5
    6
    127.0.0.1:6379> object encoding a
    "embstr"
    127.0.0.1:6379> append a " world"
    (integer) 11
    127.0.0.1:6379> object encoding a
    "raw"

常用命令

  1. set
    设置键对应的字符串值

    1
    2
    127.0.0.1:6379> set msg "hello"
    OK
  2. get
    取得键对应的值

    1
    2
    127.0.0.1:6379> get msg
    "hello"
  3. append
    将给定字符串添加到现有字符串末尾

    1
    2
    3
    4
    127.0.0.1:6379> append msg " world"
    (integer) 11
    127.0.0.1:6379> get msg
    "hello world"
  4. incrbyfloat
    取出字符串尝试转换为long double的浮点数并进行加法运算

    1
    2
    3
    4
    127.0.0.1:6379> set score 4.20
    OK
    127.0.0.1:6379> incrbyfloat score 0.40
    "4.6"
  5. incrby
    若字符串为int编码则进行整数的加法,否则返回一个错误

    1
    2
    3
    4
    5
    6
    7
    8
    127.0.0.1:6379> set i 10
    OK
    127.0.0.1:6379> incrby i 2
    (integer) 12
    127.0.0.1:6379> set str "hello"
    OK
    127.0.0.1:6379> incrby str 2
    (error) ERR value is not an integer or out of range
  6. decrby
    若字符串为int编码则进行整数的减法,否则返回一个错误

    1
    2
    3
    4
    127.0.0.1:6379> set a 10
    OK
    127.0.0.1:6379> decrby a 2
    (integer) 8
  7. strlen
    返回字符串的长度

    1
    2
    3
    4
    127.0.0.1:6379> set name "yrq"
    OK
    127.0.0.1:6379> strlen name
    (integer) 3
  8. setrange
    修改指定偏移位置的字符串

    1
    2
    3
    4
    5
    6
    127.0.0.1:6379> set str "hello"
    OK
    127.0.0.1:6379> setrange str 2 "LL"
    (integer) 5
    127.0.0.1:6379> get str
    "heLLo"
  9. getrange
    取得指定偏移位置或范围的字符串

    1
    2
    3
    4
    127.0.0.1:6379> set str "hello"
    OK
    127.0.0.1:6379> getrange str 2 4
    "llo"

列表对象

type: REDIS_LIST

1
2
3
4
127.0.0.1:6379> rpush numbers 1 2 3
(integer) 3
127.0.0.1:6379> object encoding numbers
"quicklist"

常用命令

  1. lpush
    将新元素推入表头

    1
    2
    3
    4
    5
    6
    127.0.0.1:6379> lpush fruit "apple" "orange" "grape"
    (integer) 3
    127.0.0.1:6379> lrange fruit 0 -1 ## 注意元素顺序
    1) "grape"
    2) "orange"
    3) "apple"
  2. rpush
    将新元素推入表尾

    1
    2
    3
    4
    5
    6
    127.0.0.1:6379> rpush fruit "apple" "orange" "grape"
    (integer) 3
    127.0.0.1:6379> lrange fruit 0 -1
    1) "apple"
    2) "orange"
    3) "grape"
  3. lpop
    返回表头节点所保存元素并删除

    1
    2
    3
    4
    5
    6
    127.0.0.1:6379> rpush name "yrq" "rizu"
    (integer) 2
    127.0.0.1:6379> lpop name
    "yrq"
    127.0.0.1:6379> lrange name 0 -1
    1) "rizu"
  4. rpop
    返回表尾节点所保存元素并删除

    1
    2
    3
    4
    5
    6
    127.0.0.1:6379> rpush name "yrq" "rizu"
    (integer) 2
    127.0.0.1:6379> rpop name
    "rizu"
    127.0.0.1:6379> lrange name 0 -1
    1) "yrq"
  5. lindex
    返回指定节点所保存的元素

    1
    2
    3
    4
    127.0.0.1:6379> rpush fruit "apple" "orange" "grape"
    (integer) 3
    127.0.0.1:6379> lindex fruit 2
    "grape"
  6. llen
    返回列表长度

    1
    2
    127.0.0.1:6379> llen fruit
    (integer) 3
  7. linsert
    在列表中指定元素的之前或之后插入新元素

    1
    2
    3
    4
    5
    6
    7
    127.0.0.1:6379> linsert fruit BEFORE "orange" "banana"
    (integer) 4
    127.0.0.1:6379> lrange fruit 0 -1
    1) "apple"
    2) "banana"
    3) "orange"
    4) "grape"
  8. lrem
    移除列表中的元素

    1
    2
    3
    4
    5
    6
    127.0.0.1:6379> lrem fruit 0 "apple"
    (integer) 1
    127.0.0.1:6379> lrange fruit 0 -1
    1) "banana"
    2) "orange"
    3) "grape"
  9. ltrim
    根据指定的索引范围剪裁列表,删除所有不在范围内的元素

    1
    2
    3
    4
    5
    127.0.0.1:6379> ltrim fruit 0 1
    OK
    127.0.0.1:6379> lrange fruit 0 -1
    1) "banana"
    2) "orange"
  10. lset
    通过索引更新列表上元素的值

    1
    2
    3
    4
    5
    127.0.0.1:6379> lset fruit 0 "apple"
    OK
    127.0.0.1:6379> lrange fruit 0 -1
    1) "apple"
    2) "orange"

哈希对象

  • type: REDIS_HASH
  • encoding: REDIS_ENCODING_ZIPLIST | REDIS_ENCODING_HT

编码转换

  1. 若所有键值对的键值长度都小于64字节(hash-max-ziplist-value),并且键值对数量(hash-max-ziplist-entries)小于512个时使用”ziplist”编码

    1
    2
    3
    4
    127.0.0.1:6379> hset user name "yrq"
    (integer) 1
    127.0.0.1:6379> object encoding user
    "ziplist"
  2. 若不满足上一条中的条件时使用”hashtable”编码

    1
    2
    3
    4
    127.0.0.1:6379> hset book description "This is a book about history of ancientEgypt. That's a long...long...long...long...story "
    (integer) 1
    127.0.0.1:6379> object encoding book
    "hashtable"

常用命令

  1. hset
    设置一个hash域对应的字符串值

    1
    2
    127.0.0.1:6379> hset sex yrq "male"
    (integer) 1
  2. hget
    取得一个hash域的值

    1
    2
    127.0.0.1:6379> hget sex yrq
    "male"
  3. hmset
    设置多个域值对(field-value)

    1
    2
    127.0.0.1:6379> hmset book title "History" content "It's a long story"
    OK
  4. hmget
    取得所有hash域的值

    1
    2
    127.0.0.1:6379> hmset book title "History" content "It's a long story"
    OK
  5. hexists
    检查指定域是否存在

    1
    2
    3
    4
    127.0.0.1:6379> hexists book title
    (integer) 1
    127.0.0.1:6379> hexists book author
    (integer) 0
  6. hdel
    删除hash表中的一个或多个域

    1
    2
    3
    4
    5
    6
    7
    8
    127.0.0.1:6379> hdel sex yrq
    (integer) 1
    127.0.0.1:6379> hget sex yrq
    (nil)
    127.0.0.1:6379> hdel book title content
    (integer) 2
    127.0.0.1:6379> hgetall book
    (empty list or set)
  7. hlen
    取得hash表中域的数量

    1
    2
    3
    4
    127.0.0.1:6379> hmset book title "History" content "It's a long story"
    OK
    127.0.0.1:6379> hlen book
    (integer) 2
  8. hgetall
    取得hash表中的所有域与值

    1
    2
    3
    4
    5
    127.0.0.1:6379> hgetall book
    1) "title"
    2) "History"
    3) "content"
    4) "It's a long story"

集合对象

  • type: REDIS_SET
  • encoding: REDIS_ENCODING_INTSET | REDIS_ENCODING_HT

编码转换

  1. 若集合中元素均为整数值并且数量(set-max-inset-entries)不超过512个时使用”inset”编码

    1
    2
    3
    4
    127.0.0.1:6379> sadd age 21 22 23
    (integer) 3
    127.0.0.1:6379> object encoding age
    "intset"
  2. 若不满足上一条中的条件时使用”hashtable”编码

    1
    2
    3
    4
    127.0.0.1:6379> sadd stu "yrq" "rizu" "yepoch"
    (integer) 3
    127.0.0.1:6379> object encoding stu
    "hashtable"

常用命令

  1. sadd
    在集合中添加一个或多个元素

    1
    2
    127.0.0.1:6379> sadd lang "eng" "chn" "jap"
    (integer) 3
  2. scard
    取得集合中元素个数

    1
    2
    127.0.0.1:6379> scard lang
    (integer) 3
  3. sismember
    判断指定元素是否存在

    1
    2
    3
    4
    127.0.0.1:6379> sismember lang eng
    (integer) 1
    127.0.0.1:6379> sismember lang ger
    (integer) 0
  4. smembers
    取得集合中的所有元素

    1
    2
    3
    4
    127.0.0.1:6379> smembers lang
    1) "eng"
    2) "chn"
    3) "jap"
  5. srandmember
    随机取得集合中的一个或多个元素

    1
    2
    3
    4
    5
    127.0.0.1:6379> srandmember lang
    "jap"
    127.0.0.1:6379> srandmember lang 2
    1) "eng"
    2) "jap"
  6. spop
    随机取得集合中的一个或多个元素并从原集合中删除

    1
    2
    3
    4
    5
    127.0.0.1:6379> spop lang 2
    1) "chn"
    2) "jap"
    127.0.0.1:6379> smembers lang
    1) "eng"
  7. srem
    删除集合中的一个或多个元素

    1
    2
    3
    4
    5
    127.0.0.1:6379> srem lang eng
    (integer) 1
    127.0.0.1:6379> smembers lang
    1) "chn"
    2) "jap"

有序集合对象

  • type: REDIS_ZSET
  • encoding: REDIS_ENCODING_ZIPLIST | REDIS_ENCODING_SKIPLIST

编码转换

  1. 若有序集合中元素个数(zset-max-ziplist-entries)小于128个,并且所有元素成员长度(zset-max-ziplist-value)都小于64字节时,使用”ziplist”编码

    1
    2
    3
    4
    127.0.0.1:6379> zadd sport 100 "football" 95 "tennis" 90 "pingpong"
    (integer) 3
    127.0.0.1:6379> object encoding sport
    "ziplist"
  2. 若不满足上一条中的条件时使用”skiplist”编码

    1
    2
    3
    4
    127.0.0.1:6379> zadd comment 20170428 "It's a long long long long long long long long long long long long long story" 20170429 "hello world"
    (integer) 2
    127.0.0.1:6379> object encoding comment
    "skiplist"

常用命令

  1. zadd
    将一个或多个元素添加到有序集合中,若元素已存在则更新score

    1
    2
    127.0.0.1:6379> zadd result 100 "math" 90 "english" 80 "chemistry"
    (integer) 3
  2. zcard
    取得有序集合中元素个数

    1
    2
    127.0.0.1:6379> zcard result
    (integer) 3
  3. zcount
    取得满足指定score范围的元素个数

    1
    2
    127.0.0.1:6379> zcount result 85 100
    (integer) 2
  4. zrange
    取得指定范围内的所有元素,从表头遍历到表尾

    1
    2
    3
    127.0.0.1:6379> zrange result 0 1
    1) "chemistry"
    2) "english"
  5. zrevrange
    取得指定范围内的所有元素,从表尾遍历到表头

    1
    2
    3
    127.0.0.1:6379> zrevrange result 0 1
    1) "math"
    2) "english"
  6. zrank
    取得查找指定元素所途经的元素个数

    1
    2
    3
    4
    127.0.0.1:6379> zrank result english
    (integer) 1
    127.0.0.1:6379> zrank result math
    (integer) 2
  7. zrem
    移除一个或多个元素

    1
    2
    3
    4
    5
    127.0.0.1:6379> zrem result math
    (integer) 1
    127.0.0.1:6379> zrange result 0 -1
    1) "chemistry"
    2) "english"
  8. zscore
    取得指定元素的score值

    1
    2
    127.0.0.1:6379> zscore result math
    "100"

Bitmap

bitmap并不是实际的数据类型,而是将字符串类型转换成了二进制value,包含一些对bit的操作。对bitmap进行计算通常速度很快,用于某些快速、实时的计算统计等。

常用命令

  1. setbit
    根据偏移设置键对应值的bit

    1
    2
    127.0.0.1:6379> setbit a 10 1
    (integer) 0
  2. getbit
    取得字符串在偏移处的bit值

    1
    2
    3
    4
    127.0.0.1:6379> getbit a 10
    (integer) 1
    127.0.0.1:6379> getbit a 9
    (integer) 0
  3. bitop
    提供二进制的逐位操作,将结果保存在目标键中,包含与(AND)、或(OR)、非(NOT)、异或(XOR)操作.

    1
    2
    3
    4
    5
    6
    7
    8
    127.0.0.1:6379> set key1 "abcdef"
    OK
    127.0.0.1:6379> set key2 "opqba"
    OK
    127.0.0.1:6379> bitop and dest key1 key2
    (integer) 6
    127.0.0.1:6379> get dest
    "a`a`a\x00"
  4. bitcount
    取得值为1的二进制位个数

    1
    2
    3
    4
    127.0.0.1:6379> set str "foo"
    OK
    127.0.0.1:6379> bitcount str
    (integer) 16
  5. bitpos
    返回字符串里面第一个被设置为1或者0的bit位。

    1
    2
    3
    4
    127.0.0.1:6379> set mykey "\xff\xf0\x00"
    OK
    127.0.0.1:6379> bitpos mykey 0
    (integer) 12

参考

文章目录
  1. 1. 对象
    1. 1.1. 类型
  2. 2. 字符串对象
    1. 2.1. 编码转换
    2. 2.2. 常用命令
  3. 3. 列表对象
    1. 3.1. 常用命令
  4. 4. 哈希对象
    1. 4.1. 编码转换
    2. 4.2. 常用命令
  5. 5. 集合对象
    1. 5.1. 编码转换
    2. 5.2. 常用命令
  6. 6. 有序集合对象
    1. 6.1. 编码转换
    2. 6.2. 常用命令
  7. 7. Bitmap
    1. 7.1. 常用命令
  8. 8. 参考
|