【Redis】redis的setnx使用

本文探讨了在车牌识别业务中,如何通过Redis的setnx命令实现推送逻辑的加锁,避免同一车牌号在同一天内多次推送消息,确保系统的稳定性和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务需求是这样的:扫车牌,添加一个车牌号,推送消息到一体机,小程序,若该对应用户的会员卡有余额不足的情况,推送到极光服务。
添加车牌号需要判断今日车辆是否进场,如果已经进场过,直接返回提示,否则添加入库,执行逻辑。

问题:
推送逻辑不能影响主逻辑,所以将推送逻辑放在了finally。但是若重复进场,我不能重复极光推送,try里执行完入库操作,在finally的逻辑里如果再次判断是否进场,就会报已进场,这样肯定不行的。

解决办法:
当日同门店下同一车牌号,不能多次推送,所以我们选择将推送逻辑加锁。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String currentDate = sdf.format(new Date());
if(jedisPythonUtil.setnx("getLicencePlateList:" + addRequestModel.getStoreId() + ":" + currentDate + ":" + addRequestModel.getCarNum(),  "0", 86400) > 0) {
    //极光推送逻辑
}

我们再看setnx的方法:

    private JedisPool jedisPoolPython;
    
	/**
     * set if not exists,若key已存在,则setnx不做任何操作
     *
     * @param key
     * @param value key已存在,1:key赋值成功
     * @param expire 过期时间,单位:秒
     * @return
     * @author jqlin
     */
    public  long setnx(String key, String value, int expire) {
        long result = -1;
        Jedis jedis = getJedis();
        try {
            if(null != jedis) {
                result = jedis.setnx(key, value);
                jedis.expire(key, expire);
            }
        } catch (Exception e) {
            log.error("设置值失败:" + e.getMessage(), e);

        } finally {
            returnResource(jedis);
        }

        return result;
    }
    
    /**
     * 同步获取Jedis实例
     *
     * @return Jedis
     */
    public  Jedis getJedis() {
        if (jedisPoolPython == null) {
            poolInit();
        }
        Jedis jedis = null;
        try {
            if (jedisPoolPython != null) {
                jedis = jedisPoolPython.getResource();
            }
        } catch (Exception e) {
            log.error("同步获取Jedis实例失败" + e.getMessage(), e);
            returnResource(jedis);
        }
        return jedis;
    }
    
    /**
     * 释放jedis资源
     * @param jedis
     */
    public static void returnResource(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }

总结:
不要照搬代码,理解意思,自己的需求再下手。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值