redis+spring 的基本操作 RedisTemplate和RedisClient

通过 Spring Data Redis 的 RedisTemplate 插入值需要根据 数据结构类型 选择对应的操作方法。以下是常见数据类型的插入示例(Kotlin 代码):


1. 插入字符串(String)

适用于存储简单键值对(如缓存、计数器等)。

kotlin 复制代码
// 插入字符串
redisTemplate.opsForValue().set("user:1:name", "张三")

// 插入并设置过期时间(30 秒后自动删除)
redisTemplate.opsForValue().set("user:1:token", "abc123", 30, TimeUnit.SECONDS)

// 仅当键不存在时插入(原子操作)
redisTemplate.opsForValue().setIfAbsent("user:1:status", "active")

2. 插入哈希(Hash)

适用于存储对象或结构化数据(如用户信息、商品属性等)。

kotlin 复制代码
// 插入单个字段
redisTemplate.opsForHash<String, String>().put("user:1", "name", "李四")

// 批量插入字段
val userData = mapOf(
    "age" to "28",
    "email" to "[email protected]"
)
redisTemplate.opsForHash<String, String>().putAll("user:1", userData)

3. 插入列表(List)

适用于队列、栈或顺序数据(如消息队列、操作日志等)。

kotlin 复制代码
// 从左侧插入(LPUSH)
redisTemplate.opsForList().leftPushAll("messages", listOf("msg1", "msg2", "msg3"))

// 从右侧插入(RPUSH)
redisTemplate.opsForList().rightPush("tasks", "task_001")

4. 插入集合(Set)

适用于去重集合(如标签、用户兴趣等)。

kotlin 复制代码
// 插入单个元素
redisTemplate.opsForSet().add("tags", "科技", "体育")

// 批量插入元素
redisTemplate.opsForSet().add("user:1:interests", setOf("音乐", "电影", "旅行"))

5. 插入有序集合(ZSet)

适用于带权重的排序集合(如排行榜、优先级队列等)。

kotlin 复制代码
// 插入带分数的元素
redisTemplate.opsForZSet().add("leaderboard", "玩家A", 100.0)
redisTemplate.opsForZSet().add("leaderboard", "玩家B", 85.5)

6. 通用插入方法

如果数据类型未知或需要动态处理,可通过 RedisTemplate 直接操作连接:

kotlin 复制代码
redisTemplate.execute { connection ->
    connection.stringCommands().set(
        "custom_key".toByteArray(),
        "custom_value".toByteArray()
    )
    null
}

关键配置

确保 RedisTemplate 已正确配置序列化器(如未配置,插入的值可能无法正确序列化):

kotlin 复制代码
@Configuration
class RedisConfig {
    @Bean
    fun redisTemplate(redisConnectionFactory: RedisConnectionFactory): RedisTemplate<String, Any> {
        val template = RedisTemplate<String, Any>()
        template.connectionFactory = redisConnectionFactory
        template.keySerializer = StringRedisSerializer()                      // 键序列化为字符串
        template.valueSerializer = GenericJackson2JsonRedisSerializer()       // 值序列化为 JSON
        template.hashKeySerializer = StringRedisSerializer()                  // Hash 键序列化
        template.hashValueSerializer = GenericJackson2JsonRedisSerializer()   // Hash 值序列化
        return template
    }
}

使用场景示例

1. 缓存用户信息
kotlin 复制代码
data class User(val id: String, val name: String, val age: Int)

val user = User("1", "王五", 30)
redisTemplate.opsForValue().set("user:${user.id}", user)
2. 存储会话信息
kotlin 复制代码
val sessionData = mapOf(
    "userId" to "1001",
    "role" to "admin",
    "lastLogin" to "2023-10-05T12:00:00Z"
)
redisTemplate.opsForHash<String, String>().putAll("session:1001", sessionData)
3. 实现简单队列
kotlin 复制代码
// 生产者插入任务
redisTemplate.opsForList().rightPush("task_queue", "process_data")

// 消费者获取任务
val task = redisTemplate.opsForList().leftPop("task_queue")

注意事项

  1. 序列化一致性:确保插入和读取时使用相同的序列化方式。
  2. 键命名规范 :使用可读性强的命名(如 user:1:profile),避免特殊字符。
  3. 过期时间 :对缓存数据设置合理的过期时间(如 redisTemplate.expire("key", 60, TimeUnit.SECONDS))。
  4. 事务支持 :如需原子性操作,可结合 @Transactional 使用(需启用事务管理)。

通过以上方法,可以灵活操作 Redis 中的各类数据结构,满足不同业务场景需求。

在 Spring + Kotlin 项目中,通过 org.redisson.api.RedissonClient (Redisson 客户端)可以实现丰富的 分布式系统功能。以下是 RedissonClient 的核心操作及典型场景:


1. 分布式对象与数据结构

Redisson 提供了与 Java 集合高度兼容的分布式对象,支持跨 JVM 共享数据。

(1) 分布式键值对(RMap)
kotlin 复制代码
// 获取分布式 Map
val userMap: RMap<String, User> = redissonClient.getMap("userMap")

// 写入数据
userMap["user1"] = User("Alice", 30)

// 读取数据
val user: User? = userMap["user1"]
(2) 分布式列表(RList)
kotlin 复制代码
val taskList: RList<String> = redissonClient.getList("tasks")
taskList.addAll(listOf("task1", "task2", "task3"))
(3) 分布式集合(RSet)
kotlin 复制代码
val uniqueTags: RSet<String> = redissonClient.getSet("tags")
uniqueTags.add("tech")
uniqueTags.add("sports")
(4) 分布式锁(RLock)
kotlin 复制代码
val lock: RLock = redissonClient.getLock("resourceLock")
lock.lock()  // 阻塞直到获取锁
try {
    // 执行临界区代码
} finally {
    lock.unlock()
}

2. 高级分布式功能

(1) 分布式原子操作(RAtomicLong)
kotlin 复制代码
val counter: RAtomicLong = redissonClient.getAtomicLong("globalCounter")
counter.incrementAndGet()  // 原子递增
(2) 发布订阅(RTopic)
kotlin 复制代码
// 订阅频道
val topic: RTopic = redissonClient.getTopic("news")
topic.addListener(String::class.java) { channel, msg ->
    println("收到消息: $msg")
}

// 发布消息
topic.publish("Redis 7.0 正式发布!")
(3) 分布式队列(RQueue)
kotlin 复制代码
val queue: RQueue<String> = redissonClient.getQueue("messageQueue")
queue.offer("msg1")  // 入队
val msg: String? = queue.poll()  // 出队
(4) 分布式延迟队列(RDelayedQueue)
kotlin 复制代码
val delayedQueue: RDelayedQueue<String> = redissonClient.getDelayedQueue(queue)
delayedQueue.offer("delayedMsg", 10, TimeUnit.SECONDS)  // 延迟 10 秒入队

3. 分布式锁进阶

(1) 公平锁
kotlin 复制代码
val fairLock: RLock = redissonClient.getFairLock("fairLock")
fairLock.lock()
(2) 联锁(MultiLock)

同时锁定多个资源:

kotlin 复制代码
val lock1: RLock = redissonClient.getLock("lock1")
val lock2: RLock = redissonClient.getLock("lock2")
val multiLock = redissonClient.getMultiLock(lock1, lock2)
multiLock.lock()
(3) 红锁(RedLock)
kotlin 复制代码
val redLock: RLock = redissonClient.getRedLock(lock1, lock2, lock3)
redLock.lock()

4. 分布式服务

(1) 分布式远程服务(RRemoteService)

实现跨 JVM 的远程方法调用:

kotlin 复制代码
// 定义服务接口
interface UserService {
    fun getUserById(id: String): User
}

// 服务端注册
val remoteService: RRemoteService = redissonClient.getRemoteService("userService")
remoteService.register(UserService::class.java, UserServiceImpl())

// 客户端调用
val userService = remoteService.get(UserService::class.java)
val user = userService.getUserById("123")
(2) 分布式调度任务(RScheduler)
kotlin 复制代码
val scheduler: RScheduler = redissonClient.getScheduler()
scheduler.schedule(
    { println("定时任务执行") },
    CronSchedule.of("0 0/5 * * * ?")  // 每 5 分钟执行
)

5. 与 Spring 整合

(1) 配置 RedissonClient

application.yml 中配置:

yaml 复制代码
spring:
  redis:
    redisson:
      config: |
        singleServerConfig:
          address: "redis://localhost:6379"
          database: 0

或通过 Java/Kotlin 配置类:

kotlin 复制代码
@Configuration
class RedissonConfig {
    @Bean
    fun redissonClient(): RedissonClient {
        val config = Config()
        config.useSingleServer()
            .address = "redis://localhost:6379"
        return Redisson.create(config)
    }
}
(2) 注入并使用
kotlin 复制代码
@Service
class OrderService(
    private val redissonClient: RedissonClient
) {
    fun processOrder(orderId: String) {
        val lock = redissonClient.getLock("orderLock:$orderId")
        lock.lock()
        try {
            // 处理订单逻辑
        } finally {
            lock.unlock()
        }
    }
}

6. 典型应用场景

场景 Redisson 功能 优势
分布式锁 RLockRedLock 避免资源竞争,保证原子性
全局计数器 RAtomicLong 原子操作,支持高并发
消息队列 RQueueRDelayedQueue 跨服务任务调度
缓存共享 RMapRBucket 分布式缓存,数据一致性
实时通知 RTopic 发布订阅模式,解耦系统组件
分布式任务调度 RScheduler 集群环境定时任务协调

注意事项

  1. 依赖版本兼容性:确保 Redisson 版本与 Spring Boot 兼容。
  2. 锁的释放 :务必在 finally 块中释放锁,避免死锁。
  3. 网络超时 :合理配置 timeoutretry 参数。
  4. 序列化 :默认使用 JsonJacksonCodec,可自定义其他编解码器。

通过 RedissonClient,开发者可以轻松在 Spring + Kotlin 项目中实现复杂的分布式系统逻辑,显著简化分布式环境下的开发难度。

相关推荐
爱的叹息1 小时前
Spring 及 Spring Boot 条件化注解(15个)完整列表及示例
spring boot·python·spring
jakeswang1 小时前
Redisson分布式锁深度解析:原理与实现机制
java·redis
陈平安Java and C1 小时前
Redis的Hash类型
redis
Warolitbos3 小时前
Redis学习笔记
redis·笔记·学习
快来卷java5 小时前
优化MyBatis-Plus批量插入策略
java·windows·spring·tomcat·maven·mybatis
Andya_net6 小时前
Redis | 基于 Redis 实现机器列表 Token 缓存的 Java 实现
java·redis·缓存
故城、6 小时前
redis使用
java·redis
Chandler246 小时前
Redis:String 类型 内部实现、编码、命令及应用场景
数据库·redis·缓存
敲键盘的小夜猫6 小时前
Redis GEO 命令详解:轻松实现“附近的人“功能
java·redis