Redis:如何实现一个互斥锁(Java)?

发布时间 2023-04-19 22:12:32作者: 在博客做笔记的路人甲

互斥锁是指同一时间只能有一个线程获取到的资源,其它线程需要等待。

 

原理

  setnx keyName value,只有当keyName不存在时,才会写入成功,返回1。

 

实现

  获取锁操作。

    /**
     * 获取互斥锁:在redis中存入一个key-value,若存入成功,则获取锁成功,若存入失败,则获取锁失败。
     * @param key 作为锁的key,value为1
     * @return
     */
    private boolean tyrLock(String key){
        //写入一个数据到缓存中,如果数据已经存在,则不写入。
        Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(key,"1",10, TimeUnit.SECONDS);
        //避免空指针
        if(flag!=null){
            //自动拆箱
            return flag;
        }
        return false;
    }

  释放锁操作。

    /**
     * 释放互斥锁:删除作为锁的key-value
     */
    private void unlock(String key){
        stringRedisTemplate.delete(key);
    }