教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Redis常见五种数据对象详解

Redis常见五种数据对象详解

发布时间:2022-01-17   编辑:jiaochengji.com
教程集为您提供Redis常见五种数据对象详解等资源,欢迎您收藏本站,我们将为您提供最新的Redis常见五种数据对象详解资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg><h2>五种常见数据对象</h2> <ol><li>字符串对象</li><li>列表对象</li><li>哈希对象</li><li>集合对象</li><li>有序集合对象</li></ol><blockquote>

Redis中每个对象都有一个RedisObject结构表示,该结构具体如下:

</blockquote> <pre><code class="lang-go hljs">typedef <span class="token keyword">struct</span> redisObject <span class="token punctuation">{</span> <span class="token comment">// 对象的类型,字符串/列表/集合/哈希表</span> unsigned <span class="token keyword">type</span><span class="token punctuation">:</span><span class="token number">4</span><span class="token punctuation">;</span> <span class="token comment">// 未使用的两个位</span> unsigned notused<span class="token punctuation">:</span><span class="token number">2</span><span class="token punctuation">;</span> <span class="token comment">/* Not used */</span> <span class="token comment">// 编码的方式,Redis 为了节省空间,提供多种方式来保存一个数据</span> unsigned encoding<span class="token punctuation">:</span><span class="token number">4</span><span class="token punctuation">;</span> <span class="token comment">// 当内存紧张,淘汰数据的时候用到</span> unsigned lru<span class="token punctuation">:</span><span class="token number">22</span><span class="token punctuation">;</span> <span class="token comment">/* lru time (relative to server.lruclock) */</span> <span class="token comment">// 引用计数</span> <span class="token builtin">int</span> refcount<span class="token punctuation">;</span> <span class="token comment">// 数据指针</span> void <span class="token operator">*</span>ptr<span class="token punctuation">;</span> <span class="token punctuation">}</span> robj<span class="token punctuation">;</span> </code></pre> <h3>
字符串对象</h3> <blockquote>

字符串对象可以是int、raw、embstr

</blockquote>

如果字符串对应保存的是一个整型数据,则编码方式设置为int
如果字符串对象保存的是一个字符串

<ol><li>长度大于39个字节,则使用SDS来保存当前字符串,并将对象编码格式设置为raw</li><li>长度小于39个字节,则将对象编码格式设置为embstr。</li></ol><blockquote>

embstr与raw的区别
embstr是专门用于保存短字符串的一种编码方式,这种编码和raw编码一样都是使用RedisObjecthe和sdshdr结构表示字符串,但是raw会调用两次内存分配函数分别创建RedisObjecthe和sdshdr结构,而embstr则通过一次内存分配函数创建

</blockquote>

字符串常用命令 SET、GET

<h3>
列表对象</h3> <blockquote>

列表对象的编码可以是ziplist或者linkedlist

</blockquote> <ol start="3"><li>ziplist编码的列表对象可以是使用压缩列表作为底层实现每个压缩列表保存一个列表元素</li><li>linkedlist编码的列表对象使用双端列表作为底层实现,每个双端链表节点(node)都保存了一个字符串对象,每个字符串对象保存了一个列表元素</li></ol>

字符串对象是Redis五种类型对象当中唯一一种会被其他四种对象嵌套使用的对象

编码转换
列表对象满足一下两个条件时,使用ziplist编码

<ol><li>列表对象保存的所有字符串元素的长度都小于64字节;</li><li>列表对象保存的元素数量小于512个;</li></ol>

不能满足以上两个条件的列表对象都需要使用linkedlist编码

列表对象常用命令 LPUSH、RPUSH、LPOP、RPOP

<h3>
哈希对象</h3> <blockquote>

哈希对象编码可以使用ziplist或者hashtable

</blockquote>

编码转换

当哈希对象可以满足一下两个条件时,哈希对象使用ziplist编码

<ol><li>哈希对象保存的键值对的键和值的字符串长度都小于64个字节;</li><li>哈希对象保存的键值对的数量小于512个;</li></ol>

不能满足以上两个条件的哈希对象则使用hashtable编码

哈希对象常用的命令HSET、HGET

<h3>
集合对象</h3> <blockquote>

集合对象的编码使用的可以是intset或者hashtable

</blockquote>

编码转换
当集合对象满足一下两个条件时,对象使用intset编码

<ol><li>集合对象所有元素都是整型</li><li>集合对象保存的元素数量不超过512个</li></ol>

不能满足这两个条件的集合对象使用hashtable编码

集合常见命令:SCARD、SPOP

<h4>
有序集合对象</h4> <blockquote>

有序集合的编码可以是ziplist和skiplist

</blockquote>

压缩列表内的集合元素按照分值大小进行排序,分值比较小的元素被放置在靠近表头的位置,而分值比较大的元素则被放置到靠近表尾的位置

skiplist编码的有序集合对象使用zset机构作为底层实现,一个zset机构同时包含一个字典和一个跳跃表

编码转换

当有序集合对象满足一下两个条件时,对象使用ziplist编码

<ol><li>有序集合保存元素数量小于128个</li><li>有序集合保存的所有元素成员长度都小于64字节</li></ol>

不能满足以上两个条件集合的有序集合对象使用skiplist编码

有序集合常见命令ZADD、ZCARD、ZREM

Redis对象内存回收

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

Redis在初始化服务器时,创建一万个字符串对象,这些对象包含了从0到9999的所有整型值,当服务器需要从0到9999的字符串对象时候,服务器就会使用这些共享对象,而不是创建新的对象

redis关于内存回收,采用了lru算法,根据当前对象的lru 参数值来进行淘汰计算。

到此这篇关于“Redis常见五种数据对象详解”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
三分钟读懂redis数据库
redis基础问答
Redis常见五种数据对象详解
超全的!Redis的安装和基础操作
PHP操作Redis数据库常用方法(总结)
PHP操作Redis数据库常用方法
redis list操作_闲扯Redis四 : List数据类型底层编码转换
PHP常见并发场景的解决方法
PHP-redis中文帮助文档
Redis缓存之Set使用及redis遇到的一些问题

[关闭]
~ ~