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