redis之八对象

来源:互联网 发布:js同步和异步的理解 编辑:程序博客网 时间:2024/06/05 14:19

1 对象

Redis并没有直接使用简单的数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统。这个系统包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到至少一种数据结构。

Redis的对象系统还实现了基于引用计数技术的内存回收机制,当程序不再使用某个对象时候,这个对象所占用的内存就会被自动释放,另外Redis通过引用计数技术实现了对象共享机制。

Redis的对象带有访问时间记录信息,该信息可以用于计算数据库键的空转时长,在服务器启用了maxmemory功能的情况下,空转时长较长的那些键可能会优先被服务器删除。

2 对象的类型和编码

Redis使用对象标识数据库中的键和值,每次当我们在Redis的数据库中添加一个键值对,我们需要至少创建两个对象,一个对象用作键值对的键,另一个作为键值对的值。

2.1类型

当我们对一个数据库键执行TYPE命令时,命令返回的结果为数据库键对应的值对象的类型,不是键对象的类型,键对象的类型只能是字符串对象。

2.2 编码与底层实现

对象的指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定。Encoding属性记录了对象所使用的编码,也即是说这个对象使用了什么数据结构作为对象的底层实现。通过encoding属性来设置对象所使用的编码,而不是为特定类型的对象关联一种固定的编码,极大地提高了Redis的灵活性和效率,因为Redis可以根据不同的使用场景来为一个对象设置不同的编码,从而优化对象在某一个场景下的效率。

3 编码的转换

Redis对于每一种的对象(字符串对象、哈希对象、集合对象、有序集合对象等)的存储结构都不是固定的,不同的存储结构对于数据量和数据格式都有一定要求,当满足这些条件时,为了提高存储效率和查询效率等,Redis就会自动地把一种存储结构的对象转换为另一种存储结构的而对象。

4 类型检查与命令多态

4.1 类型检查

为了确保只有指定类型的键可以执行某些特定的命令,在执行一个类型特定的命令之前,Redis会先检查输入键的类型是否正确,然后再决定是否执行给定的命令。

4.2 多态命令的实现

Redis除了会根据值对象(一个对象的实现基础的数据结构不只一种)的类型来判断键是否能够执行指定命令之外,还会根据值对象的编码方式,选择正确的命令实现代码来执行命令。

5 内存回收

Redis在自己的对象系统中构建了一个引用计数技术来实现的内存回收机制,通过这一机制,程序可以通过跟踪对象的计数信息,在适当的时候自动释放对象并进行内存回收。

6 对象共享

通过对象引用计数技术来实现对象的共享。目前来讲,Redis会在初始化的时候,创建一万个字符串对象(0~9999),方服务器需要用到值时,服务器就会用这些共享对象,而不是创建新的对象。

7 对象空转时长

Redis的对象包含的最后一个属性是lru属性,该属性记录了对象最后一次被命令程序访问的时间。当服务器打开了maxmemory选项,并且服务器由于回收内存的方法是和lru相关的时候,那么当服务器占用的内存数超过了maxmemory选项所设置的上限值时,空转时长较高的那部分会优先被服务器释放,从而回收内存。

8 对象和结构的关系

对象

数据结构

字符串对象

1,Int   2,raw ,3,embstr

列表对象

1,ziplist  2,linkedlist

哈希对象

1,ziplist  2,hashtable

集合对象

1, inset  2,hashtable

有序集合对象

1,ziplist  2,skiplist

 

0 0
原创粉丝点击