学习笔记之Redis

121 阅读7分钟

Redis提供了一个高性能的键值(key-value)存储系统,常用于缓存、消息队列、会话存储等应用场景。

Redis优点

  • 性能极高: Redis 以其极高的性能而著称,能够支持每秒数十万次的读写操作。这使得Redis成为处理高并发请求的理想选择,尤其是在需要快速响应的场景中,如缓存、会话管理、排行榜等。
  • 丰富的数据类型: Redis 不仅支持基本的键值存储,还提供了丰富的数据类型,包括字符串、列表、集合、哈希表、有序集合等。这些数据类型为开发者提供了灵活的数据操作能力,使得Redis可以适应各种不同的应用场景。
  • 原子性操作: Redis 的所有操作都是原子性的,这意味着操作要么完全执行,要么完全不执行。这种特性对于确保数据的一致性和完整性至关重要,尤其是在高并发环境下处理事务时。
  • 持久化: Redis 支持数据的持久化,可以将内存中的数据保存到磁盘中,以便在系统重启后恢复数据。这为 Redis 提供了数据安全性,确保数据不会因为系统故障而丢失。
  • 支持发布/订阅模式: Redis 内置了发布/订阅模式(Pub/Sub),允许客户端之间通过消息传递进行通信。这使得 Redis 可以作为消息队列和实时数据传输的平台。
  • 单线程模型: 尽管 Redis 是单线程的,但它通过高效的事件驱动模型来处理并发请求,确保了高性能和低延迟。单线程模型也简化了并发控制的复杂性。
  • 主从复制: Redis 支持主从复制,可以通过从节点来备份数据或分担读请求,提高数据的可用性和系统的伸缩性。
  • 应用场景广泛: Redis 被广泛应用于各种场景,包括但不限于缓存系统、会话存储、排行榜、实时分析、地理空间数据索引等。
  • 社区支持: Redis 拥有一个活跃的开发者社区,提供了大量的文档、教程和第三方库,这为开发者提供了强大的支持和丰富的资源。
  • 跨平台兼容性: Redis 可以在多种操作系统上运行,包括 Linux、macOS 和 Windows,这使得它能够在不同的技术栈中灵活部署。

Redis 与其他 key-value 存储有什么不同?

Redis 与其他 key-value 存储系统的主要区别在于其提供了丰富的数据类型、高性能的读写能力、原子性操作、持久化机制、以及丰富的特性集。

以下是 Redis 的一些独特之处:

  • 丰富的数据类型: Redis 不仅仅支持简单的 key-value 类型的数据,还提供了 list、set、zset(有序集合)、hash 等数据结构的存储。这些数据类型可以更好地满足特定的业务需求,使得 Redis 可以用于更广泛的应用场景。
  • 高性能的读写能力: Redis 能读的速度是 110000次/s,写的速度是 81000次/s。这种高性能主要得益于 Redis 将数据存储在内存中,从而显著提高了数据的访问速度。
  • 原子性操作: Redis 的所有操作都是原子性的,这意味着操作要么完全执行,要么完全不执行。这种特性对于确保数据的一致性和完整性非常重要。
  • 持久化机制: Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,以便在系统重启后能够再次加载使用。这为 Redis 提供了数据安全性,确保数据不会因为系统故障而丢失。
  • 丰富的特性集: Redis 还支持 publish/subscribe(发布/订阅)模式、通知、key 过期等高级特性。这些特性使得 Redis 可以用于消息队列、实时数据分析等复杂的应用场景。
  • 主从复制和高可用性: Redis 支持 master-slave 模式的数据备份,提供了数据的备份和主从复制功能,增强了数据的可用性和容错性。
  • 支持 Lua 脚本: Redis 支持使用 Lua 脚本来编写复杂的操作,这些脚本可以在服务器端执行,提供了更多的灵活性和强大的功能。
  • 单线程模型: 尽管 Redis 是单线程的,但它通过高效的事件驱动模型来处理并发请求,确保了高性能和低延迟。

Redis配置

Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf(Windows 名为 redis.windows.conf)。

你可以通过 CONFIG 命令查看或设置配置项。

语法

Redis CONFIG 命令格式如下:

redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME

使用 * 号获取所有配置项:

redis 127.0.0.1:6379> CONFIG GET *

编辑配置

你可以通过修改 redis.conf 文件或使用 CONFIG set 命令来修改配置。

Redis参数说明

Redis参数说明

Redis数据类型

  • string:字符串,基本数据存储单元,可以存储字符串、整数或浮点数。
  • hash:哈希,一个键值对集合,可以存储多个字段。
  • list:列表,一个简单的列表,可以存储一系列的字符串元素。
  • set:集合,一个无序集合,可以存储不重复的字符串元素。
  • zset:有序集合,类似于集合,但是每个元素都有一个分数(score)与之关联。
  • bitmaps:位图,基于字符串类型,可以对每个位进行操作。
  • HyperLogLogs:超日志,用于基数统计,可以估算集合中的唯一元素数量。
  • Geospatial:地理空间,用于存储地理位置信息。
  • Pub/Sub:一种消息通信模式,允许客户端订阅消息通道,并接收发布到该通道的消息。
  • Streams:流,用户消息队列和日志存储,支持消息的持久化和时间排序。
  • Modules:模块,Redis支持动态加载模块,可以扩展Redis的功能。

String(字符串)

  • string 类型是二进制安全的。意思是Redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
  • string 类型是 redis 最基本的数据类型
  • string 类型的值最大能存储 512M

Hash(哈希)

  • hash 是一个键值(key=>value)对集合,类似于一个小型的nosql数据库。
  • hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
  • 每个hash最多可以存储 2^32-1 个键值对。

List(列表)

  • Redis列表是一个简单的字符串列表,按照插入顺序排序。
  • 你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
  • 列表最多可以存储2^32-1个元素。

set(集合)

  • Redis 的 set 是 string 类型的无序集合。
  • 集合是通过 hash 表实现的,所以添加、删除、查找的复杂度都是O(1)。
  • 集合最大可以存储2^32-1个成员(4294967295, 每个集合可存储40多亿个成员)。
  • 集合中的元素不允许重复

zset(有序集合)

  • Redis zset 和 set 一样也是 string 类型元素的集合,且不允许有重复的成员。
  • 与 set 不同的是每个元素都会关联一个 double 类型的分数。
  • Redis 是通过分数来为集合中的成员进行从小到大的排序。
  • zset 中的成员是唯一的,但分数(score)却可以重复。

HyperLogLog

  • 用于基数估计算法的数据结构。
  • 常用于统计唯一值的近似值。

Bitmaps

  • 位数组,可以对字符串进行位操作。
  • 常用于实现布隆过滤器等位操作。

Geospatial Indexes

  • 处理地理空间数据,支持地理空间索引和半径查询。

Streams

  • 日志数据类型,支持时间序列数据。
  • 用于消息队列和实时数据处理。