Redis对象类型及应用

  • Redis数据对象类型
      Redis共有五种数据对象,包括:字符串、列表、hash表、集合、有序集合。每种对象都至少用到一种Redis的底层数据结构。
      1. 字符串对象:REDIS_STRING
      2. 列表对象:REDIS_LIST
      3. 哈希对象: REDIS_HASH
      4. 集合对象: REDIS_SET
      5. 有序集合对象: REDIS_ZSET
      
      每当我们在Redis数据库中新建一个键值对的时候,至少会创建两个对象,一个用于存储键值对的键,一个用来存储对于的值。Redis中的每个对象都有一个redisObject存储。

对象详解

\color{#FF1493}{1. 字符串对象}

  字符串对象的编码可以是int,embstr,raw。
  默认情况下:
    - int:保存的是整数值时底层会默认用int编码。
    - raw:保存的字符串长度大于39字节。
    - embstr:保存的字符串长度小于等于39字节,或者保存的是浮点数。当保存的是浮点数时,也可以通过命令进行转换。

127.0.0.1:6379[9]> set number 10000
OK
127.0.0.1:6379[9]> type number
string
127.0.0.1:6379[9]> object encoding number
"int"
127.0.0.1:6379[9]> set story "happy new world"
OK
127.0.0.1:6379[9]> object encoding story
"embstr"
127.0.0.1:6379[9]> strlen story
(integer) 15
127.0.0.1:6379[9]> set rowstr "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"
OK
127.0.0.1:6379[9]> strlen rowstr
(integer) 46
127.0.0.1:6379[9]> object encoding rowstr
"raw"
127.0.0.1:6379[9]> set pi 3.14
OK
127.0.0.1:6379[9]> object encoding pi
"embstr"
127.0.0.1:6379[9]> incrbyfloat pi 2.0
"5.140000000000001"
127.0.0.1:6379[9]> object encoding pi
"embstr"

  int编码的字符串对象和embstr的在一定条件下会转为raw编码的字符串。
  - int编码转为raw

127.0.0.1:6379[9]> append number " is a number"
(integer) 15
127.0.0.1:6379[9]> get number
"800 is a number"
127.0.0.1:6379[9]> object encoding number
"raw"

  - embstr转为raw: embstr是只读的,任何修改都会直接转为raw编码

127.0.0.1:6379[9]> set msg "hello world"
OK
127.0.0.1:6379[9]> object encoding msg
"embstr"
127.0.0.1:6379[9]> append msg " again"
(integer) 17
127.0.0.1:6379[9]> get msg
"hello world again"
127.0.0.1:6379[9]> object encoding msg
"raw"

string常用命令

string命令

127.0.0.1:6379[9]> flushdb
OK
127.0.0.1:6379[9]> mset msg1 "msg1" msg2 "msg2"
OK
127.0.0.1:6379[9]> get msg1
"msg1"
127.0.0.1:6379[9]> mget msg1 msg2
1) "msg1"
2) "msg2"
127.0.0.1:6379[9]> getrange msg1 1 2
"sg"
127.0.0.1:6379[9]> getset msg1 "msg1 getset return old"
"msg1"
127.0.0.1:6379[9]> get msg1
"msg1 getset return old"
127.0.0.1:6379[9]> setex msg2 20 300
OK
127.0.0.1:6379[9]> setnx msg2 "msg2 change"
(integer) 0
127.0.0.1:6379[9]> setnx msg2 "msg2 change"
(integer) 1
127.0.0.1:6379[9]> get msg2
"msg2 change"
127.0.0.1:6379[9]> strlen msg2
(integer) 11
127.0.0.1:6379[9]> set num 20
OK
127.0.0.1:6379[9]> incr num
(integer) 21
127.0.0.1:6379[9]> incrby num 5
(integer) 26
127.0.0.1:6379[9]> decr num
(integer) 25
127.0.0.1:6379[9]> dectby num 5
(error) ERR unknown command 'dectby'
127.0.0.1:6379[9]> decrby num 5
(integer) 20
127.0.0.1:6379[9]> append num "2"
(integer) 3
127.0.0.1:6379[9]> getnum
(error) ERR unknown command 'getnum'
127.0.0.1:6379[9]> get num
"202"
127.0.0.1:6379[9]> incr num
(integer) 203

\color{#FF1493}{2. 列表对象}

  列表对象的编码可以是ziplist或者linkedlist,ziplist编码的列表底层使用压缩列表。当满足:列表对象保存的所有字符串元素的长度都小于64字节;并且列表对象保存的元素数量小于512个时列表对象使用ziplist编码。否则使用linkedlist,

127.0.0.1:6379[9]> eval "for i = 1, 512 do redis.call('rpush', KEYS[1], i)end" 1 "integers"
(nil)
127.0.0.1:6379[9]> llen integers
(integer) 512
127.0.0.1:6379[9]> object encoding integers
"ziplist"
127.0.0.1:6379[9]> rpush integers 513
(integer) 513
127.0.0.1:6379[9]> object encoding integers
"linkedlist"
127.0.0.1:6379[9]>

常用命令

127.0.0.1:6379[9]> rpush list 1 2 3 "4"
(integer) 4
127.0.0.1:6379[9]> lrange list 0 4
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379[9]> lpush list 0
(integer) 5
127.0.0.1:6379[9]> lrange list 0 5
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
127.0.0.1:6379[9]> lindex list 1
"1"
127.0.0.1:6379[9]> linsert list after pivot 3
(integer) -1
127.0.0.1:6379[9]> linsert list after 3 6
(integer) 6
127.0.0.1:6379[9]> llen list
(integer) 6
127.0.0.1:6379[9]> lrange list 0 5
1) "0"
2) "1"
3) "2"
4) "3"
5) "6"
6) "4"
127.0.0.1:6379[9]> lpop list
"0"
127.0.0.1:6379[9]> rpop list
"4"

\color{#FF1493}{3. 哈希对象}

  哈希对象的编码可以是ziplist或者hashtable,当哈希对象满足:哈希对象保存的所有键值对的键和值的字符串长度都小于64字节;并且保存的键值个数小于512个时使用ziplist进行编码。

127.0.0.1:6379[9]> hset book name "Redis 1"
(integer) 1
127.0.0.1:6379[9]> hmset book author "jhone" age 20
OK
127.0.0.1:6379[9]> HGETALL book
1) "name"
2) "Redis 1"
3) "author"
4) "jhone"
5) "age"
6) "20"
127.0.0.1:6379[9]> HGET book age
"20"
127.0.0.1:6379[9]> HEXISTS book age
(integer) 1
127.0.0.1:6379[9]> HEXISTS book id
(integer) 0
127.0.0.1:6379[9]> HDEL book age
(integer) 1
127.0.0.1:6379[9]> HSET book age 30
(integer) 1
127.0.0.1:6379[9]> HINCRBY book age 25
(integer) 55
127.0.0.1:6379[9]> HKEYS book
1) "name"
2) "author"
3) "age"
127.0.0.1:6379[9]> HVALS book
1) "Redis 1"
2) "jhone"
3) "55"

\color{#FF1493}{4. 集合对象}

  集合对象的编码可以是intset或者hashtable。当集合对象满足:集合对象保存的所有对象都是整数值并且元素个数不超过512个时使用intset,否则使用hashtable。

127.0.0.1:6379[9]> sadd set1 redis
(integer) 1
127.0.0.1:6379[9]> sadd set1 java
(integer) 1
127.0.0.1:6379[9]> smembers set1
1) "java"
2) "redis"
127.0.0.1:6379[9]> scard set1
(integer) 2
127.0.0.1:6379[9]> sadd set1 c python
(integer) 2
127.0.0.1:6379[9]> scard set1
(integer) 4
127.0.0.1:6379[9]> sadd set2 math
(integer) 1
127.0.0.1:6379[9]> sadd set2 java
(integer) 1
127.0.0.1:6379[9]> sinter set1 set2
1) "java"
127.0.0.1:6379[9]> sdiff set1 set2
1) "c"
2) "python"
3) "redis"
127.0.0.1:6379[9]> sismember set1 java
(integer) 1
127.0.0.1:6379[9]> srem set1 c
(integer) 1
127.0.0.1:6379[9]> smembers ste1
(empty list or set)
127.0.0.1:6379[9]> smembers set1
1) "java"
2) "python"
3) "redis"

\color{#FF1493}{5. 有序集合对象}

  有序集合的编码可以是ziplist或者skiplist。当有序集合同时满足:元素数量小于128个并且所有元素的长度小于64字节时使用ziplist编码。

127.0.0.1:6379[9]> zadd set1 1 redis
(integer) 1
127.0.0.1:6379[9]> zadd set1 3 java
(integer) 1
127.0.0.1:6379[9]> zadd set1 2 c
(integer) 1
127.0.0.1:6379[9]> zscore set1 c
"2"
127.0.0.1:6379[9]> zcard set1
(integer) 3
127.0.0.1:6379[9]> zcount set1 1 2
(integer) 2
127.0.0.1:6379[9]> zrange set1 0 3 withscores
1) "redis"
2) "1"
3) "c"
4) "2"
5) "java"
6) "3"

\color{#FF1493}{1. 字符串对象}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容