千家信息网

Redis分布式锁的示例分析

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,小编给大家分享一下Redis分布式锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!第一版本:@Override
千家信息网最后更新 2026年11月01日Redis分布式锁的示例分析

小编给大家分享一下Redis分布式锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

第一版本:

@Override        public  Long set(String key,T value, Long cacheSeconds) {                if (value instanceof HashMap) {                        BoundHashOperations valueOperations = redisTemplate.boundHashOps(key);                        valueOperations.putAll((Map) value);                        valueOperations.expire(cacheSeconds, TimeUnit.SECONDS);                }                else{                //使用map存储                BoundHashOperations valueOperations = redisTemplate.boundHashOps(key);                valueOperations.put(key, value);                //秒                valueOperations.expire(cacheSeconds, TimeUnit.SECONDS);                }                return null;        }        @Override        public void del(String key) {                redisTemplate.delete(key);        }

采用set 和 del 完成锁的占用与释放,后经测试得知,set不是线程安全,在并发情况下常常会导致数据不一致.

第二版本:

/**   * 分布式锁   * @param range 锁的长度 允许有多少个请求抢占资源   * @param key   * @return   */  public boolean getLock(int range, String key) {    ValueOperations valueOper1 = template.opsForValue();    return valueOper1.increment(key, 1) <= range;  }  /**   * 初始化锁, 设置等于0   * @param key   * @param expireSeconds   * @return   */  public void initLock(String key, Long expireSeconds) {    ValueOperations operations = template.opsForValue();    template.setKeySerializer(new GenericJackson2JsonRedisSerializer());    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());    operations.set(key, 0, expireSeconds * 1000);  }  /**   * 释放锁   * @param key   */  public void releaseLock(String key) {    ValueOperations operations = template.opsForValue();    template.setKeySerializer(new GenericJackson2JsonRedisSerializer());    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());    template.delete(key);  }

采用redis的 increament操作完成锁的抢占.但是释放锁时,是每个线程都可以删除redis中的key值. 并且initLock会降上一次的操作给覆盖掉,所以也废弃掉此方法

最终版本:

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.connection.jedis.JedisConnection;import org.springframework.stereotype.Service;import org.springframework.util.ReflectionUtils;import redis.clients.jedis.Jedis;import java.lang.reflect.Field;import java.util.Collections;@Servicepublic class RedisLock {  private static final String LOCK_SUCCESS = "OK";  private static final String SET_IF_NOT_EXIST = "NX";  private static final String SET_WITH_EXPIRE_TIME = "PX";  private static final Long RELEASE_SUCCESS = 1L;  @Autowired  private RedisConnectionFactory connectionFactory;  /**   * 尝试获取分布式锁   * @param lockKey 锁   * @param requestId 请求标识   * @param expireTime 超期时间   * @return 是否获取成功   */  public boolean lock(String lockKey, String requestId, int expireTime) {    Field jedisField = ReflectionUtils.findField(JedisConnection.class, "jedis");    ReflectionUtils.makeAccessible(jedisField);    Jedis jedis = (Jedis) ReflectionUtils.getField(jedisField, connectionFactory.getConnection());    String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);    if (LOCK_SUCCESS.equals(result)) {      return true;    }    return false;  }  /**   * 释放分布式锁   * @param lockKey 锁   * @param requestId 请求标识   * @return 是否释放成功   */  public boolean releaseLock(String lockKey, String requestId) {    String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";    Object result = getJedis().eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));    if (RELEASE_SUCCESS.equals(result)) {      return true;    }    return false;  }  public Jedis getJedis() {    Field jedisField = ReflectionUtils.findField(JedisConnection.class, "jedis");    ReflectionUtils.makeAccessible(jedisField);    Jedis jedis = (Jedis) ReflectionUtils.getField(jedisField, connectionFactory.getConnection());    return jedis;  }}

以上是"Redis分布式锁的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

分布式 篇文章 示例 分析 成功 内容 标识 版本 线程 一致 安全 不怎么 大部分 情况 数据 时间 更多 此方法 知识 第一版 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技工作委员会 互联网佳科技有限公司 西安纸贵互联网科技有限公司 疫情对互联网科技公司影响 工业互联网科技新基建 互联网科技资迅 深圳互联网络科技有限公司 善班互联网科技有限公司 沃里互联网科技 赫美联合互联网科技 汉立互联网科技有限公司联系电话 中国科技互联网公司收入 阿里互联网科技公司 重庆互联网医院沙龙医盟信息科技 互联网时代的科技公司 互联网科技包装股 珠海东科互联网科技有限公司 科技互联网专业务虚会材料 网互联网络科技 知域互联网科技有限公司官网 互联网科技工作委员会 互联网与科技金融数据 互联网科技创新企业排名 互联网和黑科技的看法 荆州市昕露互联网络科技有限公司 互联网科技和法律行业 互联网方面的科技前沿 高科技互联网套路 互联网科技实习生岗位 互联网科技企业商标注意事项
0