亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

redis中使用java腳本實現分布式鎖

2020-03-17 12:43:32
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了redis中使用java腳本實現分布式鎖,本文同時講解了java腳本和lua腳本實現分布式鎖,需要的朋友可以參考下
 

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
結果: 
redis中使用java腳本實現分布式鎖

 

復制代碼代碼如下:

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);

 

指定鍵和參考,執行腳本,結果:

redis中使用java腳本實現分布式鎖

BeanUtil代碼:

 

復制代碼代碼如下:

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩激情第一页| 日韩中文字在线| 国产不卡av在线免费观看| 日韩av网站大全| 亚洲第一精品夜夜躁人人爽| 国产日韩换脸av一区在线观看| 九九久久综合网站| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品av在线| 国产综合福利在线| 一本一本久久a久久精品综合小说| 欧美在线一区二区视频| 亚洲视频在线播放| 精品国产户外野外| 欧美在线视频网站| 国产91精品青草社区| 精品亚洲一区二区三区| 亚洲曰本av电影| 日韩av在线免费| 91精品视频在线| xxxxx成人.com| 欧美精品国产精品日韩精品| 亚洲国产精品热久久| 最新69国产成人精品视频免费| 欧美黑人又粗大| 日韩三级成人av网| 亚洲缚视频在线观看| 欧美国产日韩一区二区| 成人有码在线视频| 国产精品白丝jk喷水视频一区| 久久久成人精品| 亚洲毛片在线看| 91免费版网站入口| 欧美老少做受xxxx高潮| 日韩欧美极品在线观看| 岛国av一区二区三区| 亚洲国产欧美一区| 欧美国产日韩一区二区三区| 久久精品人人做人人爽| 高清日韩电视剧大全免费播放在线观看| 欧美一级视频一区二区| 久久精彩免费视频| 日本精品性网站在线观看| 国产精品高精视频免费| 亚洲在线一区二区| 午夜精品在线观看| 亚洲欧洲成视频免费观看| 91精品国产91久久久久久不卡| 91色琪琪电影亚洲精品久久| 国产精品久久久久久久久影视| 欧美高跟鞋交xxxxxhd| 欧美理论电影在线播放| 91av在线看| 国产精品电影观看| 久久精品国产欧美激情| 午夜精品免费视频| 久久精品电影网站| 欧美日韩一区二区在线| 精品呦交小u女在线| 精品国产一区二区三区在线观看| 日韩亚洲精品电影| 日韩国产精品一区| 一区二区在线视频播放| 中文字幕欧美日韩| 欧美性猛交xxxx| 日韩在线视频导航| 久久视频免费在线播放| 久久久久久久久久亚洲| 亚洲天堂开心观看| 久久精品视频va| 亚洲色图综合久久| 欧美日韩成人在线观看| 成人精品视频99在线观看免费| 国产99久久久欧美黑人| 成人444kkkk在线观看| 欧美第一页在线| 亚洲精品久久7777777| 97精品久久久| 亚洲精品视频网上网址在线观看| 日韩av影视在线| 欧美精品一区二区三区国产精品| 国产精品激情自拍| 国产精品一久久香蕉国产线看观看| 国产精品com| 91探花福利精品国产自产在线| 一本色道久久综合狠狠躁篇的优点| 一个色综合导航| 日韩在线中文视频| 欧美日韩中文字幕| 久久精品夜夜夜夜夜久久| 久久天天躁狠狠躁夜夜爽蜜月| 久久久综合av| 亚洲色图美腿丝袜| 亚洲精品国产综合区久久久久久久| 国产精品久久久久免费a∨大胸| 国产一区二区三区三区在线观看| 欧美华人在线视频| 欧美高清videos高潮hd| 美日韩丰满少妇在线观看| 亚洲国产另类 国产精品国产免费| 精品久久久久久中文字幕| 91精品国产91久久久久久最新| 黑人欧美xxxx| 国产精品久久久av| 久久精品欧美视频| 亚洲美女久久久| 国产精品一区二区在线| 亚洲国产精品字幕| 97香蕉超级碰碰久久免费的优势| 精品视频一区在线视频| 欧美二区在线播放| 欧美日韩电影在线观看| 久久男人的天堂| 国产精品亚洲片夜色在线| 日韩欧美国产一区二区| www.99久久热国产日韩欧美.com| 日韩亚洲一区二区| 欧美一区二区三区免费观看| 精品久久久久久中文字幕大豆网| 欧美成人精品在线观看| 亚洲第一色中文字幕| 久久成年人免费电影| 国产一区二区三区直播精品电影| 国产一区二区丝袜高跟鞋图片| 亚洲色图综合久久| 国产精品一久久香蕉国产线看观看| 欧美黑人极品猛少妇色xxxxx| 中文字幕久久久av一区| 日韩av日韩在线观看| 久久精品视频在线观看| 久久好看免费视频| 日韩国产高清污视频在线观看| 日韩精品电影网| 久久免费视频网| 欧美日韩午夜视频在线观看| 国产中文欧美精品| 麻豆成人在线看| 久久亚洲精品一区| 日韩国产精品亚洲а∨天堂免| 亚洲国产成人精品电影| 精品国产91久久久| 色综合影院在线| 亚洲国产成人久久| 精品亚洲精品福利线在观看| 国产精品pans私拍| 91亚洲国产成人久久精品网站| 国产精品一久久香蕉国产线看观看| 欧美激情手机在线视频| 亚洲人午夜色婷婷| 久久久国产精品亚洲一区| 中文字幕亚洲综合久久筱田步美| 欧美精品少妇videofree| 国内精品小视频| 深夜福利亚洲导航| 51ⅴ精品国产91久久久久久| 欧美日韩午夜剧场| 欧美专区第一页| 国产不卡精品视男人的天堂| 欧美精品在线播放| 清纯唯美亚洲激情| 亚洲欧美激情精品一区二区| 久久精品国产精品亚洲| 欧美日韩国产成人在线| 国产999精品久久久|