当前位置:首页 > 前端设计 > 正文

redis分布式锁实现 java线程池参数合理配置

redis分布式锁实现 java线程池参数合理配置

这篇文章给大家聊聊关于redis分布式锁实现,以及java线程池参数合理配置对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。Java语言如何正确实现Redis分布...

这篇文章给大家聊聊关于redis分布式锁实现,以及java线程池参数合理配置对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

Java语言如何正确实现Redis分布式锁

和大家分享我的经验,如何用redis提供的一个简单接口,轻松实现redis分布式锁。

在开始之前,我先简单介绍下redis的性能。

高效的Redis

Redis本身是单线程的,这样带来的好处是能够提高读写效率。多线程通常来说会有上下文切换带来的时间损耗,而redis通过绑定单个CPU到某块内存,实现了上下文切换的最小开销,因此这种场景反而比多线程还要高效。

不安全的Redis

但是,如果有不同的节点同时要对Redis中的同一个数据进行操作,由于是来自不同Redis服务器,就会发生线程不安全的情况。

举例有两个功能函数X和Y(也可以看做是两个服务器节点),二者功能相同,都要执行读取Redis中变量P,并且对其加一的操作。如果是线程安全的,那么X和Y分别执行完之后,P的值应该比原来增加2,但是由于函数XY互相独立,那就可能发生下面这种情况:

1X读取P

2Y读取P

3X将P+1写回Redis

4Y将P+1写回Redis

执行结束后,P的值却变成了P+1,而不是P+2。

这就是线程不安全导致的结果。

redis的分布式锁

那么如何用Redis来避免上面的情况呢。

Redis对外开放了一个非常厉害的api,目前经常被大家用来做分布式锁,是绝对的线程安全,这个函数就是SETkeyfieldvalue加上NX参数。这个NX参数可是了不得,通常来说,set函数是不管field字段是否存在,只要写入成功就会返回1,但是如果增加了NX参数,那么如果field值在redis中已经存在,就会返回nil,否则才返回1。因此可以通过这个函数来执行加锁操作,如果返回值不为nil,则加锁成功,否则代表有其他线程在操作数据,当前请求需要等待。

不仅如此,为了避免死锁,SET还有一个参数为EX,即EX毫秒后,field会自动清空。

此外,还有PX,XX参数,具体含义见如下文档。

以上就是我在工作中总结的防止redis并发的方式,如果你有其他想法,欢迎在下方评论区与我沟通。

我是苏苏思量,来自BAT的java开发工程师,每天分享技术见闻,欢迎关注我,与我共同进步。

redis分布式锁怎么解决02master宕机后,锁还能正常使用

为了使得集群在一部分节点下线或者无法与集群的大多数(majority)节点进行通讯的情况下,仍然可以正常运作,Redis集群对节点使用了主从功能:集群中的每个节点都有1个至N个品(replica),其中一个品为主节点(master),而其余的N-1个品为从节点(slave)。

redis分布式锁实现和java线程池参数合理配置的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

最新文章