码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-29 01:05:08      阅读:166      评论:0      收藏:0      [点我收藏+]

标签: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对象的数据结构:

<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>

======================================================================================================


版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:redis   五种对象   对象共享   内存回收   空转时长   

原文地址:http://blog.csdn.net/zhaozonglu/article/details/47113497

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!