内存中重新分配键值数据存储介绍


我一直在考虑深入研究NoSQL 数据库,但不确定我应该从哪一个开始。有一个lot of NoSQL databases在市场上,每个人解决一系列问题。我想学习一个NoSQL数据库,它没有陡峭的学习曲线,并且足够通用,可以解决不止一个问题。所以,当我找到我的出发点时,我开始研究不同的NoSQL数据库:Redis

Redis是一个内存中的键值数据存储,由Salvatore Sanfilippo。Redis不仅支持字符串数据类型,还支持列表、集合、排序集合、散列数据类型,并提供了一套丰富的操作来处理这些类型。如果你曾与Memcached(内存中的对象缓存系统)你会发现它非常相似,但是Redis是Memcached++的。Redis不仅支持丰富的数据类型,还支持data replication 并且可以将数据保存在磁盘上。Redis的主要优势是:

  1. 异常快:Redis非常快,可以执行大约110000 SETs per second, about 81000 GETs per second。您可以使用redis-基准用于在您的机器上执行相同操作的实用程序。
  2. 支持丰富的数据类型:Redis本机支持大多数开发人员已经知道的大多数数据类型,如列表、集合、排序集合、哈希。这使得解决各种问题变得非常容易,因为我们知道哪种数据类型可以更好地处理哪个问题。
  3. 操作是原子的:所有的Redis操作都是原子的,这确保了如果两个客户端同时访问Redis服务器,将会得到更新的值。
  4. 多实用工具:Redis是一个多实用工具,可以在许多情况下使用,比如缓存、消息队列(Redis本身支持Publish/ Subscribe),应用程序中任何短暂的数据,如web应用程序会话、网页点击次数等。有很多人在使用Redis,他们可以在http://redis.io/topics/whos-using-redis

Redis入门

从Redis开始是非常容易的。在Unix盒子上:

  • 您可以克隆git repository或者download and unpack the tar
  • 打开一个新的终端,转到您克隆或解压缩Redis的目录,并发出make命令。
  • 奔跑。/src/redis-服务器这将使用默认配置启动Redis服务器。
  • 打开一个新的终端并键入。/src/redis-cli这将启动您用来与Redis服务器一起工作的Redis客户端。

对于窗口用户

  • 从下载Redisdmajkic git repository
  • 提取zip文件,并在路径中添加< redis路径> \ redis-2 . 1 . 8 \ 64位。
  • 打开一个新的命令外壳并键入redis-服务器
  • 打开一个新的命令外壳并键入redis-cli

我是一个视窗用户,所以我写这篇文章的基础上,从最新的再贴现发行dmajkic git repository。一旦服务器和客户端都运行了,您就可以运行一些命令,如下图所示

redis&gt; pingPONGredis&gt; inforedis_version:2.1.8redis_git_sha1:00000000redis_git_dirty:0arch_bits:64....

如果您能够成功运行所有命令,那么这意味着您的Redis安装完成。如果你不想在你的机器上下载并安装Redis,你可以从浏览器中尝试Redishttp://try.redis-db.com/

让我们看看它的数据类型

Redis支持的数据类型有字符串、列表、集合、排序集合和哈希。我现在将简要地谈论不同的Redis类型,并使用redis-cli

用线串

字符串是Redis支持的基本数据类型。您可以设置键的字符串值,也可以使用设置和获取命令获取键的字符串值。

redis> set firstname shekharOKredis> set lastname gulatiOKredis> get firstname"shekhar"redis> get lastname"gulati"

还有很多其他的操作,比如追加、获取范围、最小均方误差、长度等。可用于字符串。你可以找到整个列表here。如果您的键的值是整数,那么您可以使用DECR、DECRBY、INCRBY或INCR,它们允许您增加和减少值。这些在你想要保持一个网页点击次数的情况下非常有用。

redis> incr hitcounter(integer) 1redis> incr hitcounter(integer) 2redis> incr hitcounter(integer) 3redis> decr hitcounter(integer) 2


列表

列表是一个有序的集合,您可以在其中添加任意数量的元素。元素可以是唯一的,也可以是非唯一的。除了从列表中添加和获取元素,Redis还支持很多列表操作,如弹出、推送、范围等。您可以找到完整的命令列表here。让我们举一个例子,我们想要维护一个单词列表(唯一性并不重要),我们想要得到我们在系统中添加的最后3个单词。

redis> LPUSH words austerity(integer) 1redis> LPUSH words socialism(integer) 2redis> LPUSH words moritorium(integer) 3redis> LPUSH words socialism(integer) 4redis> LPUSH words socialism(integer) 5redis> LRANGE words 0 21) "socialism"2) "socialism"3) "moritorium"

需要注意的一点是,在Redis中,列表是从零开始的。

设置

集合是二进制字符串的无序集合。要将元素添加到集合中,可以使用SADD命令;要获取集合中的所有成员,可以使用SMEMBERS命令。您可以找到设置命令的完整列表here。让我们举一个例子,我们希望维护一个系统中添加的所有唯一单词的集合。

redis> SADD uniquewords austerity(integer) 1redis> SADD uniquewords pragmatic(integer) 1redis> SADD uniquewords moritorium(integer) 1redis> SADD uniquewords socialism(integer) 1redis> SADD uniquewords socialism(integer) 0

正如你所看到的,因为我们使用了集合,我们不能两次添加同一个词(社会主义)。

排序集

排序集是可以根据分数进行排序的集。所以每次你给集合增加一个值,你就提供一个分数,用来排序。例如,我们想根据单词的长度对它们进行分类。

redis> ZADD wordswithlength 9 austerity(integer) 1redis> ZADD wordswithlength 7 furtive(integer) 1redis> ZADD wordswithlength 5 bigot(integer) 1redis> ZRANGE wordswithlength 0 -11) "bigot"2) "furtive"3) "austerity"

 

还有很多其他有用的命令可以找到here

哈希

哈希允许您根据哈希存储键值对。这在希望保存具有多个属性的对象的情况下非常有用。

redis> HSET user:1 name shekhar(integer) 1redis> HSET user:1 lastname gulati(integer) 1redis> HGET user:1redis> HGET user:1 name"shekhar"redis> HGETALL user:11) "name"2) "shekhar"3) "lastname"4) "gulati"

没有解决的问题

除了提供所有这些数据类型,Redis还支持事务和发布/订阅。我将在以后的帖子中谈论这些特性。

我们将在我将来关于Redis的文章中更深入地研究这些数据类型,我们将使用Redis作为数据存储来构建一个字典应用程序。我将使用春季数据再版支持与再版互动。对Redis的春季支持也是我考虑使用Redis的原因之一。