我们在使用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对象的数据结构:
<span style="font-size:14px;">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;</span>
其中type属性是记录对象的类型,可以是REDIS_STRING REDIS_LIST REDIS_HASH REDIS_SET REDIS_ZSET 这五个常量
可以使用命令type来查看一个键属于什么类型,如下:
<span style="font-size:14px;">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></span>
另外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>
======================================================================================================
版权声明:本文为博主原创文章,未经博主允许不得转载。