一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Redis - redis中使用java腳本實(shí)現(xiàn)分布式鎖

redis中使用java腳本實(shí)現(xiàn)分布式鎖

2019-10-22 15:17redis教程網(wǎng) Redis

這篇文章主要介紹了redis中使用java腳本實(shí)現(xiàn)分布式鎖,本文同時(shí)講解了java腳本和lua腳本實(shí)現(xiàn)分布式鎖,需要的朋友可以參考下

redis被大量用在分布式的環(huán)境中,自然而然分布式環(huán)境下的鎖如何解決,立馬成為一個(gè)問題。例如我們當(dāng)前的手游項(xiàng)目,服務(wù)器端是按業(yè)務(wù)模塊劃分服務(wù)器的,有應(yīng)用服,戰(zhàn)斗服等,但是這兩個(gè)vm都有可能同時(shí)改變玩家的屬性,這如果在同一個(gè)vm下面,就很容易加鎖,但如果在分布式環(huán)境下就沒那么容易了,當(dāng)然利用redis現(xiàn)有的功能也有解決辦法,比如redis的腳本。

redis在2.6以后的版本中增加了Lua腳本的功能,可以通過eval命令,直接在RedisServer環(huán)境中執(zhí)行Lua腳本,并且可以在Lua腳本中調(diào)用Redis命令。
使用腳本的好處:

1.減少網(wǎng)絡(luò)開銷:可以把一些要批量處理的功能,發(fā)在一個(gè)腳本里面執(zhí)行,減少客戶端和redis的交互次數(shù)
2.原子操作:這主要就是我們?cè)谶@邊主要利用的功能,在分布式環(huán)境下保證數(shù)據(jù)的原子性。
3.復(fù)用:客戶端發(fā)送的腳本會(huì)永久的存儲(chǔ)在redis中,這就意味著其他客戶端可以復(fù)用這一腳本而不需要使用代碼完成同樣的邏輯。

下面先看一段lua腳本:

復(fù)制代碼代碼如下:

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是我們?cè)谀_本中調(diào)用redis命令,KEYS和ARGV2個(gè)數(shù)組,分別是鍵和參數(shù),下標(biāo)都是從1開始的,不是0。 
這段腳本的功能是取出 KEYS指定的玩家food(糧草)和diamond(玉石),然后就行修改,最后保存在redis中,腳本的執(zhí)行,保證了整個(gè)操作的原子性。

 

下面我們用java代碼來看看具體的實(shí)現(xiàn)過程

 

復(fù)制代碼代碼如下:

Jedis jedis = new Jedis("192.168.128.128", 6379);
// 1.初始玩家數(shù)據(jù)到redis中
GamePlayer player = new GamePlayer();
player.setId(1001);
player.setName("ksfzhaohui");
player.setFood(100);
player.setDiamond(100);
 
Map<String, String> beanMap = BeanUtil.warp(player);// 將對(duì)象轉(zhuǎn)換成map
String beanKey = getRedisBeanKey(player.getClass(), player.getId());
System.out.println("key:" + beanKey);
jedis.hmset(beanKey, beanMap);// 將玩家數(shù)據(jù)保存到redis中

 

首先模擬了一個(gè)玩家將玩家信息保存在redis中,這邊的Id隨便寫了一個(gè),正常的情況下都是通過redis的命令incr生成一個(gè)id
結(jié)果: 
redis中使用java腳本實(shí)現(xiàn)分布式鎖

 

復(fù)制代碼代碼如下:

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.執(zhí)行腳本
jedis.eval(script, keys, args);

 

指定鍵和參考,執(zhí)行腳本,結(jié)果:

redis中使用java腳本實(shí)現(xiàn)分布式鎖

BeanUtil代碼:

 

復(fù)制代碼代碼如下:

public class BeanUtil {
    private static Logger logger = Logger.getLogger(BeanUtil.class);
    private static final String CLASS = "class";
 
    /**
     * 將指定的對(duì)象數(shù)據(jù)封裝成map
     * 
     * @param bean
     *            對(duì)象數(shù)據(jù)
     * @return
     */
    @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;
    }
 
}

延伸 · 閱讀

精彩推薦
  • Redis詳解Redis復(fù)制原理

    詳解Redis復(fù)制原理

    與大多數(shù)db一樣,Redis也提供了復(fù)制機(jī)制,以滿足故障恢復(fù)和負(fù)載均衡等需求。復(fù)制也是Redis高可用的基礎(chǔ),哨兵和集群都是建立在復(fù)制基礎(chǔ)上實(shí)現(xiàn)高可用的...

    李留廣10222021-08-09
  • Redisredis實(shí)現(xiàn)排行榜功能

    redis實(shí)現(xiàn)排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實(shí)現(xiàn)排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價(jià)值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis 事務(wù)知識(shí)點(diǎn)相關(guān)總結(jié)

    Redis 事務(wù)知識(shí)點(diǎn)相關(guān)總結(jié)

    這篇文章主要介紹了Redis 事務(wù)相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • RedisRedis的配置、啟動(dòng)、操作和關(guān)閉方法

    Redis的配置、啟動(dòng)、操作和關(guān)閉方法

    今天小編就為大家分享一篇Redis的配置、啟動(dòng)、操作和關(guān)閉方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • RedisRedis如何實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis如何實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis的主從架構(gòu),能幫助我們實(shí)現(xiàn)讀多,寫少的情況,下面這篇文章主要給大家介紹了關(guān)于Redis如何實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的相關(guān)資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格詳解

    這篇文章主要給大家介紹了關(guān)于redis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具...

    一線碼農(nóng)5812019-11-18
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友...

    xiaojin21cen10152021-07-27
  • RedisRedis全量復(fù)制與部分復(fù)制示例詳解

    Redis全量復(fù)制與部分復(fù)制示例詳解

    這篇文章主要給大家介紹了關(guān)于Redis全量復(fù)制與部分復(fù)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis爬蟲具有一定的參考學(xué)習(xí)...

    豆子先生5052019-11-27
主站蜘蛛池模板: aaa毛片在线 | 日韩亚洲一区中文字幕在线 | 四虎影院永久网址 | 欧美成人aletta ocean | 99国产小视频 | 国产精品高清一区二区三区不卡 | 精品国产成人高清在线 | 国产一区二区在线免费观看 | 国产一级黄色网 | 九九99热久久精品在线6 | 免费看片黄 | 成人欧美一区二区三区白人 | 娇妻中日久久持久久 | 天美传媒tm0065 | 91国内精品久久久久怡红院 | 亚洲一二三区久久五月天婷婷 | 黑人巨茎大战欧美白妇 | 欧美精品99久久久久久人 | 韩剧在线免费观看 | 日韩毛片大全免费高清 | 免费国产好深啊好涨好硬视频 | 脱女学小内内摸出水网站免费 | 亚洲AV无码专区国产乱码网站 | 国产在线xvideos | 男人j进女屁股视频在线观看 | 男同志gays | 日韩精品成人免费观看 | 国产福利不卡一区二区三区 | 精品一区二区国语对白 | 咪咪爱网友自拍 | 百合女女师生play黄肉黄 | 97视频免费人人观看人人 | 国产成人精品系列在线观看 | 色图片小说 | 91久久偷偷做嫩草影院免费 | 国产第一福利视频导航在线 | 久久久久综合 | 色吧导航 | 91高清国产视频 | 韩国免费特一级毛片 | 国产一区二区精品久久 |