Redis 概述

Redis 概述

在传统的 Java Web 项目中,使用数据库进行存储数据,但是有一些致命的弊端,这些弊端主要来自于性能方面。由于数据库持久化数据主要是面向磁盘,而磁盘的读/写比较慢,在一般管理系统中,由于不存在高并发,因此往往没有瞬间需要读/写大量数据的要求,这个时候使用数据库进行读/写时没有太大的问题的,但是在互联网中,往往存在大数据量的需求,比如,需要在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,导致服务宕机的严重生产问题。

为了克服这些问题,Java Web 项目往往就引入了 NoSQL 技术,NoSQL 工具也是一种简易的数据库,它主要是一种基于内存的数据库,并提供了一定的持久化功能。比如 Redis 和 MongoDB。

Redis 的性能十分优越,可以支持每秒十几万次的读/写操作,其性能远超数据库,并且支持集群、分布式、主从同步等配置,原则上可以无限扩展,同时还支持一定的事务能力。

Redis 性能优越的核心原因

Redis 性能之所以表现突出,主要源于以下 3 个关键方面:

  1. 开发语言优势:基于 ANSI C 语言编写,该语言接近于汇编语言的机器语言,运行速度十分快速。
  2. 存储介质特性:基于内存进行读/写操作,规避了磁盘 I/O 的慢速瓶颈。
  3. 数据结构简洁:仅包含 6 种数据类型,数据结构简单导致规则较少,处理逻辑轻便;而传统数据库需遵循范式、完整性、规范性等诸多规则,业务处理相对复杂。

NoSQL 不能代替数据库的原因

尽管 NoSQL 具备诸多优势,但仍无法取代传统数据库,核心原因如下:

  1. NoSQL 数据主要存储在内存中,传统数据库主要存储在磁盘上。
  2. NoSQL 数据库结构简单,虽能处理多数常规问题,但功能有限,不如数据库的 SQL 语句强大,难以支持更为复杂的计算场景。
  3. NoSQL 基于内存存储,一旦遭遇停电或机器故障,数据极易丢失,其持久化能力有限;而基于磁盘的数据库则不会出现此类问题。
  4. NoSQL 在数据完整性、事务能力、安全性、可靠性以及可扩展性等方面,均远不及传统数据库。

Redis 在 Java Web 中的应用

一般而言,Redis 在 Java Web 应用中主要有两个核心应用场景:一是缓存常用的数据,二是在需要高速读/写的场合发挥快速读写优势。

缓存

在对数据库的读/写操作中,读操作远超写操作,比例通常在 9:1 到 7:3 之间,因此数据被读取的概率远高于被写入的概率。

当发送 SQL 语句到数据库进行数据读取时,数据库需要从磁盘中索引对应数据,而磁盘索引是一个相对缓慢的过程。如果将数据直接存储在运行于内存中的 Redis 服务器上,就无需进行磁盘读/写,而是直接读取内存数据,显然速度会大幅提升,同时能极大减轻数据库的压力。

不过,使用内存存储数据的开销相对较大,因此在决定 Redis 中存储哪些数据时,需要从以下 3 个方面进行考量:

  • 业务数据的常用程度以及命中率大小:如果命中率很低,就没有必要写入缓存。
  • 业务数据的操作类型占比:该业务数据是读操作多,还是写操作多;如果写操作频繁,需要频繁写入数据库,则无需使用缓存。
  • 数据体量:如果要存储几百兆字节的大文件,会给缓存带来极大压力,没有必要存入 Redis。

读操作流程

image

  • 当第一次读取数据时,读取 Redis 会失败,此时会触发程序读取数据库,将数据读取出来后,同时写入 Redis 进行缓存。
  • 当第二次及以后读取该数据时,会直接读取 Redis,读取到数据后流程结束,从而大幅提升读取速度。

写操作流程

image
如果业务数据的写操作次数远远大于读操作次数,那么没有必要使用 Redis。

高速读/写场合

高速读/写场合常见的例子有:秒杀商品、抢红包、抢票等。这类场景下,一瞬间会有成千上万的请求到达服务器,如果使用传统数据库处理,极易造成数据库瘫痪。

对应的解决办法是异步写入数据库:即在高速读/写场合单独使用 Redis 应对高并发请求,将需要高速读/写的数据缓存到 Redis 中,然后在满足特定条件时,触发将缓存的数据写入数据库。

image

  • 当一个请求到达服务器时,仅先在 Redis 中完成业务数据的读/写操作,不进行任何数据库相关操作。
  • 由于一般缓存不能持久化,或者所持久化的数据格式不太规范,因此需要将这些业务数据存入数据库。在请求完成 Redis 的读/写操作后,会判断该高速读/写业务是否结束,判断条件通常为秒杀商品剩余个数为 0、抢红包金额为 0 等;如果条件不成立,则不操作数据库;如果条件成立,则触发事件,将 Redis 缓存的数据以批量形式一次性写入数据库,从而完成数据持久化操作。

当然,现实中这类需要高速响应的系统会更加复杂,还需要考虑高并发下的数据安全和一致性、有效请求和无效请求的甄别、事务一致性等诸多问题。

posted @ 2026-01-12 15:17  Jing61  阅读(2)  评论(0)    收藏  举报