Spring Boot + RedisTemplate 数据结构的基础操作

📚 一、Redis简介与Spring Boot集成

Redis核心数据类型

Redis支持5种主要数据结构:

  • String:字符串,最基本的数据类型

  • Hash:哈希表,适合存储对象

  • List:列表,支持顺序操作

  • Set:无序集合,支持交并差运算

  • ZSet:有序集合,适合排行榜场景

Spring Boot集成配置

依赖配置(pom.xml):

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

配置文件(application.yml):

XML 复制代码
spring:
  redis:
    host: localhost
    port: 6379
    database: 0
    timeout: 3000ms
    lettuce:
      pool:
        max-active: 8
        max-idle: 8

🔧 二、RedisTemplate配置与初始化

序列化配置类

java 复制代码
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        // 设置key序列化为String
        template.setKeySerializer(new StringRedisSerializer());
        // 设置value序列化为JSON
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return template;
    }
}

注入操作对象

java 复制代码
@Service
public class RedisService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Autowired
    private ValueOperations<String, Object> valueOps;  // String操作
    @Autowired
    private HashOperations<String, String, Object> hashOps;  // Hash操作
    @Autowired
    private ListOperations<String, Object> listOps;  // List操作
    @Autowired
    private SetOperations<String, Object> setOps;  // Set操作
    @Autowired
    private ZSetOperations<String, Object> zSetOps;  // ZSet操作
}

📊 三、5种数据类型操作详解

1. String类型 - 基础键值存储

java 复制代码
// 基本操作
valueOps.set("username", "张三");  // SET
valueOps.get("username");          // GET
valueOps.increment("counter");     // INCR
valueOps.set("token", "abc123", 30, TimeUnit.MINUTES);  // 带过期时间

// 进阶操作
valueOps.setIfAbsent("lock", "locked");  // SETNX(分布式锁)
valueOps.getAndSet("key", "newValue");   // GETSET

2. Hash类型 - 对象存储

java 复制代码
// 存储用户对象
Map<String, Object> user = new HashMap<>();
user.put("name", "张三");
user.put("age", 25);
user.put("email", "zhangsan@example.com");

hashOps.putAll("user:1001", user);  // HMSET

// 操作字段
hashOps.get("user:1001", "name");     // HGET
hashOps.hasKey("user:1001", "age");   // HEXISTS
hashOps.keys("user:1001");            // HKEYS
hashOps.increment("user:1001", "age", 1);  // HINCRBY

3. List类型 - 队列和栈

java 复制代码
// 队列操作(左进右出)
listOps.leftPush("tasks", "task1");    // LPUSH
listOps.leftPushAll("tasks", "task2", "task3");
listOps.rightPop("tasks");             // RPOP

// 列表操作
listOps.range("messages", 0, 10);      // LRANGE
listOps.index("messages", 0);          // LINDEX
listOps.trim("messages", 0, 99);       // LTRIM(保留最近100条)

4. Set类型 - 无序集合

java 复制代码
// 标签系统示例
setOps.add("user:tags:1001", "java", "redis", "spring");  // SADD
setOps.members("user:tags:1001");                         // SMEMBERS

// 集合运算
setOps.intersect("user:tags:1001", "user:tags:1002");     // SINTER(交集)
setOps.union("tag:java:users", "tag:redis:users");        // SUNION(并集)
setOps.isMember("user:tags:1001", "java");                // SISMEMBER

5. ZSet类型 - 有序集合(排行榜)

java 复制代码
// 游戏排行榜
zSetOps.add("leaderboard", "player1", 1000);               // ZADD
zSetOps.add("leaderboard", "player2", 2000);
zSetOps.incrementScore("leaderboard", "player1", 500);     // ZINCRBY

// 查询操作
zSetOps.reverseRange("leaderboard", 0, 9);                 // ZREVRANGE(前10名)
zSetOps.rank("leaderboard", "player1");                    // ZRANK(排名)
zSetOps.score("leaderboard", "player1");                   // ZSCORE(分数)
zSetOps.count("leaderboard", 1000, 3000);                  // ZCOUNT(分数区间统计)

⚡ 四、高级特性与实战应用

事务支持

java 复制代码
redisTemplate.execute(new SessionCallback<List<Object>>() {
    @Override
    public List<Object> execute(RedisOperations operations) throws DataAccessException {
        operations.multi();  // 开启事务
        operations.opsForValue().set("key1", "value1");
        operations.opsForValue().increment("counter");
        return operations.exec();  // 执行事务
    }
});

管道技术(批量操作)

java 复制代码
List<Object> results = redisTemplate.executePipelined(new SessionCallback<Object>() {
    @Override
    public Object execute(RedisOperations operations) throws DataAccessException {
        for (int i = 0; i < 1000; i++) {
            operations.opsForValue().set("key:" + i, "value:" + i);
        }
        return null;
    }
});
相关推荐
我是大猴子几秒前
解决并发的两种方法(没用到redis)(对上一期的补充)以及开启多个定时任务
数据库·redis·缓存
无巧不成书02183 分钟前
Java数值字面量速查表
java·开发语言·python·开发者·字面量
難釋懷5 分钟前
Redis分片集群散列插槽
数据库·redis·缓存
美式请加冰7 分钟前
模拟的介绍和使用
java·开发语言·算法
菜菜小狗的学习笔记15 分钟前
剑指Offer算法题(二)栈、队列、堆
java·开发语言
李宥小哥22 分钟前
SQLite04-表数据管理
java·jvm·数据库
李宥小哥22 分钟前
SQLite05-常用函数
java·开发语言·jvm
huohuopro23 分钟前
idea配置servlet项目
java·servlet·intellij-idea
zzb158025 分钟前
Agent学习-ReAct框架
java·人工智能·python·机器学习·ai
zhangx1234_26 分钟前
java list介绍
java·开发语言·list