redis学习(八)——redis应用场景

论坛 期权论坛     
选择匿名的用户   2021-5-30 02:30   90   0
<div class="blogpost-body" id="cnblogs_post_body">
<p>     毫无疑问,<span class="wp_keywordlink_affiliate">Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象构建不同的冰箱。希望你喜欢这个比喻。</span></p>
<p><strong><span class="wp_keywordlink_affiliate">一、Redis常用数据类型</span></strong></p>
<p>Redis最为常用的数据类型主要有以下五种:</p>
<ul><li>String</li><li>Hash</li><li>List</li><li>Set</li><li>Sorted set</li></ul>
<p>在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部内存管理中是如何描述这些不同数据类型的:</p>
<p><img alt="" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-6f1c81576409939186a3189dd833c68c.jpg"></p>
<p>     首先Redis内部使用一个redisObject对象来表示所有的key和value,redisObject最主要的信息如上图所示:type代表一个value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式,比如:type&#61;string代表value存储的是一个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际redis内部是按数值型类存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示,比如:&#34;123&#34; &#34;456&#34;这样的字符串。</p>
<p>    这里需要特殊说明一下vm字段,只有打开了Redis的虚拟内存功能,此字段才会真正的分配内存,该功能默认是关闭状态的。通过上图我们可以发现Redis使用redisObject来表示所有的key/value数据是比较浪费内存的,当然这些内存管理成本的付出主要也是为了给Redis不同数据类型提供一个统一的管理接口,实际作者也提供了多种方法帮助我们尽量节省内存使用,我们随后会具体讨论。</p>
<p><strong>二、各种数据类型应用和实现方式</strong></p>
<p>下面我们先来逐一的分析下这五种数据类型的使用和内部实现方式:</p>
<p><strong>1、String</strong></p>
<p>String <span style="font-family:&#39;宋体&#39;;">数据结构是简单的key-value<span style="font-family:&#39;宋体&#39;;">类型,value<span style="font-family:&#39;宋体&#39;;">其实不仅是String<span style="font-family:&#39;宋体&#39;;">,也可以是数字。</span></span></span></span></p>
<p><strong>常用命令</strong>:get、set、incr、decr、mget等。</p>
<p><span class="s2"><strong>应用场景:</strong>String是最常用的一种数据类型,普通的key/ value 存储都可以归为此类,即可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受Redis的定时持久化,操作日志及 Replication等功能。除了提供与 Memcached 一样的get、set、incr、decr 等操作外,Redis还提供了下面一些操作:<span style="line-height:1.5;"> </span></span></p>
<ul><li>获取字符串长度</li><li>往字符串append内容</li><li>设置和获取字符串的某一段内容</li><li>设置及获取字符串的某一位(bit)</li><li>批量设置一系列字符串的内容</li></ul>
<p><span style="font-size:14px;"><strong>使用场景:</strong><span style="background:#FFFFFF;">常规<span style="background:#FFFFFF;">key-value<span style="background:#FFFFFF;">缓存应用。</span></span></span><span style="font-family:&#39;宋体&#39;;">常规计数: 微博数, 粉丝数。</span></span></p>
<p><strong>实现方式:</strong>String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。</p>
<p><strong>2、Hash</strong></p>
<p><strong>常用命令:</strong>hget,hset,hgetall 等。</p>
<p><strong>应用场景:</strong></p>
<p>我们简单举个实例来描述下Hash的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息:</p>
<p>用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,主要有以下2种存储方式:</p>
<p><img alt="" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-74e4a0ee1859383c3d4aa35f8fa4e99b.jpg"></p>
<p>    第一种方式将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。</p>
<p><img alt="" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-3ee59e8bd4911e218a42fefb944c6d20.jpg"></p>
<p>    第二种方法是这个用户信息对象有多少成员就存成多少
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP