(七)Spring Boot学习——Redis使用

有部分内容是常用的,为了避免每次都查询数据库,将部分数据存入Redis。

一、 下载并安装 Redis

Windows 版的 Redis 官方已不再维护,你可以使用 微软提供的 Redis for Windows 版本 或者 使用 WSL(Windows Subsystem for Linux)安装 Redis。

  1. 下载 Redis for Windows

  2. 解压并进入 Redis 目录

    cd C:\Redis

  3. 启动 Redis 服务器

    redis-server.exe redis.windows.conf

  4. 验证 Redis 是否启动 打开另一个 命令行窗口(CMD),输入:

    redis-cli.exe ping

    如果返回:

    PONG

    说明 Redis 服务器已成功启动 🎉。

二、 配置 Redis

1. 添加 Redis 依赖

如果使用 Maven ,在 pom.xml 添加:

XML 复制代码
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-data-redis</artifactId> 
</dependency>

⚠️ Spring Boot 2.0+ 默认使用 Lettuce,而不是 Jedis。如果要使用 Jedis,需要额外添加依赖

XML 复制代码
<dependency> 
    <groupId>redis.clients</groupId> 
    <artifactId>jedis</artifactId> 
</dependency>

✅ 2. 配置 Redis 连接

在 application.yml 或 application.properties 配置 Redis 连接信息。

🔹 application.properties 配置

XML 复制代码
#配置redis
spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379
spring.data.redis.password=
spring.data.redis.database=0
spring.data.redis.timeout=5000ms
spring.data.redis.lettuce.pool.max-active=8
spring.data.redis.lettuce.pool.max-idle=8
spring.data.redis.lettuce.pool.min-idle=0
spring.data.redis.lettuce.pool.max-wait=-1ms

⚠️ 注意:

  • host:Redis 服务器地址
  • port:Redis 端口(默认 6379)
  • password:如果 Redis 没有密码,保持为空
  • database:选择 Redis 数据库(默认 0)
  • timeout:连接超时时间(5 秒)

✅ 3. 编写 Redis 工具类

可以使用 RedisTemplate 来操作 Redis。

🔹 RedisConfig.java

创建一个 Redis 配置类,注入 RedisTemplate:

java 复制代码
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 使用 String 序列化 key,避免乱码
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

✅ 4. 在 Service 中使用 Redis

你可以直接在 RedisService 中使用 RedisTemplate 提供的方法来存取数据。

🔹 (1) 操作字符串

Redis 的 opsForValue() 主要用于存取字符串数据:

java 复制代码
@Service
public class RedisService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    // 存储字符串数据
    public void setString(String key, String value, long timeout) {
        redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
    }

    // 获取字符串数据
    public String getString(String key) {
        return (String) redisTemplate.opsForValue().get(key);
    }

    // 删除 Key
    public void deleteKey(String key) {
        redisTemplate.delete(key);
    }
}

✅ 2. 操作哈希表(Hash)

Redis 的 opsForHash() 适用于存储对象、键值对等。

java 复制代码
@Service
public class RedisHashService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    // 设置 Hash 值
    public void setHash(String key, String field, String value) {
        redisTemplate.opsForHash().put(key, field, value);
    }

    // 获取 Hash 值
    public Object getHash(String key, String field) {
        return redisTemplate.opsForHash().get(key, field);
    }

    // 获取整个 Hash 对象
    public Map<Object, Object> getAllHash(String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    // 删除 Hash 字段
    public void deleteHashField(String key, String field) {
        redisTemplate.opsForHash().delete(key, field);
    }
}

示例

redisHashService.setHash("user:1001", "name", "Tom"); String name = redisHashService.getHash("user:1001", "name"); // "Tom"


✅ 3. 操作列表(List)

Redis opsForList() 适用于存储列表数据(如消息队列、排行榜等)。

java 复制代码
@Service
public class RedisListService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    // 左侧推入列表
    public void leftPush(String key, String value) {
        redisTemplate.opsForList().leftPush(key, value);
    }

    // 右侧推入列表
    public void rightPush(String key, String value) {
        redisTemplate.opsForList().rightPush(key, value);
    }

    // 获取列表范围
    public List<Object> getListRange(String key, long start, long end) {
        return redisTemplate.opsForList().range(key, start, end);
    }

    // 弹出左侧元素
    public Object leftPop(String key) {
        return redisTemplate.opsForList().leftPop(key);
    }
}

示例

redisListService.leftPush("queue", "task1");

redisListService.leftPush("queue", "task2");

List<Object> tasks = redisListService.getListRange("queue", 0, -1); // ["task2", "task1"]


✅ 4. 操作集合(Set)

Redis opsForSet() 适用于存储无序唯一集合(如标签、好友列表等)。

java 复制代码
@Service
public class RedisSetService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    // 添加集合元素
    public void addToSet(String key, String value) {
        redisTemplate.opsForSet().add(key, value);
    }

    // 获取集合中的所有元素
    public Set<Object> getSetMembers(String key) {
        return redisTemplate.opsForSet().members(key);
    }

    // 删除集合中的某个元素
    public void removeFromSet(String key, String value) {
        redisTemplate.opsForSet().remove(key, value);
    }
}

示例

redisSetService.addToSet("users", "Alice");

redisSetService.addToSet("users", "Bob");

Set<Object> users = redisSetService.getSetMembers("users"); // ["Alice", "Bob"]


✅ 5. 在 Controller 中调用

你可以在 Controller 里调用 RedisService 来测试 Redis 的使用:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/redis")
public class RedisController {

    @Autowired
    private RedisService redisService;

    // 存储 Key-Value
    @PostMapping("/set")
    public String setKey(@RequestParam String key, @RequestParam String value) {
        redisService.setString(key, value, 3600);
        return "存储成功";
    }

    // 获取 Key 的值
    @GetMapping("/get")
    public String getKey(@RequestParam String key) {
        return redisService.getString(key);
    }

    // 删除 Key
    @DeleteMapping("/delete")
    public String deleteKey(@RequestParam String key) {
        redisService.deleteKey(key);
        return "删除成功";
    }
}
相关推荐
用户094248568032 小时前
第19章:库存扣减与秒杀系统:Redis 扛峰值流量
redis·架构·源码
爱写Bug的浮游2 小时前
RTA高频请求下的Redis短缓存工程闭环
redis
没有气的汽水2 小时前
redis加了个分片,把线上写挂了一个多小时
redis
La Pulga2 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd2 小时前
秋招学习笔记 day106
笔记·学习
aiks_yuan2 小时前
Spring Boot SSE 流式输出变成一次性返回怎么办:大模型打字机效果失效的 5 个原因(Spring Boot 4.1.2 实测)
spring boot
小李不想当小白3 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
xixiaoyunya3 小时前
Redis缓存三大问题实战:穿透、击穿、雪崩,我用一个电商秒杀场景讲清楚
数据库·redis·缓存
Thomas.Sir4 小时前
第15课:SpringBoot连接池详解:HikariCP配置、调优、监控,4.x连接池新特性
java·spring boot
鶴哥只手遮天4 小时前
《Redis 8.10.3 深度剖析》系列 · 第 1 章·全景与源码地图:版本谱系、构建体系、全局状态与启动链路
redis·后端·开源