Redis系列(2)—— 概述
是什么让Redis变得特殊?他解决了什么样的问题?开发者需要注意些什么?在我回答这些问题之前,我们需要理解什么是Redis。
Redis通常被描述成内存中key-value的数据库。我认为那是一个不准确的描述。Redis把所有数据放到内存中(大部分以字节形式),并且把数据持久化在磁盘上,这比简单的key-value存储多多了。你不要站在这错误的观点上,否则你对Redis的观点和解决问题都是狭隘的。
事实上Redis暴露出5个不同的数据结构,其中之一是key-value的结构。了解这5个数据结构,他们怎么工作的,他们有什么样的方法,你能怎么用这些建立你们的模型才是关键,首先了解下数据结构。
如果我们使用一种数据结构来描述关系世界,我们大概会说数据库中的一个结构table。Tables复杂并且比较灵活,没有什么你不能模拟,存储,操作的。然而他也有一些本质上的缺点。特别是,不是所有的都是简单或者快速的。如果想要一个结构适用所有的结果,我们是不是要使用一个专门的结构呢?有一些事情我们不能做至少到现在我们做的不好,但是我们要增加简单性和效率。
用特殊的数据结构对待专门的问题?我们应该怎么code?你不能在每块数据用hashtable,也不能用标量变量。对于我,那就是定义Redis的途径。如果你正在处理标量,链表,哈希表,集合,为什么不把他存成标量,链表,哈希表,结合?为什么我们检查一个是否存在那么复杂的去调一个 exists(key),他的时间复杂度远大于O(1)
The BUilding Blocks
Redis有一个你熟悉的基础概念就是database。一个database包含一个数据的集合。一个数据库经典的案例就是把一个应用的所有数据与另一个应用的数据分开。
在Redis,database被简单的定义为一个数字,默认的数字是0。如果你想换到不同的数据库你可以通过 select 命令。在终端里,敲入 select 1
,Redis会回应OK的信息和一个类似127.0.0.1:6379[1]>
的信息.如果你想换会默认数据库,只需要敲select 0
在终端。
Commands,Keys and Value
当Redis不仅仅是Key-Value的存储,在核心,5个数据结构中的每一个都至少有一个Key和value。在继续学习其他知识前这是有必要了解Key和value的。
Kyes是你如何识别一块数据。我们将会用keys操作,但是现在,最好了解一个key类似 users:leto。人们完全有理由期待这样一个key包含一个user名为leto的信息。冒号没有什么特殊的含义,但是用分隔符是通常人们组织他们的keys。
Values代表与key有关的实际的数据。他们能是任何数据。有些时候你需要要存储字符串,有时候是整型,有时候需要存储序列化结构(JSON,XML或者其他格式)。对于大多数,Redis对待values是一个字节数组,他不关心具体是什么。注意不同的驱动处理序列化是不同的,所以在这教程中我们只谈论字符串,数字,和JSON。
我们输入下面代码:
set users:leto ”{name: leto, planet: dune, likes: [spice]}”
这是一个基本的Redis的命令。首先我们有一个真实的命令:set。后面是他的参数。set命令有2个参数:一个是我们设置的key,另一个是key对应设置的value。大多数,但不是所有都需要key(如果这么多,通常是第一个参数)。你能猜到怎么获得value?希望你能说(不确定也不要担心):
get users:leto
我们继续用一些新的组合。Keys和Value是一些基本的概念,
查询
当我们继续时,需要了解2件事。对于Redis,Keys就能得到一切,values什么也得不到。或者换种说法,Redis不允许你查询一个object的value。在上面的例子我们不能找到user(s) 那个住在planet dune。
对于许多人来说,这是会引起一些不适应。我们现在的查询数据是那么灵活和强大,但是Redis的查询方法似乎有点原始和不实用。不要动摇。记住,Redis不是一个适用于所有结构的方案。有些不能放在这,因为查询的限制。所以考虑这样的因素,你就要好好设计的model。
我们会看一些具体例子,但是重要的是了解Redis的基础。了解后能帮助我们理解为什么value是任何值了—- Redis从不需要了解他们是什么。同时他也能帮助我们思考新的模型。
内存和持久化
我之前提到Redis是内存中持久化存储。
为了实现持久化,默认的Redis是把所有变化keys快照到硬盘上。你能配置如果X数量的keys改变,在Y秒内。Redis会保存数据库从每60秒内至少1000或更多的Keys改变到15分钟内9个或更少的keys改变。
另外Redis可以以增量的模式。一旦有一个key改变,一个增量的文件会更新到硬盘上。在一些特殊的情况下会丢失60秒的数据,为了换取一些性能。有时候这样的丢失数据是不可能接受的。Redis给了一些选项。在第六章的时候你会看到第三种选项,在从设备上持久化。
相对于内存,Redis把所有的数据放在内存中。这事Redis运行的最明显的成本:内存在服务器硬件还是很贵的。我觉得一些开发者不能确定一个数据占多少空间。莎士比亚全集大概占5.5MB。Redis能帮你压缩到2MB.
Redis支持虚拟内存,然后这个功能不建议使用。
总结到一起 ƒ
我们触及到了一些高等级的主题。在使用Redis之前我想把这些主题总结一下。特别是查询限制,数据结构和在内存中存储数据。
当你把这三个结合到一起,你应该想到速度了。一些人会说‘当然快了,因为所有的都在内存里’。但这只是其中的一部分。真正的原因就是他的特殊的数据结构。
到底有多快?这要依据很多事—哪个明了你用了,数据的类型等等。但是Redis的性能可以在成百上千或者成千上万次每秒。你可以运行 redis-benchmark
(和redis-server和redis-cli同一个目录下)自己测试下。
了解Redis的趋势非常重要,因为它会影响你如何与它进行交互。有sql开发经验的开发者,通常他们对数据库所做工作的数量减至最少。对所有系统包括Redis而言这是一个好的忠告。然而考虑到我们正在处理简单的数据结构,我们就要通过多次调用Redis来达到目标。这样获得数据的模式开始有些不适应,但是在现实中,跟性能比,这些消耗是无关紧要的。
小结
我们已经了解了一些Redis。如果不太清楚想查询请不要担心。在下一章,我们会亲手操作,遇到的问题基本上都能解答。 下面是这章的重点:
- Keys是定义数据(Values)的字符串
- Values是字节数组,Redis不关心具体是什么
- Redis有五个数据结构
- 综合上述,Redis速度快,方便使用。但是不适合所有情景
参考推荐:
BloomFilter + Redis 大数据去重策略的实现
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2019-09-08 15:20:40
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!
转载注明: Redis系列(2)—— 概述 (米扑博客)