复述,五种类型介绍

  

1只;复述,最适合所有数据in-momory的场景,虽然复述,也提供持久化功能,但实际更多的是一个磁盘支持的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎复述,更像一个加强版的Memcached,那么何时使用Memcached,何时使用复述呢?

,,,,,,如果简单地比较复述与Memcached的区别,大多数都会得到以下观点:

,,,,1,复述,不仅仅支持简单的k/v类型的数据,同时还提供列表,设置,zset,散列等数据结构的存储。
,,,,2,复述,支持数据的备份,即主从模式的数据备份。
,,,,3,复述,支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用

复述最为常用的数据类型主要有以下:

<李>字符串

<李>

哈希

<李>

列表组<李>

<李>

排序设置

<李>

pub/sub

<李>交易

在具体描述这几种数据类型之前,我们先通过一张图了解下复述,内部内存管理中是如何描述这些不同数据类型的:

复述,五种类型介绍

首先复述,内部使用一个redisObject对象来表示所有的键和值,redisObject最主要的信息如上图所示:

,,,,类型,代表一个值对象具体是何种数据类型,

,,,,,编码是不同数据类型在复述,内部的存储方式,

,   ,,,   ,比如:type=字符串代表值存储的是一个普通字符串,那么对应的编码可以是原始或者是int,如果是int则代表实际   复述,内部是按数值型类存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示,比如:“123”“456”这样的字符串。

,   ,,   ,这里需要特殊说明一下vm字段,只有打开了复述的虚拟内存功能,此字段才会真正的分配内存,该功能默认是关闭状态的,该功能会在后面具体描述。通   过上图我们可以发现复述,使用redisObject来表示所有的键/值数据是比较浪费内存的,当然这些内存管理成本的付出主要也是为了   给复述,不同数据类型提供一个统一的管理接口,实际作者也提供了多种方法帮助我们尽量节省内存使用,我们随后会具体讨论。

下面我们先来逐一的分析下这7种数据类型的使用和内部实现方式:

<李>

字符串:

,, 12月,增加,mget等。

,

<强>应用场景:字符串是最常用的一种数据类型,普通的键/值存储都可以归为此类。即

<李> <李>

<李>

<李>

<李>

<李>

<强>实现方式:字符串在复述,内部存储默认就是一个字符串,被redisObject所引用,当遇到增加,12月等操作时会转成数值型进行计算,此时redisObject的编码字段为int。


<李>

哈希

<强>常用命令: hget, hset, hgetall等。

<强>应用场景:

,,,,我们简单举个实例来描述下哈希的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息:

用户ID为查找的钥匙,存储的价值用户对象包含姓名,年龄,生日等信息,如果用普通的键/值结构来存储,主要有以下2种存储方式:

复述,五种类型介绍

第一种方式将用户身份证作为查找钥匙,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入中科院等复杂问题。

复述,五种类型介绍

第二种方法是这个用户信息对象有多少成员就存成多少个键-值对儿,用用户身份证+对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。

那么复述,提供的哈希很好的解决了这个问题,复述的哈希实际是内部存储的值为一个HashMap,并提供了直接存取这个映射成员的接口,如下图:

复述,五种类型介绍