Reids 是一个开源的高性能键值对数据库。它通过多种键值数据类型来适应不同场景下的存储需求,并借助许多高层级的接口使其可以胜任如缓存、队列系统等不同的角色。
1.Reids的诞生
Redis到底是在什么情况下诞生的,我们才能知道我们为什么要用它。现在就来简单说说它的历史。
两个时间点2008年和2009年。
2008年一家意大利的创业公司 Merzia的创始人Salvatore Sanfilippo 在推出一款基于 MySQL 的网站实习统计系统 LLOOGG时 发现 MySQL 的性能很让人失望,于是人家就自己亲自为自家产品量身定做了一个数据库就是Redis,并于2009年开发完成并开源发布。没想到其良好的性能吸引了大量的用户来使用 Redis,在一分数据库的使用情况调查表中,显示有近12%的公司在使用Redis。国内如新浪微博、街旁和知乎,国外如 GitHub、Stack Overflow等等都是Redis的用户。
2. 为什么用它(特性)
下面就说一下究竟它的优点是什么,吸引了如此庞大的用户 ???
2.1 存储结构
Redis 是 REmote DIctionary Server (远程字典服务器)的缩写,它以字典结构存储数据,并允许其他应用通过TCP 协议读写字典中的内容。
例如:
dict["key"] = "value"
中dict是一个字典结构变量,字符串"key"是键名,而"value"是键值,在字段中我们可以获取或设置键名对应的键值,也可以删除一个键。
数据类型
到目前为止Redis支持的键值数据类型如下:
- 字符串类型
- 散列类型
- 列表类型
- 集合类型
- 有序集合类型
这种字典类型的存储结构与常见的 MySQL 等关系数据库的二维表形式的存储结构有很大的差异。
例如:我们需要使用 model 变量 存储一篇文章的数据(包括标题、正文、阅读量和标签):
model["title"] = "language"
model["content"] = "Balabala"
model["view"] = 0
model["tags"] = ["PHP","Ruby","Node.js"]
如果我们需要把这片文章的数据存储到数据库中,并且要求可以通过标签检索出文章。如果使用关系数据库的存储,一般会将标题、正文和阅读量存储在一个表中,而将标签存储在另一个表中,然后再使用第三个表连接接文章和标签表。需要查询时海的将三个表进行连接,不是很直观。
而Redis 字典结构的存储方式和对多种简直数据类型的支持使得开发者可以将程序中的数据直接映射到Redis中。
使用Redis的另一个优势是其对不用的数据类型提供可非常方便的操作方式,如使用集合类型存储文章标签,Redis 可以对标签进行如交集、并集这样的集合运算。
2.2 内存存储与持久化
Redis 数据库中所有数据都存储在内存中。由于内存的读写速度快于硬盘,因此Redis在性能上对比其他基于硬盘存储的数据库有非常明显的优势,在一台普通的笔记本电脑上,Redis可以在一秒内读写超过十万个键值。
将数据存储在内存中也有问题,例如,程序推出后内存中的数据会丢失。不过Redis提供了对持久化的支持,即将可以内存中的数据异步写入到硬盘中,同时不影响继续提供服务。
2.3 功能丰富的多面手
Redis 虽然是作为数据库开发的,但是还有本多人将其用作缓存、队列系统等来使用。
Redis 可以为每个键设置生存时间(TimeToLive, TTL),生存时间到期后会自动被删除。这以功能配合出色的性能让Redis可以作为缓存系统来使用。
作为缓存系统,Redis 还可以限定数据占用的最大内存空间,子啊数据达到空间限制后可以以按照一定的规则自动淘汰不需要的键。
除此之外,Redis 的列表类型键可以用来实现队列,并可支持阻塞式读取,可以很容易得实现一个高性能的优先级对列。同时在更高层面上,Redis海支持"发布/订阅"的消息模式,可以基于此构建聊天室等系统。
2.4 简单稳定
例如: 在关系数据中要获取 model 表中 id为 1的记录title 的字段的值使用SQL语句实现:
SELECT title FROM model WHERE id = 1 LIMIT 1
使用Redis中要读取键名为 model:1 的散列类型键的 title字段的值,可以使用如下命令:
HGET model:1 title
其中HGET就是一个命令。Redis 提供了一百多个命令,但是常用的只有几十个而且非常容易记忆。
Redis提供了几十种不同变成语言的客户端库,这些库都很好的封装了Redis的命令,使得在程序中与 Redis 进行交互变得很容易。
Redis 使用C语言开发,代码量只有3万多行。这降低了用户通过修改 Redis源代码来之更适合自己项目需要的门槛。对与希望“榨干”数据库性能开发者而言,这无疑是一个很大的吸引力。
Reddis的开源使得Redis具有良好的开发分为和严谨的版本发布机制,这让Redis的稳定版本非常可靠。
Redis的优势
总结一下:
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制的字符串、列表、哈希值、集合和有序集合等数据类型操作。
- 丰富的特性 – Redis还支持 发布/订阅, 通知, key 过期等等特性。
- 内存存储与持久化,数据可靠不丢失
- 简单稳定