欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

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

程序员文章站 2022-06-15 15:07:20
...

我们在使用Redis的时候,直接接触到的是字符串对象(String),列表对象(List),哈希对象(Hash),集合对象(Set),有序集合

我们在使用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的相关内容,可能有你需要的:

Ubuntu 14.04下Redis安装及简单测试

Redis集群明细文档

Ubuntu 12.10下安装Redis(图文详解)+ Jedis连接Redis

Redis系列-安装部署维护篇

CentOS 6.3安装Redis

Redis安装部署学习笔记

Redis配置文件redis.conf 详解

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

本文永久更新链接地址