Redis作为大数据生态当中的重要组件之一,也是主流最受欢迎的NOSQL数据库之一,应用于缓存系统、消息队列等场景下。今天的大数据开发学习分享,我们主要来讲讲Redis当中的重要概念,发布与订阅的实现。

发布订阅
Redis可以借助List实现生产者消费者模式,但是仅支持一个消费者读取信息,如果想实现多消费者就可以通过发布订阅来实现。
通过SUBSCRIBE和PSUBSCRIBE命令可以指定订阅某个key或模式,通过PUBLUSH可以发送消息,使用SUBSBSCRIBE或PUNSUBSCRIBE可以取消订阅。
实现上,Redis通过维护一个订阅集合以及一个模式列表来实现。订阅列表的key是对应的频道,值通过一个链表来存储对应的订阅者;模式列表则直接保存模式与订阅者的信息。
当通过PUBLISH发送消息时,首先通过订阅集合查询订阅的客户端,其次遍历模式列表检查是否有与之匹配的模式并查询对应的客户端,然后向对应的客户端发送消息。
事务机制
在Redis中也支持事务处理,提供一次性提交多条命令的机制。使用时,先用MULTI开启事务操作,然后使用EXEC提交。
实现上,Redis通过一个命令队列来缓存提交的命令。使用MULTI命令后,Redis的普通命令都不会立即执行,而是缓存到命令队列中,直到执行EXEC后,才统一提交到集群。为了保证事务的一致性,一般会在MULTI之前使用WATCH命令对某个key进行监控,从而实现乐观锁。
使用WATCH命令后,会在服务器上为对应的key创建一个监听列表,当服务器接收到修改命令时,会遍历列表中的客户端对象,标记为REDIS_DIRTY_CAS,当客户端提交命令后,服务器检查对应的标识为记号,会拒绝执行。
Redis中的事务也是支持ACID特性的:
1.原子性,首先要理解Redis中的错误,一种是命令错误,比如少了关键参数;另一种是执行错误。命令错误会导致整个事务拒绝执行,而执行错误则会被忽略。从命令错误的角度来说,Redis支持原子性,即要么全执行,要么都不执行。而从传统数据库的角度,由于Redis不支持回滚,因此它的原子性又有一些歧义。
2.一致性,由于前面的执行错误会被服务器自动识别并忽略,因此不会影响最后的结果
3.隔离性,由于Redis本身是单线程的,事务又是一组一组提交的,因此多个事务之间也是有隔离性的
4.持久性,如果Redis使用了RDB和AOF,还是可以保证持久性的。
关于大数据开发学习,Redis发布与订阅,以上就为大家做了大致的讲解了。Redis是大数据学习必学的一个组件,对于内部的诸多运行细节,也需要大家多去深入理解和掌握。
网友评论