什么是Redis?

157 阅读5分钟

Redis 是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库

Redis 为什么这么快?

image.png

基于内存实现

Redis 是基于内存的数据库,那不可避免的就要与磁盘数据库做对比。对于磁盘数据库来说,是需要将数据读取到内存里的,这个过程会受到磁盘 I/O 的限制。

而对于内存数据库来说,本身数据就存在于内存里,也就没有了这方面的开销。

高效的数据结构

Redis 中有多种数据类型,每种数据类型的底层都由一种或多种数据结构来支持。正是因为有了这些数据结构,Redis 在存储与读取上的速度才不受阻碍。

image.png

合理的数据编码

对于每一种数据类型来说,底层的支持可能是多种数据结构,什么时候使用哪种数据结构,这就涉及到了编码转化的问题。

那我们就来看看,不同的数据类型是如何进行编码转化的:

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 服务器,最后服务端处理这些请求返回结果。

a044ad345982b2b715cee7078e28cbe677099b2b.webp 2、避免上下文切换

Redis 是单线程的。 因为多线程在执行过程中需要进行 CPU 的上下文切换,这个操作比较耗时。Redis 又是基于内存实现的,对于内存来说,没有上下文切换效率就是最高的。多次读写都在一个CPU 上,对于内存来说就是最佳方案。

Redis 数据类型以及使用场景

  1. 字符串 string

字符串是 Redis 最基本的数据类型,它可以存储任何类型的数据,包括数字、文本、二进制数据等。字符串的最大长度为 512MB。

使用场景:

  • 缓存数据:将经常使用的数据存储在 Redis 中,可以提高访问速度。

  • 计数器:可以使用 Redis 的自增命令实现计数器功能。

  • 分布式锁:可以使用 Redis 的 SETNX 命令实现分布式锁。

  1. 哈希 hash

哈希是一种键值对集合,它可以存储多个字段和值。哈希适合存储对象类型的数据,比如用户信息、商品信息等。

使用场景:

  • 存储对象:可以将对象的各个属性存储在哈希中,方便查询和修改。

  • 缓存数据:可以将查询结果存储在哈希中,避免重复查询。

  • 计数器:可以使用哈希的 HINCRBY 命令实现计数器功能。

  1. 列表 list

列表是一种有序的字符串集合,它可以存储多个字符串元素。列表支持从两端插入和删除元素,可以实现队列和栈等数据结构。

使用场景:

  • 消息队列:可以使用列表实现简单的消息队列。

  • 排行榜:可以使用列表存储用户的得分,然后根据得分排序。

  • 日志记录:可以使用列表存储日志信息,方便查询和分析。

  1. 集合 set

集合是一种无序的字符串集合,它可以存储多个字符串元素。集合支持交集、并集和差集等操作,可以实现简单的数据分析。

使用场景:

  • 去重:可以使用集合存储重复的数据,然后使用 SREM 命令删除重复数据。

  • 标签系统:可以使用集合存储文章的标签,然后根据标签查询相关文章。

  • 推荐系统:可以使用集合存储用户的喜好,然后根据相似度推荐相关内容。

  1. 有序集合 Zset

有序集合是一种有序的字符串集合,它可以存储多个字符串元素和对应的分值。有序集合支持按照分值排序,可以实现排行榜和数据分析等功能。

使用场景:

  • 排行榜:可以使用有序集合存储用户的得分,然后根据得分排序。

  • 数据分析:可以使用有序集合存储数据的分值,然后根据分值查询相关数据。

  • 推荐系统:可以使用有序集合存储用户的喜好和权重,然后根据相似度推荐相关内容。


总结

  • 数据存储在内存中:Redis 的数据存储在内存中,而内存的读写速度远远快于硬盘。这使得 Redis 能够实现非常快速的读写操作。

  • 单线程处理请求:Redis 是单线程的,因此可以避免线程切换和锁竞争等问题,提高了 CPU 的利用率和性能。

  • 高效的数据结构:Redis 提供了多种高效的数据结构,如哈希表、有序集合等,这些数据结构能够快速地进行插入、删除、查找和排序等操作。

  • 异步 I/O:Redis 使用异步 I/O 技术,可以在等待客户端输入或输出时继续处理其他请求,从而提高了系统的吞吐量。

  • 高效的持久化机制:Redis 提供了多种持久化机制,如 RDB、AOF 和混合持久化机制,这些机制运行都非常高效,可以在不影响性能的情况下保证数据的安全。