Redis 是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库
Redis 为什么这么快?
基于内存实现
Redis 是基于内存的数据库,那不可避免的就要与磁盘数据库做对比。对于磁盘数据库来说,是需要将数据读取到内存里的,这个过程会受到磁盘 I/O 的限制。
而对于内存数据库来说,本身数据就存在于内存里,也就没有了这方面的开销。
高效的数据结构
Redis 中有多种数据类型,每种数据类型的底层都由一种或多种数据结构来支持。正是因为有了这些数据结构,Redis 在存储与读取上的速度才不受阻碍。
合理的数据编码
对于每一种数据类型来说,底层的支持可能是多种数据结构,什么时候使用哪种数据结构,这就涉及到了编码转化的问题。
那我们就来看看,不同的数据类型是如何进行编码转化的:
String:存储数字的话,采用int类型的编码,如果是非数字的话,采用 raw 编码;
List:字符串长度及元素个数小于一定范围使用 ziplist 编码,任意条件不满足,则转化为 linkedlist 编码;
Hash:hash 对象保存的键值对内的键和值字符串长度小于一定值及键值对;
Set:保存元素为整数及元素个数小于一定范围使用 intset 编码,任意条件不满足,则使用 hashtable 编码;
Zset:zset 对象中保存的元素个数小于及成员长度小于一定值使用 ziplist 编码,任意条件不满足,则使用 skiplist 编码。
合适的线程模型
1、I/O多路复用模型
- I/O :网络 I/O
- 多路:多个 TCP 连接
- 复用:共用一个线程或进程
生产环境中的使用,通常是多个客户端连接 Redis,然后各自发送命令至 Redis 服务器,最后服务端处理这些请求返回结果。
2、避免上下文切换
Redis 是单线程的。 因为多线程在执行过程中需要进行 CPU 的上下文切换,这个操作比较耗时。Redis 又是基于内存实现的,对于内存来说,没有上下文切换效率就是最高的。多次读写都在一个CPU 上,对于内存来说就是最佳方案。
Redis 数据类型以及使用场景
- 字符串 string
字符串是 Redis 最基本的数据类型,它可以存储任何类型的数据,包括数字、文本、二进制数据等。字符串的最大长度为 512MB。
使用场景:
-
缓存数据:将经常使用的数据存储在 Redis 中,可以提高访问速度。
-
计数器:可以使用 Redis 的自增命令实现计数器功能。
-
分布式锁:可以使用 Redis 的 SETNX 命令实现分布式锁。
- 哈希 hash
哈希是一种键值对集合,它可以存储多个字段和值。哈希适合存储对象类型的数据,比如用户信息、商品信息等。
使用场景:
-
存储对象:可以将对象的各个属性存储在哈希中,方便查询和修改。
-
缓存数据:可以将查询结果存储在哈希中,避免重复查询。
-
计数器:可以使用哈希的 HINCRBY 命令实现计数器功能。
- 列表 list
列表是一种有序的字符串集合,它可以存储多个字符串元素。列表支持从两端插入和删除元素,可以实现队列和栈等数据结构。
使用场景:
-
消息队列:可以使用列表实现简单的消息队列。
-
排行榜:可以使用列表存储用户的得分,然后根据得分排序。
-
日志记录:可以使用列表存储日志信息,方便查询和分析。
- 集合 set
集合是一种无序的字符串集合,它可以存储多个字符串元素。集合支持交集、并集和差集等操作,可以实现简单的数据分析。
使用场景:
-
去重:可以使用集合存储重复的数据,然后使用 SREM 命令删除重复数据。
-
标签系统:可以使用集合存储文章的标签,然后根据标签查询相关文章。
-
推荐系统:可以使用集合存储用户的喜好,然后根据相似度推荐相关内容。
- 有序集合 Zset
有序集合是一种有序的字符串集合,它可以存储多个字符串元素和对应的分值。有序集合支持按照分值排序,可以实现排行榜和数据分析等功能。
使用场景:
-
排行榜:可以使用有序集合存储用户的得分,然后根据得分排序。
-
数据分析:可以使用有序集合存储数据的分值,然后根据分值查询相关数据。
-
推荐系统:可以使用有序集合存储用户的喜好和权重,然后根据相似度推荐相关内容。
总结
-
数据存储在内存中:Redis 的数据存储在内存中,而内存的读写速度远远快于硬盘。这使得 Redis 能够实现非常快速的读写操作。
-
单线程处理请求:Redis 是单线程的,因此可以避免线程切换和锁竞争等问题,提高了 CPU 的利用率和性能。
-
高效的数据结构:Redis 提供了多种高效的数据结构,如哈希表、有序集合等,这些数据结构能够快速地进行插入、删除、查找和排序等操作。
-
异步 I/O:Redis 使用异步 I/O 技术,可以在等待客户端输入或输出时继续处理其他请求,从而提高了系统的吞吐量。
-
高效的持久化机制:Redis 提供了多种持久化机制,如 RDB、AOF 和混合持久化机制,这些机制运行都非常高效,可以在不影响性能的情况下保证数据的安全。