墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. java
  3. Redis
  4. 正文

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

2023年 5月 5日 172点热度 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日

墨风如雪

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

打赏 点赞
下一篇 >

文章评论

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

墨风如雪

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

最新 热点 随机
最新 热点 随机
小红书AI新里程碑:dots.llm1,中文MoE的“人文”突破! 告别机械感!OpenAudio S1让AI声音活起来 Sora触手可及!微软必应AI视频生成器,全民创作时代来临? 阿里WebAgent开源:引领自主搜索新纪元 重磅炸弹!字节跳动开源BAGEL:70亿参数,统一多模态理解与生成,AI“全能王”诞生记! 小米MiMo-VL:7B参数,怎么就成了多模态界的“越级打怪王”?
AI圈炸锅了!Mistral Medium 3:性能 SOTA,成本打骨折,企业玩家的新宠?字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器告别“微信黑箱”!Chatlog:让你的聊天记录也能拥有“AI大脑”!字节跳动 Seed-Coder-8B:不靠人工洗数据,这80亿参数的小模型如何写出顶尖代码?85倍速的视觉革命:苹果发布 FastVLM,让你的 iPhone ‘看图说话’,快到飞起!告别AI视频“变脸怪”!腾讯混元Hunyuan Custom重磅开源,主体一致性“王炸”来了!
Spring DI:依赖注入的完整指南 设计模式:享元设计模式 Java中的原子类与JUC包中的锁有何区别? Java中的构造器(构造方法)和this关键字 告别“微信黑箱”!Chatlog:让你的聊天记录也能拥有“AI大脑”! 设计模式:访问者设计模式
标签聚合
spring 教程 java 动态规划 设计模式 算法 AI deepseek

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

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策