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;
    }
});
相关推荐
mjhcsp26 分钟前
C++ 后缀平衡树解析
android·java·c++
望舒51328 分钟前
代码随想录day33,动态规划part2
java·算法·leetcode·动态规划
追随者永远是胜利者1 小时前
(LeetCode-Hot100)169. 多数元素
java·算法·leetcode·go
蜜獾云1 小时前
JAVA面试题速记-第1期-java基础
java·开发语言
百锦再1 小时前
Java中的反射机制详解:从原理到实践的全面剖析
java·开发语言·jvm·spring boot·struts·spring cloud·kafka
没有bug.的程序员1 小时前
Gradle 构建优化深度探秘:从 Java 核心到底层 Android 物理性能压榨实战指南
android·java·开发语言·分布式·缓存·gradle
tianyagukechat2 小时前
rockylinux9.5 配置IP
java·网络·tcp/ip
程序员Sonder2 小时前
黑马java----正则表达式(一文弄懂)
java·正则表达式·新人首发
doris82042 小时前
Python 正则表达式 re.findall()
java·python·正则表达式
Anastasiozzzz2 小时前
阿亮随手记:动态条件生成Bean
java·前端·数据库