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

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


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

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
PL/SQL Developer 和 instantclient客户端安装配置 oracle的安装我就不写了,不会安装的网上随便找一个教程就能装上,安装起来比较简单。但是,PL/SQL Developer和instantclient客户端不好配置,容易出错,配置不好 PL/SQL Developer无法连接到oracle数据库。        1)安装Oracle 11g 64位 2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0) 下载 ins

053第478题 - 2015-08-06 17:08:26

478.Identify the two direct sources from where SQL plans can be loaded into the SQL plan baselines. (Choose two.) A. Cursor cache B. Stored outline C. SQL Tuning Set D. Automatic Workload Repository (AWR) snapshots Answer: AC You can evolve an existing SQ
declare @tablename nvarchar(80)   declare @cloumn nvarchar(80)   declare @sql nvarchar(400) declare c1 cursor scroll for  select table_name,column_name from information_schema.columns where DATA_TYPE='datetime'  open c1   fetch first from c1 into @tablenam

数据库索引学习 - 2015-08-06 17:08:12

一、索引介绍 数据库索引调优是一项技术活,不能仅仅靠理论,因为实际情况千变万化,而且各种数据库本身存在很复杂的机制,如查询优化策略和各种引擎的实现等。但同时这些理论是索引调优的基础,只有在明白理论的基础上,才能对调优策略进行合理推断并了解其背后的机制,然后结合实践中不断的实验和摸索。 索引其实就是在数据库存储数据之外,还维护着另外的满足某种查询算法的数据结构,这些数据结构再以某种方式指向真实的存储数据,然后在现有的数据结构上实现快速查询。(找了张很不错的二叉树的图来理解索引,现在大多的索引都是B+树的结构
一、如何开始模式设计 当我们说到模式(schema),要考虑以下内容: (1)这个表应该有多少个列族? (2)列族使用什么数据? (3)每个列族应该有多少列? (4)列名应该是什么?(尽管列名不必在建表时定义,但是读写数据时是需要知道的。) (5)单元存放什么数据? (6)每个单元存储多少个时间版本? (7)行键结构是什么?应该包括什么信息? 1.问题建模 一个特定列族的所有数据在HDFS上会有一个物理存储。这个物理存储可能由多个HFile组成,理想情况下可以通过合并得到一个HFile。一个列族的所有列在

rac下最简单归档开启方法 - 2015-08-06 16:08:45

原创作品,出自 “深蓝的blog” 博客, 深蓝的blog: http://blog.csdn.net/huangyanlong/article/details/47172639 本次先来介绍一下在rac环境下,开启归档的最简单的方法。 环境:oracle11g RAC 11.2.0.4   登陆sqlplus Last login: Wed Jul 29 09:25:43 2015 from 10.112.16.22 [root@hyldb1 ~]# su - oracle [oracle@hyldb1
mysql 5.5已经出来有一段时间,性能有明显提升,特别是对多核CPU的支持与TPS性能的提升。上周博主介绍了linux下编译安装mysql 5.5的步骤,安装不出意外基本没有问题。不过可能很多朋友和我一样一直用的是mysql 5.1,现在想把数据库升级成5.5了。博主根据实际操作,记录这次升级操作。 mysql基础信息 1、安装目录 [root@vm-199~]# /usr/local/mysql 2、配置文件 [root@vm-199~]# /etc/my.cnf 3、数据目录 [root@vm-1
1. 关于Data Guard日志接收的总结: 备库的RFS进程接收到日志后,就把日志写到standby redo log或者archived log file文件中。 而归档日志会被放在什么位置取决于standby database归档路径的选择, 如果配置了standby_archive_dest,则使用这个参数指定的目录; 如果配置了log_archive_dest_n,该参数明确定义了VALID_FOR=(STANDBY_LOGFILE,*),则使用这个参数指定的目录; 如果数据库的COMPATI

初步了解EF - 2015-08-06 16:08:49

         EF:EntityFrameWork,是一种框架(所谓的框架可以理解为直接的使用别人已经写好的代码),而且这种框架是一种ORM框架(Object/Relation Mapping)。          首先说一下现阶段我自己是如何理解EF的,EF是利用面向对象的思想对数据库进行操作,它可以将数据库中的表生成一个实体对象,而表中的字段就对应的生成实体的属性,这样在程序中操作数据库是就可以直接利用面向对象的思想编写代码这样就可以不使用SQL语句。这样说的话就是通过用面向对象的思想通过EF操作
一直有耳闻MySQL5.5的性能非常NB,所以近期打算测试一下,方便的时候就把bbs.kaoyan.com升级到这个版本的数据库。今天正好看到一篇有关my.cnf优化的总结,虽然还没经过我自己的实践检验,但从文章内容来说已经写的很详细了(当然,事实上下面这篇文章很多地方只是翻译了my.cnf原始配置文件的说明,呵呵),所以特地转载收藏一下,大家在对mysql服务器进行优化的时候可以作为参考,并根据实际情况对其中的一些参数进行调整。(特别备注:以下原文中有些参数事实上不适用于mysql5.5,不知道原作者是