关于Redis五种类型对象的学习笔记

我们在使用Redis的时候,直接接触到的是字符串对象(String),列表对象(List),哈希对象(Hash),集合对象(Set),有序集合对象(SortedSet)这五种类型的对象,基本的命令如:String(get set) List(lpush rpush lpop rpop lrange) Hash(hget hset hlen hgetall) Set(sadd smembers smov) SortedSet(Zadd Zrange)等。

我们首先看一下redis对象的数据结构:

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
    int refcount;
    void *ptr;
} robj;

其中type属性是记录对象的类型,可以是REDIS_STRING  REDIS_LIST  REDIS_HASH  REDIS_SET REDIS_ZSET 这五个常量

可以使用命令type来查看一个键属于什么类型,如下:

127.0.0.1:6379> set name "hell world"
OK
127.0.0.1:6379> get name
"hell world"
127.0.0.1:6379> type name
string
127.0.0.1:6379> sadd sname "zhangsan" "lisi" "wangwu"
(integer) 3
127.0.0.1:6379> smembers sname
1) "wangwu"
2) "zhangsan"
3) "lisi"
127.0.0.1:6379> type sname
set
127.0.0.1:6379> lpush lname "zhang" "wang" "zhao" "li"
(integer) 4
127.0.0.1:6379> lrange lname 0 -1
1) "li"
2) "zhao"
3) "wang"
4) "zhang"
127.0.0.1:6379> type lname
list
127.0.0.1:6379>

另外encoding属性记录了对象使用什么编码,这个需要说明一点,redis可以针对不同的使用场景,为对象设置多种不同的数据结构实现,比如,都是hash类型对象,针对不同的数据,可以使用不同的底层实现,如果是hash中的键比较少,并且存储的元素也都是比较短的字符串的时候,使用的底层实现是压缩列表,反之,使用字典作为底层实现,可以使用object encoding命令查看使用的什么底层实现。

127.0.0.1:6379> object encoding name
"embstr"
127.0.0.1:6379> object encoding sname
"hashtable"
127.0.0.1:6379> object encoding lname
"ziplist"
127.0.0.1:6379>

这样做的好处是什么?可以提高灵活性和效率,根据不同的使用场景来为对象设置不同的编码,优化对象在某一场景下的效率。

接下来的refcount属性是做什么用的呢?设计到两个内容,一是内存回收,一个是对象共享

这个计数器就是当一个对象被创建出来之后,refcount+1,当对象被一个新程序引用,那么计数器+1,反之-1,但这个计数器为0的时候,表示资源可以被释放了

至于对象共享,【redis值对包含整数型的字符串对象进行共享】

127.0.0.1:6379> set aa 100
OK
127.0.0.1:6379> object refcount aa
(integer) 2
127.0.0.1:6379> set bb 100
OK
127.0.0.1:6379> object refcount aa
(integer) 3
127.0.0.1:6379> object refcount bb
(integer) 3
127.0.0.1:6379> set cc 100
OK
127.0.0.1:6379> object refcount aa
(integer) 4
127.0.0.1:6379>

redisObject数据结构中还有两个属性没有介绍,一个是ptr 一个是lru

ptr是一个对象指针,指向的就是该对象的底层实现数据结构,这个数据结构是由encoding属性决定的。

lru属性设计到一个对象空转时长的概念 object idletime命令可以得到某个键的空转时长,也就是这个命令多长时间没有被访问了,lru里记录的是最后一个被访问的时间

127.0.0.1:6379> object idletime aa
(integer) 1775
127.0.0.1:6379> object idletime bb
(integer) 1781
127.0.0.1:6379> object idletime cc
(integer) 1787
127.0.0.1:6379> set cc "zhangsan"
OK
127.0.0.1:6379> set cc "zhangsan"
OK
127.0.0.1:6379> object idletime cc
(integer) 3
127.0.0.1:6379> object idletime cc
(integer) 5
127.0.0.1:6379> object idletime cc
(integer) 6
127.0.0.1:6379> object idletime cc
(integer) 7
127.0.0.1:6379>

小编为你整理Redis的相关内容,可能有你需要的

Redis 的详细介绍:请点这里
Redis 的下载地址:请点这里

相关推荐