返回顶部
首页 > 资讯 > 数据库 >redis中使用java脚本实现分布式锁
  • 764
分享到

redis中使用java脚本实现分布式锁

分布式脚本redis 2022-06-04 17:06:17 764人浏览 独家记忆
摘要

Redis被大量用在分布式的环境中,自然而然分布式环境下的锁如何解决,立马成为一个问题。例如我们当前的手游项目,服务器端是按业务模块划分服务器的,有应用服,战斗服等,但是这两个vm都有可能同时改变玩家的属性

Redis被大量用在分布式的环境中,自然而然分布式环境下的如何解决,立马成为一个问题。例如我们当前的手游项目服务器端是按业务模块划分服务器的,有应用服,战斗服等,但是这两个vm都有可能同时改变玩家的属性,这如果在同一个vm下面,就很容易加锁,但如果在分布式环境下就没那么容易了,当然利用redis现有的功能也有解决办法,比如redis的脚本。

redis在2.6以后的版本中增加了lua脚本的功能,可以通过eval命令,直接在RedisServer环境中执行Lua脚本,并且可以在Lua脚本中调用Redis命令。
使用脚本的好处:

1.减少网络开销:可以把一些要批量处理的功能,发在一个脚本里面执行,减少客户端和redis的交互次数
2.原子操作:这主要就是我们在这边主要利用的功能,在分布式环境下保证数据的原子性。
3.复用:客户端发送的脚本会永久的存储在redis中,这就意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑。

下面先看一段lua脚本:

local food=redis.call('hget',KEYS[1],'food');

food=food+ARGV[1];

redis.call('hset',KEYS[1],'food',food);

local diamond=redis.call('hget',KEYS[1],'diamond');

diamond=diamond+ARGV[2];

redis.call('hset',KEYS[1],'diamond',diamond);

注:redis.call是我们在脚本中调用redis命令,KEYS和ARGV2个数组,分别是键和参数,下标都是从1开始的,不是0。
这段脚本的功能是取出 KEYS指定的玩家food(粮草)和diamond(玉石),然后就行修改,最后保存在redis中,脚本的执行,保证了整个操作的原子性。

下面我们用java代码来看看具体的实现过程

Jedis jedis = new Jedis("192.168.128.128", 6379);

// 1.初始玩家数据到redis中

GamePlayer player = new GamePlayer();

player.setId(1001);

player.setName("ksfzhaohui");

player.setFood(100);

player.setDiamond(100);

 

Map<String, String> beanMap = BeanUtil.warp(player);// 将对象转换成map

String beanKey = getRedisBeanKey(player.getClass(), player.getId());

System.out.println("key:" + beanKey);

jedis.hmset(beanKey, beanMap);// 将玩家数据保存到redis中

首先模拟了一个玩家将玩家信息保存在redis中,这边的Id随便写了一个,正常的情况下都是通过redis的命令incr生成一个id
结果:
查看图片

String script = "local food=redis.call('hget',KEYS[1],'food');"

                + "food=food+ARGV[1];"

                + "redis.call('hset',KEYS[1],'food',food);"

                + "local diamond=redis.call('hget',KEYS[1],'diamond');"

                + "diamond=diamond+ARGV[2];"

                + "redis.call('hset',KEYS[1],'diamond',diamond);";

List<String> keys = new ArrayList<String>();

keys.add(beanKey);

List<String> args = new ArrayList<String>();

args.add("100");

args.add("100");

// 3.执行脚本

jedis.eval(script, keys, args);

指定键和参考,执行脚本,结果:

查看图片

BeanUtil代码:

public class BeanUtil {

    private static Logger logger = Logger.getLogger(BeanUtil.class);

    private static final String CLASS = "class";

 

    

    @SuppressWarnings("all")

    public static Map<String, String> warp(Object bean) {

        Map<String, String> propertyMap = new HashMap<String, String>();

        try {

            PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass())

                    .getPropertyDescriptors();

            for (PropertyDescriptor propertyDescriptor : ps) {

                String propertyName = propertyDescriptor.getName();

                if (propertyName != null && !propertyName.equals(CLASS)) {

                    Method getter = propertyDescriptor.getReadMethod();

                    if (getter != null) {

                        propertyMap.put(propertyName,

                                String.valueOf(getter.invoke(bean, null)));

                    }

                }

            }

        } catch (Exception e) {

            logger.error(e);

        }

        return propertyMap;

    }

 

}

您可能感兴趣的文档:

--结束END--

本文标题: redis中使用java脚本实现分布式锁

本文链接: https://lsjlt.com/news/11733.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • redis中使用java脚本实现分布式锁
    redis被大量用在分布式的环境中,自然而然分布式环境下的锁如何解决,立马成为一个问题。例如我们当前的手游项目,服务器端是按业务模块划分服务器的,有应用服,战斗服等,但是这两个vm都有可能同时改变玩家的属性...
    99+
    2022-06-04
    分布式 脚本 redis
  • Java中怎么使用Redis实现分布式锁
    这篇“Java中怎么使用Redis实现分布式锁”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2023-05-25
    java redis
  • java怎么使用redis实现分布式锁
    在Java中使用Redis实现分布式锁可以通过以下步骤:1. 引入Redis相关的依赖,例如Jedis或Lettuce。2. 创建一...
    99+
    2023-10-09
    java redis
  • 怎么在Java中使用redis实现分布式锁
    本篇文章给大家分享的是有关怎么在Java中使用redis实现分布式锁,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。原理剖析上述三种分布式锁都是通过各自为依据对各个请求进行上锁,...
    99+
    2023-06-15
  • Java基于Redis实现分布式锁
    分布式锁可以基于很多种方式实现,比如zookeeper、redis...。不管哪种方式,他的基本原理是不变的:用一个状态值表示锁,对锁的占用和释放通过状态值来标识。一、为什么Redis可以方便地实现分布式锁Redis为单进程单线程模式,采用...
    99+
    2015-09-14
    java教程 Java
  • 基于Redis实现分布式锁的方法(lua脚本版)
    1、前言 在Java中,我们通过锁来避免由于竞争而造成的数据不一致问题。通常我们使用synchronized 、Lock来实现。但是Java中的锁只能保证在同一个JVM进程内中可用...
    99+
    2024-04-02
  • Redis——》实现分布式锁
    推荐链接:     总结——》【Java】     总结——》【Mysql】     总结——》【Redis】     总结——》【Kafka】     总结——》【Spring】     总结—...
    99+
    2023-09-03
    redis 分布式 过期 lua
  • Redis实现分布式锁
    单体锁存在的问题 在单体应用中,如果我们对共享数据不进行加锁操作,多线程操作共享数据时会出现数据一致性问题。 (下述实例是一个简单的下单问题:从redis中获取库存,检查库存是否够,>0才允许下单) 我们的解决办法通常是加锁。如下加单体锁...
    99+
    2023-08-16
    分布式 java jvm
  • 如何使用Redis实现分布式锁
    这篇文章将为大家详细讲解有关如何使用Redis实现分布式锁,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。加锁部分解锁部分主要原理是使用了 redis 的 s...
    99+
    2024-04-02
  • 使用Redis如何实现分布式锁
    这篇文章主要介绍了使用Redis如何实现分布式锁的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇使用Redis如何实现分布式锁文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2024-04-02
  • PHP中利用Redis实现分布式锁
    随着互联网的快速发展,网站访问量的急剧增加,分布式系统的重要性也逐渐凸显出来。在分布式系统中,不可避免地涉及到并发同步以及数据一致性的问题。而分布式锁,作为一种解决并发同步问题的手段,也逐渐被广泛应用于分布式系统中。在PHP中,可以利用Re...
    99+
    2023-05-15
    PHP redis 分布式锁
  • Java-Redis-Redisson分布式锁的功能使用及实现
    目录前置基础设施功能使用和介绍其他悲观锁的实现方式前置 Java-Redis-Redisson配置基础上我们进行了改造,让锁的使用更加方便 基础设施 RedissonLock imp...
    99+
    2022-11-13
    Java Redis Redisson分布式锁 Java  Redisson分布式锁
  • 使用Redis实现分布式锁的方法
    目录Redis 中的分布式锁如何使用分布式锁的使用场景使用 Redis 来实现分布式锁使用 set key value px milliseconds nx 实现SETNX+Lua 实现使用 Redlock 实现分布式锁...
    99+
    2022-06-16
    Redis分布式锁
  • 为什么使用redis实现分布式锁
    使用redis实现分布式锁的原因:使用redis不会有线程安全问题。redis数据存在内存中,使效率有一定的提升。redis还支持丰富数据类型。redis可以在缓存、消息传递队列中使用,在应用程序如 Web 应用程序会话、网站页面点击数等任...
    99+
    2024-04-02
  • PHP中使用Redis实现分布式锁升级版
    随着Web应用的发展,分布式架构已经成为了越来越多应用的标配。但是,在分布式架构中,如何保证多个应用同时访问同一资源的互斥性,保证数据的一致性,就成为了每个开发人员需要面对的问题。分布式锁就是一种保证互斥性的解决方案。在PHP语言中,使用R...
    99+
    2023-05-16
    PHP redis 分布式锁
  • 怎么在SpringBoot中使用Redis实现分布式锁
    这篇文章主要介绍了怎么在SpringBoot中使用Redis实现分布式锁的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么在SpringBoot中使用Redis实现分布式锁文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • redis分布式锁的实现
    一、使用分布式锁要满足的几个条件:1、系统是一个分布式系统(关键是分布式,单机的可以使用ReentrantLock或者synchronized代码块来实现)2、共享资源(各个系统访问同一个资源,资源的载体可...
    99+
    2024-04-02
  • Redis Template实现分布式锁
    今天就跟大家聊聊有关Redis Template实现分布式锁,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。可靠性首先,为了确保分布式锁可用,我们至少...
    99+
    2024-04-02
  • PHP+Redis实现分布式锁
    目录 一、分布式锁概述 二、redis实现锁的命令 1、redis实现锁的命令 3、释放锁的步骤 三、PHP+redis分布式锁示例 四、redis集群分布式锁 一、分布式锁概述         在分布式环境下,各个线程通过对公共资...
    99+
    2023-09-15
    分布式锁
  • Redis实现分布式锁(SETNX)
    目录 1、什么是分布式锁 2、分布式锁应具备的条件         3、为什么使用分布式锁 4、SETNX介绍 5、分布式锁实现 6、效果演示 7、Redisson分布式锁详解 8、Lua脚本实现可重入分布式锁 1、什么是分布式锁  ...
    99+
    2023-10-21
    redis 分布式 java spring boot 后端
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作