Redis入门 | 青训营

35 阅读8分钟

Redis 入门

1 Redis 简介

1.1 Redis是什么?

Redis全称为:Remote Dictionary Server(远程数据服务) ,是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C语言编写的开源、包含多种数据结构、支持网络、基于内存的开源非关系型内存数据库。

1.2 为什么要使用Redis?

一款产品之所以被广泛使用,当然是应为这款产品有着它的特点与优势,下面列举一下Redis的特点:

  1. 读写性能优异: Redis以其卓越的读写性能著称。高速的内存访问使其在读写操作方面表现出色,每秒可以处理成千上万次的读写操作。这对于需要快速响应和高吞吐量的应用非常重要,例如缓存系统、计数器和实时数据分析。(本地测试结果:juejin.cn/post/727009…
  2. 数据类型丰富: Redis支持多种丰富的数据类型,包括字符串、列表、哈希、集合和有序集合。这些数据类型使得开发人员能够更灵活地存储和操作不同类型的数据,而不仅仅是简单的键值对。
  3. 原子性: Redis的所有操作都是原子性的,这意味着它们要么完全执行,要么完全不执行,没有中间状态。此外,Redis还支持多个操作的事务,使一系列操作能够原子性地执行,有助于保持数据的一致性。
  4. 丰富的特性: Redis提供了许多功能,如发布订阅(pub/sub)模式,可以用作消息代理,以及键过期、通知机制等。这些特性可以用于构建实时消息传递系统、通知系统等。
  5. 持久化: Redis支持持久化,以确保数据在服务器重启或崩溃后不会丢失。它提供两种持久化方式:RDB(Redis DataBase,快照)和AOF(Append Only File,日志追加),使数据可以持久保存在磁盘上。
  6. 分布式: Redis Cluster是Redis提供的分布式解决方案,允许将数据分布在多个节点上,提高了可用性和横向扩展能力。它能够处理大规模数据和流量,使其适用于需要分布式存储的场景。

1.3 Redis的使用场景

1.3.1 热点数据的缓存

  • 描述: Redis作为缓存的最常见用途之一。通过将热点数据存储在Redis中,可以大大提高数据访问速度,因为Redis的高速读取性能可以显著减少对数据库的压力。

  • 缓存实现方式:

    • 方案一:旁路缓存模式( Cache Aside Pattern)。
    • 方案二:读写穿透(Read/Write Through Pattern)。
    • 方案三:异步缓存写入(Write Behind Pattern)。。

通过这三种方案,可以根据实际情况选择适合的方法来缓存热点数据,提高应用程序的性能和响应速度。在方案选择时,需要考虑缓存数据的实时性要求、缓存击穿的风险以及写入操作的同步性。

1.3.2 限时业务的运用

  • 描述: Redis的过期功能可以用于实现限时业务,如限时优惠活动、手机验证码等。设置数据的生存时间,Redis会在时间到期时自动删除数据。
  • 实现方式: 使用EXPIRE命令设置键的生存时间,在指定时间后,Redis会自动删除过期的数据。
  • 优势: 通过Redis的过期功能,可以方便地实现业务中的限时效果。

1.3.3 计数器相关问题

  • 描述: Redis的INCRBY命令可以实现原子性的递增操作,适用于高并发的计数场景,如秒杀活动、分布式序列号生成等。
  • 实现方式: 使用INCRBY命令对指定键的值进行递增操作,确保递增操作的原子性。
  • 应用案例: 限制短信发送次数、接口请求次数等场景。

1.3.4 分布式锁

  • 描述: Redis的SETNX命令可以用于实现分布式锁,确保在分布式环境中的某个操作只有一个实例能够执行。

  • 实现方式:

    1. 使用SETNX命令尝试在Redis中设置一个锁键,只有一个实例能够成功设置锁。
    2. 为锁键设置合适的过期时间,避免出现死锁情况。
  • 应用场景:

    • 秒杀系统:保证同一商品在同一时刻只能有一个用户购买。

1.3.5 延时操作

  • 描述: Redis的过期功能和监听机制可以用于实现延时操作,如延时取消订单、定时任务等。

  • 实现方式:

    1. 在订单生成时,设置一个键,并设置适当的过期时间,该键作为延时操作的触发器。
    2. 后台运行一个监听器,监听键的过期事件,一旦键过期,触发后续操作。
  • 优势: 可以在不需要专门的定时任务服务的情况下实现相对简单的延时操作。

1.3.6 排行榜相关问题

  • 描述: 关系型数据库在排行榜方面的查询速度普遍偏慢,Redis的有序集合(Sorted Set)可以用于实现排行榜功能,根据某个指标对数据进行排序。
  • 实现方式: 将排行榜中的数据存储在有序集合中,以某个指标作为分数,通过有序集合的相关命令进行排行操作。
  • 应用场景: 点赞排行榜、排名、评分等需要排序的场景。

1.3.7 点赞、好友等相互关系的存储

  • 描述: Redis的集合数据类型可以用于存储相互关系,如点赞关系、好友关系等。
  • 实现方式: 使用集合数据类型存储关系数据,通过集合的交集、并集等操作来处理关系。
  • 应用场景: 社交网络中的好友关系、点赞关系等。

1.3.8 简单队列

  • 描述: Redis的列表数据类型可以用于实现简单的队列,支持快速的入队和出队操作。

  • 实现方式:

    1. 使用列表的LPUSH命令将数据入队,使用RPOP命令将数据出队。
    2. 利用列表的先进先出特性,实现简单队列的功能。
  • 应用场景:

    • 任务队列、消息队列等。

2 Redis数据类型

  • Redis是一种键值对(key-value)类型的数据库,它的数据存储结构是基于这种简单的键值关系。每个数据项都有一个唯一的键(key)来标识,而这个键所对应的值(value)可以是多种不同的数据类型。
  • 对于Redis来说,所有的key(键)都是字符串类型的。所以下面在讨论数据结构时,讨论的是存储值的数据类型。

2.1 Redis 5 种基础数据类型

2.1.1 String(字符串)

  • String 是 Redis 中最基本的数据类型,每个键对应一个 String。
  • String 类型是二进制安全的,可以存储任何类型的二进制数据,包括文本、图像、音频等。
  • 适用于存储单个值的场景,如用户信息、计数器等。
  • 支持字符串的追加操作,适用于构建日志、消息队列等。

2.1.2 List(列表)

  • List 是一个有序的字符串列表,支持左右两端的插入和删除操作。
  • 适用于队列、栈等场景,如任务队列、消息队列等。
  • 可以实现分页查询,支持插入、弹出等操作。

2.1.3 Set(集合)

  • Set 是一个无序、不允许重复元素的字符串集合。
  • 适用于存储唯一值,如点赞用户、关注列表等。
  • 支持交集、并集、差集等操作。

2.1.4 Zset(有序集合)

  • Zset 是一个有序的字符串集合,每个成员关联一个分数。
  • 适用于排行榜、范围查询等场景。
  • 可以按照分数排序,支持分数范围查询。

2.1.5 Hash(哈希)

  • Hash 是一个键值对的无序散列表,每个键关联一个值。
  • 适用于存储对象属性,如用户信息、文章信息等。
  • 提供 O(1) 复杂度的读写操作,适合存储大量属性。

2.2 Redis 3 种特殊类型

2.2.1 HyperLogLogs(基数统计)

  • HyperLogLogs 是一种基数统计算法,用于估计数据集中元素的数量。
  • 占用极小的存储空间,适用于统计独立用户访问、页面浏览等。

2.2.2 Bitmap(位存储)

  • Bitmap 是一种位数组,用于存储位集合。
  • 支持位操作,如 AND、OR、XOR,适用于存储标志位、用户状态等。

2.2.3 geospatial(地理位置)

  • Geospatial 数据类型用于存储地理位置信息。
  • 支持位置查询、范围查询,适用于地理位置应用,如附近商家搜索、地理围栏等。

2.3 数据类型:stream

  • Stream 是一个有序、可持久化的日志数据结构。
  • 适用于消息队列、事件日志等场景,可以保障消息的顺序性和可靠性。

以上是每种 Redis 数据类型的更详细描述。这些数据类型在不同场景中有着各自的用途,你可以根据需求选择合适的类型来存储和处理数据。

参考文献

超全的数据库分类介绍 - 知乎

Commands | Redis

Redis教程

Redis官网

Redis中文网