Redis 属于键值(key-value)数据库,键值数据库会使用哈希表存储键值和数据,其中 key 作为唯一的标识,而且 key 和 value 可以是任何的内容,不论是简单的对象还是复杂的对象都可以存储。键值数据库的查询性能高,易于扩展。
Redis 全称是 REmote DIctionary Server,从名字中你也能看出来它用字典结构存储数据,也就是 key-value 类型的数据。
Redis 的查询效率非常高,根据官方提供的数据,Redis 每秒最多处理的请求可以达到 10 万次。
Redis为什么会这么快?
主要有以下4点原因:
- Redis 采用 ANSI C 语言编写,它和 SQLite 一样。采用 C 语言进行编写的好处是底层代码执行效率高,依赖性低,因为使用 C 语言开发的库没有太多运行时(Runtime)依赖,而且系统的兼容性好,稳定性高。
- 此外,Redis 是基于内存的数据库,我们之前讲到过,这样可以避免磁盘 I/O,因此 Redis 也被称为缓存工具。
- 但 Redis 快的原因还不止这些,它采用单进程单线程模型,这样做的好处就是避免了上下文切换和不必要的线程之间引起的资源竞争。
- 在技术上 Redis 还采用了多路 I/O 复用技术。这里的多路指的是多个 socket 网络连接,复用指的是复用同一个线程。采用多路 I/O 复用技术的好处是可以在同一个线程中处理多个 I/O 请求,尽量减少网络 I/O 的消耗,提升使用效率。
Redis的数据类型
Redis 支持的数据类型包括字符串、哈希、列表、集合、有序集合等。
- 字符串类型是 Redis 提供的最基本的数据类型,对应的结构是 key-value。
- 字符串列表(list)的底层是一个双向链表结构,所以我们可以向列表的两端添加元素,时间复杂度都为 O(1),同时我们也可以获取列表中的某个片段。
- 字符串集合(set)是字符串类型的无序集合,与列表(list)的区别在于集合中的元素是无序的,同时元素不能重复。
- 有序字符串集合(SortedSet,简称 ZSET)。实际上 ZSET 是在集合的基础上增加了一个分数属性,这个属性在添加修改元素的时候可以被指定。每次指定后,ZSET 都会按照分数来进行自动排序,也就是说我们在给集合 key 添加 member 的时候,可以指定 score。
- 哈希(hash)提供了字段和字段值的映射,对应的结构是 key-field-value。如果想要给 user1 设置 username 为 zhangfei,age 为 28,可以写成:hset user1 username zhangfei hset user1 age 28
总计
NoSQL 数据库种类非常多,了解 Redis 是非常有必要的,在实际工作中,我们也经常将 RDBMS 和 Redis 一起使用,优势互补。 作为常见的 NoSQL 数据库,Redis 支持的数据类型比 Memcached 丰富得多,在 I/O 性能上,Redis 采用的是单线程 I/O 复用模型,而 Memcached 是多线程,可以利用多核优势。而且在持久化上,Redis 提供了两种持久化的模式,可以让数据永久保存,这是 Memcached 不具备的。