【Elasticsearch】锁

锁:悲观 、乐观

    基于version乐观锁,带着current version 执行修改,如果version不一样需要先获取新的version

全局锁:put /fs/lock/global/_create{}  会使系统并发能力很低

    fs: 你要上锁的那个index

    lock: 就是你指定的一个对这个index上全局锁的一个type

    global: 就是你上的全局锁对应的这个doc的id

    _create:强制必须是创建,如果/fs/lock/global这个doc已经存在,那么创建失败,报错

删除:DELETE /fs/lock/global

document锁:脚本上锁

POST /fs/lock/1/_update

{

  "upsert": { "process_id": 123 },

  "script": "if ( ctx._source.process_id != process_id ) { assert false }; ctx.op = 'noop';"

  "params": {

    "process_id": 123 依据

  }

}

    两个process_id相同,直接返回成功

    不相同,这个doc之前已经被别人上锁了,失败、报错、重试、锁定成功

方式二:将脚本文件放到config/script目录下

scripts/judge-lock.groovy: if ( ctx._source.process_id != process_id ) { assert false }; ctx.op = 'noop';

POST /fs/lock/1/_update

{

  "upsert": { "process_id": 123 },

  "script": {

    "lang": "groovy",

    "file": "judge-lock",

    "params": {

      "process_id": 123

    }

  }

}

释放:

    POST /fs/_refresh  delete /fs/lock/1

    大批量删除 id=1的那个锁

        Put /fs/lock/_bulk{"delete":{"_id":1}}

查询当前这个进程他上锁的有哪些文档

GET /fs/lock/_search?scroll=1m

{

  "sort":["_doc"],

  "query": {

    "match": {

      "process_id": "123"

    }

  }

}

共享锁:读锁  可多个

judge-lock-2.groovy: if (ctx._source.lock_type == 'exclusive') { assert false }; ctx._source.lock_count++

POST /fs/lock/1/_update

{

  "upsert": {

    "lock_type":  "shared",

    "lock_count": 1

  },

  "script": {

          "lang": "groovy",

          "file": "judge-lock-2"

  }

}

POST /fs/lock/1/_update

{

  "upsert": {

    "lock_type":  "shared",

    "lock_count": 1

  },

  "script": {

          "lang": "groovy",

          "file": "judge-lock-2"

  }

}

GET /fs/lock/1

解锁

POST /fs/lock/1/_update

{

  "script": {

          "lang": "groovy",

          "file": "unlock-shared"

  }                 每次解一个共享锁,对lock_count先减1,如果减了1之后,是0,

}                    都解锁完了,将/fs/lock/1删除,彻底解锁所有的共享锁

排他锁:写锁 只有一个不能读

PUT /fs/lock/1/_create

{ "lock_type": "exclusive" }create语法,要求lock必须不能存在,直接自己是第一个上锁的人

如果已经有人上了共享锁,明显/fs/lock/1是存在的,create语法去上排他锁,肯定会报错

解锁排他锁DELETE /fs/lock/1

猜你喜欢

转载自my.oschina.net/u/3655192/blog/1784686