前言
本文使用Redis工具Jedis对Redis进行操作
在开始正文之前,我们先整理一下,如何使用Jedis对Redis客户端进行操作
package com.ipplus360.api.common.util;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import java.util.Set;
/**
* @Author: byron
* @Date: 2023/05/05/10:56
* @Description:
*/
public class RedisUtil {
private static final Logger LOGGER = LoggerFactory
.getLogger(RedisUtil.class);
private final JedisPool jedisPool;
/**
* @param host 主机地址
* @param port 端口
* @param timeout 超时间(毫秒)
* @param password 密码
* @param bd_index 制定数据库索引
* @throws Exception
*/
public RedisUtil(String host, int port, String password) throws Exception {
this.jedisPool = new JedisPool(new GenericObjectPoolConfig(), host, port, timeout, "passward", bd_index);
}
}
正文
Transaction transaction = jedis.multi(); 的用法以及作用
Jedis 中的行Transaction transaction = jedis.multi();用于初始化一个新的事务对象。
在 Redis 中,事务允许您将多个命令组合在一起并以原子方式执行它们。使用事务的目的是确保事务中的所有命令都成功执行,或者都不应用。
以下是Transaction对象和multi()方法的工作原理:
1.创建Jedis 实例:
在使用事务之前,您需要创建该类的一个实例Jedis,它表示与 Redis 服务器的连接。您通常会提供主机和端口信息以连接到 Redis 服务器。
如文章最开始
2.开始一个事务:
一旦你有了实例Jedis,你就可以通过调用multi()实例上的方法来开始一个新的事务。此方法返回该类的一个实例Transaction。
Transaction transaction = jedis.multi();
在事务内排队命令:获取Transaction对象后,可以在事务内将要执行的Redis命令排队。这些命令将存储在队列中,并在提交事务时自动执行。
transaction.set("key1", "value1");
transaction.set("key2", "value2");
transaction.del("key3");
在上面的示例中,我们在事务中对三个命令( SET、SET和)进行了排队。DEL这些命令将作为一个原子单元一起执行。
执行事务:要执行事务,您需要调用对象Transaction上的方法exec()。此方法返回表示事务中每个命令的结果的对象列表。
List<Object> results = transaction.exec();
该exec()方法将自动执行所有排队的命令。如果事务中的所有命令都成功执行,该exec()方法将返回结果列表。如果任何命令失败或发生错误,事务将回滚并exec()返回null。
处理结果:执行事务后,您可以处理从exec()方法中获得的结果。结果以对象列表的形式返回,其中每个对象代表事务中相应命令的结果。
for (Object result : results) {
// Handle individual command results
}
您可以遍历结果列表并相应地处理每个命令结果。
请记住在使用完Jedis实例和对象后正确关闭它们以释放资源。Transaction
transaction.close();
3.具体实例
public void pay(String key, Integer dailyLimit) throws Exception {
// 自动关闭 redis 客户端
try (Jedis jedis = jedisPool.getResource()) {
String val = jedis.get(key);
// 获取第二天开始时间
Date startOfDay = DateUtil.ldt2Date(DateUtil.getStartOfTomorrow(null));
if (StringUtils.isBlank(val)) {
setExpireByDay(key, "1", startOfDay);
} else {
long limitCount = Long.valueOf(val);
if (limitCount < dailyLimit) {
Transaction transaction = jedis.multi();
transaction.incr(key);
transaction.exec();
// 手动关闭事务
transaction.close();
} else {
throw new MyRuntimeException(ServiceStatusEnums.DAILY_LIMITED);
}
}
}
}