纲要
本文从 redis 的官方定义出发,厘清它在整个数据存储体系中的位置,回答三个问题:redis 到底是什么、nosql 与关系型数据库的本质差异是什么、redis 应该用在哪些场景。
redis的本质- 开源的、基于内存的数据结构存储系统
- 三种角色:数据库、缓存、消息中间件
c语言开发,键值对结构,官方测试10w+ qps
nosql概念澄清- 全称
not only sql,泛指非关系型数据库这一类别 - 与关系型数据库是互补而非取代关系
- 全称
redis应用场景- 缓存、任务队列、消息队列、分布式锁
- 核心认知
- 内存有限,因此
redis适合存热点数据,而非全量数据
- 内存有限,因此
redis 是什么
redis 官网(https://redis.io)给出的定义是:
redis is an open source (bsd licensed), in-memory data structure store, used as a database, cache, and message broker.
翻译过来:redis 是一个开源的、基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。
拆解这句话可以得到 redis 的四个关键属性:
| 属性 | 说明 |
|---|---|
| 开源 | bsd 许可协议,源码开放 |
| 基于内存 | 数据存放于内存,这是高性能的根本原因 |
| 数据结构存储 | 不只是简单的 key-value,value 支持多种结构化类型 |
| 多角色 | 同时可承担数据库、缓存、消息中间件三种职责 |
补充两个技术事实:
redis使用c语言开发- 官方测试性能可达 10 万+ qps(
queries per second,每秒查询次数)
为什么基于内存就快
mysql 等传统数据库将数据存储在磁盘上,而 redis 将数据存储在内存中。内存的读写速度比磁盘高出几个数量级,这是 redis 高性能的物理基础。

内存有限决定了它的边界
一个必然被追问的问题是:既然 redis 这么快,能不能把 mysql 换掉,所有数据都存 redis?
不能。 原因有二:
- 内存容量有限且昂贵,无法承载海量数据
- 内存易失,断电后数据丢失(虽有持久化机制,但定位不同)
因此 redis 的正确用法是:存储热点数据。所谓热点数据,指短时间内有大量用户频繁访问的数据,例如:
- 秒杀、抢购活动中的热点商品
- 高频访问的资讯、新闻
- 首页聚合数据
这类数据若全部压在 mysql 上,数据库压力极大;放入 redis 后,请求在内存层直接返回,数据库只承担剩余的冷数据访问。
nosql 概念澄清
redis 常被称为「结构化的 nosql 数据库」。这里的 nosql 是理解 redis 定位的关键。
nosql 不是某个数据库
nosql 全称 not only sql,意为「不仅仅是 sql」。它不是指某一个具体的数据库产品,而是泛指一类数据库——非关系型数据库。
这一点极易被误解,需要明确:mysql 是一个数据库的名字,而 nosql 是一类数据库的统称。
与关系型数据库的本质差异

| 对比维度 | 关系型数据库 | nosql 数据库 |
|---|---|---|
| 存储结构 | 二维表 | 键值对 / 文档 / 列族 / 图 |
| 数据关联 | 表间关联,支持外键 | 数据之间无关联 |
| 操作语言 | sql(select / insert / update / delete) | 各产品专有命令 |
| 事务支持 | 强事务 acid | 通常较弱或仅部分支持 |
| 扩展方式 | 纵向扩展为主 | 天然支持横向扩展 |
| 典型产品 | mysql、oracle、db2、sql server | redis、mongodb、memcached |
互补而非取代
nosql 数据库并不是要取代关系型数据库,而是对关系型数据库的补充。
实际项目中,一个系统同时使用 mysql(存核心业务数据,保证事务与一致性)与 redis(存热点数据,提供高并发读取)是标准架构。二者分工明确,不存在替代关系。
redis 应用场景
redis 的应用面很广,按使用频率排序主要有以下几类:
| 场景 | 说明 | 依赖特性 |
|---|---|---|
| 缓存 | 缓存热点数据,降低数据库压力 | 内存存储、高性能、支持过期时间 |
| 任务队列 | 把待处理任务放入队列,按序消费 | list 类型的顺序性 |
| 消息队列 | 发布订阅模式的消息传递 | pub/sub、stream |
| 分布式锁 | 分布式环境下的并发控制 | setnx 原子操作、过期时间 |
| 排行榜 | 各类实时排名 | sorted set 的分值排序 |
| 计数器 | 点赞数、浏览量等高频自增 | incr 原子自增 |
其中缓存是最主要的使用场景,也是后续项目实战中 redis 承担的核心职责。

redis 在课程项目中的位置
在后续的外卖平台项目中,redis 承担的职责是缓存层:

具体而言,redis 会被用于:
- 缓存短信验证码(设置过期时间,替代
session) - 缓存菜品数据(按分类缓存,变更时清理)
- 缓存套餐数据(
spring cache注解方式)
项目目录结构
redis 安装后的目录结构与本课程配套的 java 客户端工程结构如下。
linux 下 redis 安装目录
/usr/local/redis-4.0.0/ ├── redis.conf # 核心配置文件 ├── src/ # 编译产物目录 │ ├── redis-server # 服务端启动程序 │ ├── redis-cli # 命令行客户端 │ ├── redis-benchmark # 性能测试工具 │ └── redis-sentinel # 哨兵 ├── utils/ # 工具脚本 └── dump.rdb # rdb 持久化文件(运行后生成)
windows 下 redis 目录
redis-x64-3.2.100/ ├── redis.windows.conf # windows 配置文件 ├── redis-server.exe # 服务端 ├── redis-cli.exe # 命令行客户端 └── redis.windows-service.conf
配套 java 客户端工程
代码和资料/瑞吉外卖/redis课程/代码/
├── jedis_demo/ # jedis 客户端示例
│ ├── pom.xml
│ └── src/test/java/com/itheima/test/
│ └── jedistest.java
└── springdataredis_demo/ # spring data redis 示例
├── pom.xml
└── src/
├── main/
│ ├── java/com/itheima/
│ │ ├── app.java
│ │ └── config/redisconfig.java
│ └── resources/application.yml
└── test/java/com/itheima/test/
└── springdataredistest.java完整可运行代码
引入 redis 客户端依赖
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/pom/4.0.0"
xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelversion>4.0.0</modelversion>
<parent>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-parent</artifactid>
<version>2.4.5</version>
<relativepath/>
</parent>
<groupid>com.itheima</groupid>
<artifactid>redis-demo</artifactid>
<version>1.0-snapshot</version>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<!-- spring data redis,底层默认使用 lettuce 连接池 -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-data-redis</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-test</artifactid>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-maven-plugin</artifactid>
</plugin>
</plugins>
</build>
</project>application.yml
spring:
redis:
host: 192.168.138.130
port: 6379
password: 123456
database: 0redis 启动类
package com.itheima;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
/**
* redis 示例工程启动类。
* 引入 spring-boot-starter-data-redis 后,
* spring boot 会自动装配 redistemplate 与 stringredistemplate。
*/
@springbootapplication
public class app {
public static void main(string[] args) {
springapplication.run(app.class, args);
}
}连通性验证程序
package com.itheima.test;
import org.junit.jupiter.api.test;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.test.context.springboottest;
import org.springframework.data.redis.core.stringredistemplate;
import org.springframework.data.redis.core.valueoperations;
/**
* 验证 redis 服务连通性,并演示最基础的字符串读写。
*/
@springboottest
public class redisconnectiontest {
@autowired
private stringredistemplate stringredistemplate;
/**
* 写入一个字符串并立即读回,验证 redis 是否可用。
*/
@test
public void testconnection() {
valueoperations<string, string> operations = stringredistemplate.opsforvalue();
operations.set("city", "北京");
string value = operations.get("city");
system.out.println("读取到的值:" + value);
// 验证 redis 是否生效:能读回写入的值即说明服务连通
if ("北京".equals(value)) {
system.out.println("redis 连通性验证通过");
}
}
}api 速览
| 概念 / api | 作用 |
|---|---|
redis-server | redis 服务端启动程序 |
redis-cli | redis 命令行客户端 |
redis-benchmark | 性能测试工具,用于压测 qps |
redistemplate | spring data redis 提供的核心操作模板 |
stringredistemplate | redistemplate 的字符串特化版本,默认 string 序列化 |
opsforvalue() | 获取字符串类型操作接口 |
opsforhash() | 获取哈希类型操作接口 |
opsforlist() | 获取列表类型操作接口 |
opsforset() | 获取集合类型操作接口 |
opsforzset() | 获取有序集合类型操作接口 |
qps | queries per second,每秒查询次数 |
nosql | not only sql,非关系型数据库统称 |
官方文档
- redis 官方网站:https://redis.io/
- redis 官方文档:https://redis.io/documentation
- redis 命令参考:https://redis.io/commands
- redis 中文网:http://www.redis.cn/
总结
本文明确了 redis 的三个定位层次:它是基于内存的键值对存储系统,官方测试 10w+ qps;它是 nosql 这一类别中的一种具体实现,而 nosql 与关系型数据库是互补关系而非取代关系;它的应用以缓存热点数据为主,同时可承担任务队列、消息队列、分布式锁等职责。理解「内存有限 → 只存热点」这一约束,是后续所有 redis 使用决策的出发点。
到此这篇关于java 接入redis: redis简介与nosql定位的文章就介绍到这了,更多相关redis简介与nosql定位内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论