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;
    }
});
相关推荐
打工的小王2 小时前
java并发编程(六)CountDownLatch和回环屏障CyclicBarrier
java·开发语言
知识即是力量ol2 小时前
深度解析:基于 JWT + Redis 白名单的双令牌高安全认证架构
redis·安全·架构
知无不研2 小时前
选择排序算法
数据结构·算法·排序算法·选择排序
nbsaas-boot2 小时前
如何进行 Vibe Coding:从“灵感驱动”到“可交付工程”的方法论
java·ai编程
郝学胜-神的一滴2 小时前
Python中的bisect模块:优雅处理有序序列的艺术
开发语言·数据结构·python·程序人生·算法
陌上丨2 小时前
什么是Redis的大Key和热Key?项目中一般是怎么解决的?
数据库·redis·缓存
Remember_9932 小时前
Spring 事务深度解析:实现方式、隔离级别与传播机制全攻略
java·开发语言·数据库·后端·spring·leetcode·oracle
roman_日积跬步-终至千里2 小时前
【Java并发】用 JMM 与 Happens-Before 解决多线程可见性与有序性问题
java·开发语言·spring
空空kkk2 小时前
SSM项目练习——hami音乐(三)
java·数据库