j***a语言redis,J***A语言介绍

kodinid 42 0

大家好,今天小编关注到一个比较意思的话题,就是关于java语言redis问题,于是小编就整理了2个相关介绍Java语言redis的解答,让我们一起看看吧。

  1. Java语言如何正确实现Redis分布式锁?
  2. Java互联网架构-基于分布式Redis如何发布数据与订阅机制?

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

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

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

java语言redis,JAVA语言介绍-第1张图片-安济编程网
图片来源网络,侵删)

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

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

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

java语言redis,JAVA语言介绍-第2张图片-安济编程网
(图片来源网络,侵删)

1 X读取P

2 Y读取P

3 X将P+1写回Redis

java语言redis,JAVA语言介绍-第3张图片-安济编程网
(图片来源网络,侵删)

4 Y将P+1写回Redis

J***a互联网架构-基于分布式Redis如何发布数据与订阅机制?

事实上,redis生来就不是干消息发布与订阅这件事的,一开始只是用做内存缓存,后来才被开发出全局唯一ID,分布式锁,消息队列这些功能!

在我们一开始没用成熟的消息中间件(mq,ons,kafka)的时候,就用了redis作为消息的发布订阅机制!

redis作为一个内存数据库,所有的数据都在内存中进行操作,只提供通过异步的方式(AOF或者RDB)进行数据的持久化,在重启的时候,从文件中把数据加载到内存,所以redis速度非常快!

redis发布订阅的原理又是啥?

redis通常分为client端(一般为多个)和server端,一个客户端(发布者)通过发送消息到channel中,redis server中会维护一份pubsub_channels字典,以channel为key,所有的channel订阅者组成的链表为value,在消息发布的时候,server会使用channel取出所有的订阅者进行遍历然后把消息发布给所有订阅者!(为什么使用链表结构?在订阅者频繁变动的时候,链表的修改时间复杂度为O(1))!

redis作为消息发布订阅具体有什么操作呢?

1,发布者:消息的发布者通过redis的指令publish生产消息,这个指令会返回相应的值,表明消息订阅者数量!

2,订阅:消息的消费者通过subscribe指令订阅频道(可多个),这个指令会返回订阅的频道,数量,和消费的消息!

3,模糊匹配:类似于sql中的*,redis使用psubscribe指令订阅模糊的符合某个条件的所有频道!

4,取消订阅:订阅者通过unsubscribe命令取消某个频道的订阅,也会有相应的返回值!

它是通长连接收消息的,在极端的情况下会丢失消息,如在服务器写消息的时候,订阅方突然断开,那么这条消息就会永久丢失。如果仅是满足一般的消息驱动,是一个比较轻量的选择,并且也可以做到广播和单播两种形式。如果肯下点功夫,基于消息驱动的分布式事务也不是没有可能。

到此,以上就是小编对于j***a语言redis的问题就介绍到这了,希望介绍关于j***a语言redis的2点解答对大家有用。

标签: redis 消息 订阅