墨风如雪博客

  • 源码小店
  • 传家宝VPS
让AI使用变得如此简单
  1. 首页
  2. java
  3. Redis
  4. 正文

java 分布式缓存框架Redis的(超详细总结)

2023年 5月 5日 248点热度 0人点赞 0条评论

Redis是什么?

Java中的缓存中间件Redis是一种开源的基于键值对存储的 NoSQL 数据库(非关系型数据库),它主要应用于构建高性能、可扩展的网络服务和应用程序。Redis具备以下特点:

1. 高性能:Redis 集成了多种数据结构,支持快速的读写操作,并且数据存储在内存中,速度非常快。

2. 数据持久化:Redis 支持将内存中的数据写入到磁盘,以保证数据持久化。

3. 分布式支持:Redis 支持主从复制和集群,可以扩展到多个节点,从而支持大规模的应用。

4. 丰富的数据类型:Redis支持多种数据结构,如字符串、列表、哈希、集合和有序集合等。

5. 事务支持:Redis通过MULTI/EXEC命令,支持事务的执行。

6. 发布订阅模式:Redis支持发布/订阅模式,可以让客户端接收特定类型的消息。

在Java中,开发人员可以使用Jedis等Redis客户端连接Redis服务器,并利用Redis提供的API实现数据的存储、读取、删除和更新等操作。由于Redis具备很多优异的特性和优势,因此在高并发、大流量的Java Web应用程序开发中,使用Redis作为缓存中间件是非常常见和重要的选择。

Redis一般拿来做什么?

Redis是一款开源的基于键值对存储的 NoSQL 数据库,通常被用来解决以下问题:

1. 缓存

Redis常用于缓存应用程序中的数据,以减轻数据库的负担,提高应用程序的性能。Redis能够将热点数据缓存到内存中,极大地提高了读取速度和性能。缓存的数据可以是内存中的临时数据,也可以是磁盘中的持久化数据。使用Redis作为缓存,可以有效地降低系统的读取延迟和负载,提升系统的响应速度。

2. 分布式锁

在分布式应用中,由于多个客户端同时访问同一资源的可能性很高,使用Redis实现分布式锁可以防止资源竞争,确保只有一个客户端可以访问该资源。使用Redis的setnx命令可以实现互斥锁。当某个客户端获取到锁时,其他客户端需要等待释放锁之后才能获取到锁。

3. 计数器

Redis提供incr和decr命令,可以实现原子性的自增和自减操作,常用于计数器的实现。例如,用于统计网站访问量的计数器。

4. 消息队列

Redis支持列表类型,使用lpush和rpop命令可以实现队列,常用于实现简单的消息队列系统。例如,在实时聊天应用程序中,使用Redis作为消息队列能够实现高性能的消息通讯。

Redis在Java应用程序中可以被用于缓存、分布式锁、计数器、消息队列等多种场景,能够提高系统性能、减少数据库负载、保证数据的一致性和可靠性。在高并发、大流量的Java Web应用程序中,使用Redis作为缓存中间件是常见且重要的选择。

Redis的数据模型

Redis的数据模型包括五种主要的数据结构类型:字符串、哈希表、列表、集合和有序集合。每种数据结构类型都有其特定的作用和使用场景,并且提供了一系列操作命令来对数据进行管理。下面是每种数据结构类型及其相关的命令操作:

  1. 字符串(String)

字符串是Redis中最简单的数据结构类型,用于存储一个字符串值。Redis的字符串类型支持多种操作,包括设置和获取值、增加或减少整数值等。

  • SET key value:设置键为key的值为value。
  • GET key:获取键为key的值。
  • INCR key:将键为key的值增加1。
  • DECR key:将键为key的值减少1。
  • APPEND key value:将值value追加到键为key的值的末尾。
  1. 哈希表(Hash)

哈希表是Redis中用于存储键值对的数据结构类型。在哈希表中,每个键都与一个值相关联,可以通过键快速地查找对应的值。哈希表适用于存储对象或实体,如用户信息、商品信息等。

  • HSET key field value:为哈希表key中的域field设置值value。
  • HGET key field:获取哈希表key中域field的值。
  • HGETALL key:获取哈希表key中的所有键值对。
  • HDEL key field [field ...]:删除哈希表key中的一个或多个域。
  1. 列表(List)

列表是Redis中一种有序的数据结构,可以存储一个或多个字符串值。列表支持在列表的两端插入或删除元素,也可以根据索引查找元素,适用于实现队列、栈等数据结构。

  • LPUSH key value [value ...]:将一个或多个值插入到列表key的左侧。
  • RPUSH key value [value ...]:将一个或多个值插入到列表key的右侧。
  • LPOP key:从列表key的左侧弹出一个值并返回。
  • RPOP key:从列表key的右侧弹出一个值并返回。
  • LINDEX key index:获取列表key中索引为index的值。
  1. 集合(Set)

集合是Redis中一种无序的数据结构,可以存储多个字符串值,但每个值都是唯一的。集合支持对元素进行添加、删除、查找等操作,适用于实现去重、交集、并集等操作。

  • SADD key member [member ...]:向集合key中添加一个或多个元素。
  • SMEMBERS key:获取集合key中的所有元素。
  • SREM key member [member ...]:从集合key中删除一个或多个元素。
  • SINTER key [key ...]:获取多个集合的交集。
  • SUNION key [key ...]:获取多个集合的并集。
  1. 有序集合(Sorted Set)

有序集合是Redis中一种有序的数据结构,可以存储多个字符串值,并且每个值都关联着一个分数。有序集合支持按照分数排序、按照排名获取元素等操作,适用于实现排行榜、计数器等功能。

  • ZADD key score member [score member ...]:将一个或多个成员添加到有序集合key中,并指定每个成员的分数。
  • ZRANGE key start stop [WITHSCORES]:获取有序集合key中排名在start和stop之间的成员。
  • ZREM key member [member ...]:从有序集合key中删除一个或多个成员。
  • ZINCRBY key increment member:将有序集合key中成员member的分数增加increment。
  • ZCARD key:获取有序集合key中成员的数量。

以上是Redis支持的五种主要的数据结构类型及其相关的命令操作。根据不同的使用场景,选择合适的数据结构类型和命令操作可以使得Redis的应用更加高效和快速。

Redis的安装教程

以下是在Windows和Linux环境下安装Redis的文字步骤和命令:

在Windows环境下安装Redis

步骤如下:

  1. 下载Redis

在Redis官网(https://redis.io/)下载 Redis 的 MSOpenTech 版本。

选择最新版本并下载,得到一个压缩包(zip文件)。

  1. 解压Redis

将zip文件解压到目标文件夹(例如C:\Redis)。

解压后就可以看到redis目录下的可执行文件,如redis-server.exe、redis-cli.exe等。

  1. 启动Redis

在Windows命令提示符中,进入Redis解压目录(例如C:\Redis)并执行以下命令:

redis-server.exe redis.windows.conf

此时Redis会监听在默认端口6379上,可以通过命令 redis-cli.exe ping 检查Redis是否启动。

  1. 开机自启动

如果需要开机自启动Redis,可以通过以下命令:

redis-server.exe --service-install redis.windows-service.conf --loglevel verbose

此时Redis已经安装为Windows服务并启动,可通过命令服务管理器查看或启停服务。

在Linux环境下安装Redis

步骤如下:

  1. 更新系统

使用以下命令更新系统软件包:

sudo apt-get update
sudo apt-get upgrade
  1. 安装Redis

使用以下命令安装Redis:

sudo apt-get install redis-server
  1. 启动Redis

Redis安装完成后,会自动启动Redis服务监听默认的端口6379。如果没有启动,可以使用以下命令手动启动:

sudo systemctl start redis.service

此时Redis会监听在默认端口6379上,可以通过命令 redis-cli ping 检查Redis是否启动。

  1. 开机自启动

如果需要开机自启动Redis,可以使用以下命令:

sudo systemctl enable redis.service

以上就是在Windows和Linux环境下安装Redis的详细步骤和命令。如果需要启用密码验证等高级配置,可以编辑Redis配置文件 redis.conf。

SpringBoot整合

好的,以下是SpringBoot整合Redis的详细步骤和完整的代码:

步骤:

  1. 在 SpringBoot 项目中添加 Redis 依赖

在 pom.xml 文件中添加 Redis 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置 Redis 连接信息

在 application.properties 中配置 Redis 连接信息:

# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis身份验证密码
spring.redis.password=
  1. 编写 Redis 配置类

创建 Redis 配置类 RedisConfig.java:

package com.example.redisexample.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private int redisPort;

    @Value("${spring.redis.password}")
    private String redisPassword;

    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration(redisHost, redisPort);
        redisConfig.setPassword(RedisPassword.of(redisPassword));

        return new LettuceConnectionFactory(redisConfig);
    }

    public RedisTemplate<String, String> redisTemplate() {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());

        return redisTemplate;
    }
}

配置类中定义了连接 Redis 的工厂和 RedisTemplate。其中,连接工厂使用 Lettuce 客户端,并通过 RedisStandaloneConfiguration 指定 Redis 服务器的连接信息和密码。RedisTemplate 使用 StringRedisSerializer 作为键和值的序列化器。

  1. 编写 Redis 操作类

创建 Redis 操作类 RedisService.java:

package com.example.redisexample.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class RedisService {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    public void set(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    public void delete(String key) {
        redisTemplate.delete(key);
    }
}
  1. 使用 Redis 操作类

在需要使用 Redis 的地方注入 RedisService 并调用其方法即可:

@RestController
public class ExampleController {

    @Autowired
    private RedisService redisService;

    @GetMapping("/set")
    public String set() {
        redisService.set("key", "value");
        return "set success";
    }

    @GetMapping("/get")
    public String get() {
        String value = redisService.get("key");
        return "get success: " + value;
    }

    @GetMapping("/delete")
    public String delete() {
        redisService.delete("key");
        return "delete success";
    }
}

完整代码:

RedisConfig.java:

package com.example.redisexample.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private int redisPort;

    @Value("${spring.redis.password}")
    private String redisPassword;

    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration(redisHost, redisPort);
        redisConfig.setPassword(RedisPassword.of(redisPassword));

        return new LettuceConnectionFactory(redisConfig);
    }

    public RedisTemplate<String, String> redisTemplate() {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());

        return redisTemplate;
    }
}

RedisService.java:

package com.example.redisexample.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class RedisService {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    public void set(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    public void delete(String key) {
        redisTemplate.delete(key);
    }
}

ExampleController.java:

@RestController
public class ExampleController {

    @Autowired
    private RedisService redisService;

    @GetMapping("/set")
    public String set() {
        redisService.set("key", "value");
        return "set success";
    }

    @GetMapping("/get")
    public String get() {
        String value = redisService.get("key");
        return "get success: " + value;
    }

    @GetMapping("/delete")
    public String delete() {
        redisService.delete("key");
        return "delete success";
    }
}

以上就是SpringBoot整合Redis的详细步骤和完整的代码。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: java Redis 分布式 缓存
最后更新:2023年 5月 5日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
腾讯混元MT-7B:打破参数迷思,重塑机器翻译版图 瑞士AI宣言:Apertus如何定义开放大模型 月之暗面Kimi K2-0905:代码与创意的新篇章? 谷歌“蕉”傲登场!AI生图告别“走钟”时代 2025,AI世界模型新篇章:腾讯混元Voyager展望 单GPU秒产一分钟!MAI-Voice-1,微软语音AI的“核爆”时刻?
别再卷万亿参数了,这个4B模型正把AI工作站塞进你的手机全球最佳开放模型!OpenAI开源GPT-OSS,AI界迎来巨变!声音即影像:昆仑万维SkyReels-A3如何叩响内容创作的革命前夜9B参数硬撼72B,GLM-4.1V凭什么搅动AI江湖?2B参数掀翻巨头牌桌:昆仑万维UniPic 2.0的“四两拨千斤”天工V2发布:AI终于撕掉了“纯文本”的标签
你的笔记本也能跑“AI大神”!微软Phi-4-mini-flash-reasoning震撼登场 解锁 AI 生产力:Prompt-Optimizer 如何成为你的提示词神器 探索AI编程的边界:GPT、Gemini、DeepSeek三巨头过招,谁能更胜一筹? HuggingFace周榜揭晓:中国模型领军,多模态与推理能力成新焦点 Spring MVC核心组件HandlerAdapter 的详解 不容错过的AgentGPT:最新部署教程一览
标签聚合
AI deepseek 大模型 教程 java 算法 设计模式 spring

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang