美文网首页
Redis对象类型及应用

Redis对象类型及应用

作者: 梦想做一个不秃头的程序猿 | 来源:发表于2019-10-02 19:49 被阅读0次
  • 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. 字符串对象}

相关文章

  • Redis对象类型及应用

    Redis数据对象类型  Redis共有五种数据对象,包括:字符串、列表、hash表、集合、有序集合。每种对象都至...

  • Redis缓存总结

    Redis 原理及应用(1)--数据类型及底层实现方式redis学习(八)——redis应用场景 --不错哦 Re...

  • Redis对象类型和底层数据结构

    Redis对象类型(类型常量:对象名称) REDIS_STRING: 字符串对象 REDIS_LIST: ...

  • Redis列表类型及应用

    列表类型内部是使用双向链表实现的,常用的操作是列表两端的添加和删除。获取接近两端的元素速度非常快,但是通过索引访问...

  • Redis集合类型及应用

    集合类型中的每个元素都是不同的,且没有顺序。一个集合类型键可以存储2的32次方 - 1个字符串,可以进行多个集合之...

  • Redis打怪升级,技术干货(壹)

    本文准备从以下几个方面去讲解redis打怪进阶:1)Redis的安装。2)Redis的数据类型及应用场景。 Red...

  • redis

    类型常量 对象的名称REDIS_STRING 字符串对象REDIS_LIST 列表对象REDIS_H...

  • redis底层数据实现及应用场景

    redis数据类型及底层实现 redis全局哈希表 String 底层数据结构: 简单动态字符串 应用场景: 缓存...

  • [redis 源码走读] 对象(redisObject)

    redis 对象 redis 对数据的处理用对象进行管理,目前有5种类型。每种对象类型并不是用单一的编码类型实现,...

  • Redis散列类型及应用

    在了解字符串的基本类型之后,遇到一个问题,如果要存储类似于文章这样的包含标题,标签,作者,正文等多项内容的时候,通...

网友评论

      本文标题:Redis对象类型及应用

      本文链接:https://www.haomeiwen.com/subject/xfgluctx.html