当前位置: 代码网 > it编程>编程语言>Java > Java 接入Redis: Redis简介与NoSQL定位

Java 接入Redis: Redis简介与NoSQL定位

2026年09月20日 Java 我要评论
纲要本文从 redis 的官方定义出发,厘清它在整个数据存储体系中的位置,回答三个问题:redis 到底是什么、nosql 与关系型数据库的本质差异是什么、redis 应该用在哪些场景。redis 的

纲要

本文从 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-valuevalue 支持多种结构化类型
多角色同时可承担数据库、缓存、消息中间件三种职责

补充两个技术事实:

  • redis 使用 c 语言开发
  • 官方测试性能可达 10 万+ qpsqueries 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 数据库
存储结构二维表键值对 / 文档 / 列族 / 图
数据关联表间关联,支持外键数据之间无关联
操作语言sqlselect / insert / update / delete各产品专有命令
事务支持强事务 acid通常较弱或仅部分支持
扩展方式纵向扩展为主天然支持横向扩展
典型产品mysqloracledb2sql serverredismongodbmemcached

互补而非取代

nosql 数据库并不是要取代关系型数据库,而是对关系型数据库的补充。

实际项目中,一个系统同时使用 mysql(存核心业务数据,保证事务与一致性)与 redis(存热点数据,提供高并发读取)是标准架构。二者分工明确,不存在替代关系。

redis 应用场景

redis 的应用面很广,按使用频率排序主要有以下几类:

场景说明依赖特性
缓存缓存热点数据,降低数据库压力内存存储、高性能、支持过期时间
任务队列把待处理任务放入队列,按序消费list 类型的顺序性
消息队列发布订阅模式的消息传递pub/substream
分布式锁分布式环境下的并发控制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: 0

redis 启动类

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-serverredis 服务端启动程序
redis-cliredis 命令行客户端
redis-benchmark性能测试工具,用于压测 qps
redistemplatespring data redis 提供的核心操作模板
stringredistemplateredistemplate 的字符串特化版本,默认 string 序列化
opsforvalue()获取字符串类型操作接口
opsforhash()获取哈希类型操作接口
opsforlist()获取列表类型操作接口
opsforset()获取集合类型操作接口
opsforzset()获取有序集合类型操作接口
qpsqueries per second,每秒查询次数
nosqlnot only sql,非关系型数据库统称

官方文档

总结

本文明确了 redis 的三个定位层次:它是基于内存的键值对存储系统,官方测试 10w+ qps;它是 nosql 这一类别中的一种具体实现,而 nosql 与关系型数据库是互补关系而非取代关系;它的应用以缓存热点数据为主,同时可承担任务队列、消息队列、分布式锁等职责。理解「内存有限 → 只存热点」这一约束,是后续所有 redis 使用决策的出发点。

到此这篇关于java 接入redis: redis简介与nosql定位的文章就介绍到这了,更多相关redis简介与nosql定位内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com