首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于Spring + Hibernate + Redis的分布式锁

用于Spring + Hibernate + Redis的分布式锁
EN

Stack Overflow用户
提问于 2017-07-20 18:20:43
回答 1查看 1.9K关注 0票数 0

我一直在使用Spring + Hibernate和redis开发一个多线程web应用程序,用于缓存存储。我正在寻找一种将锁应用于控制器或服务的方法。

我不能使用Hibernate提供的锁定机制,因为它是在数据库级别应用的。

下面是一个例子:

代码语言:javascript
复制
@RestController
@RequestMapping(RestConstants.BASE_PATH + "/campaigns")
Class CampaignController  {

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public ApiResponse<?> findOne(@PathVariable Integer id) {
        Campaign campaign = repo.findOne(id);
        return toResponse(campaign);
    }

    @RequestMapping(value = "", method = RequestMethod.POST)
    public create(@RequestBody Campaign campaign) {
        //create an campaign here
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.PATCH)
    public update(@RequestBody Campaign campaign) {
        //update an campaign here
    }
}

@RestController
@RequestMapping(RestConstants.BASE_PATH + "/bulkCampaigns")
Class CampaignBulkController {
    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public create(@RequestPart MultipartFile data) {
        /* 
        Data contains a list of campaigns with their details, 
         controller will iterate through the list and create all the campaigns.

         */
    }
}

在CampaignBulkController中处理映射到创建方法的请求时,无法处理所有其他对活动的写入,但读取是allowed.That,应该删除更新或创建活动/活动的请求。

有多个服务器,每个服务器都是多线程的。

我对Spring和Hibernate很陌生,任何想法或建议都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2017-07-20 19:41:33

我将在这里概述一个初步的答案,可能是为了以后的修改。

如果您使用共享的ReadWriteLock并将读锁用于常规操作,则可以让您的特权操作使用写锁来阻止常规操作。

代码语言:javascript
复制
// Regular operation tries to lock, if not successful a privileged operation is happening
if(!lock.readLock().tryLock())
    return cannotProcessResponse;

performRegularOperation();
lock.readLock().unlock();
代码语言:javascript
复制
// Privileged operation always waits for lock
lock.writeLock().lock();
performPrivilegedOperation();
lock.writeLock().unlock();

现在,这种方法存在一些问题。如果使用单个共享锁,一次只能运行一个特权操作。如果这是一个问题,可以使用多个锁,并将它们的读锁锁在一起(这很容易导致死锁,因此必须小心)。还应考虑锁的公平性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45222428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档