本章主要会讲解1、Redis的一些其他比较高级一些用法,2、Redis 的一些底层原理等 3、Redis 的持久化机制等内容
一、Reidis的高级特性用法
消息队列 我们都知道Redis有列表/队列的特性及用法(list)先进先出(FIFO).这样是否会有问题呢?比如:消费者不停的而去消费(lpop)就如同写了个循环一样(即需要不停的去通信),但是为了减少这一消耗,客户端可以sleep,再去请求,但是这样就没有问题了么?(list 列表不支持一次生产,多次消费的场景)
1、如果sleep的话,sleep 的长短很难控制,这样就失去了消息的实时性了
2、如果生产者产生的消息比消费者消费的信息更快,那么随着时间的推移是否生成者就会占用大量信息,列表这样也就会占用大量的内存(没有消费的消息堆积)
使用过消息的中间件的小伙伴,应该都知道有种发布订阅模式。这种模式是其实就是支持一次生产,多次消费的场景的。其实Redis 内部也是支持这样的场景的。这种模式下就不需要像之前一样,消费者需要不断的请求,生产者是否生产了消息。这2者实现了解耦(没有直接的关系)
订阅频道(channel):会有很多频道,其实就可以理解为一个频道就是一个队列(queue),,订阅者可以订阅一个或多个。消息的发布者也可以给指定的频道发生消息,只有消息到达了频道,这样所有订阅了这个频道的下订阅者(消费者)都会接受到这个消息,这特别需要注意的是:只有消息发生出去了,就不会持久化了,就会从队列中移除掉,因此消费者如果要接收到该频道的消息就必须要提前在该频道发消息之前就要订阅,如果滞后了的话,是接受不到消息的(即接收不到该频道之前的所有消息,因为已经从队列中移除了)
正常用法:
> subscribe channel-1 channel-2 (订阅者一次订阅一个或多个)
> publish channel-1 2673 (发布者一次只能给一个频道发送消息,不支持多个频道)
> unsubscribe channel-2 (取消订阅)
按照规则订阅频道 用法:支持?和*占位符。?代表一个字符,*代表 0 个或者多个字符
消费者:
cli1 > psubscribe *sport
cli2 > psubscribe stars*
cli3 > psubscribe stars-NBA
成产者:
cli4 > publish NBA-sport KeBi
cli4 > publish stars-NBA YaoMing
cli4 > publish New-weather rain
事务 什么是事务?我们都知道要实现原子性:要么成功,要么失败,这叫原子性? 一个命令其实是能保证原子性的。
其实很多时候,我们并不总是用一个命令的,往往一个命令达不到我们想要的结果,因此可能一个逻辑中需要实现多个命令按照一定的顺序执行的,这样就有了事务的概念了(需要通过事务去控制这个逻辑的原子性)
Redis 也有自己的事务控制 特点: 1、按照队列顺序执行,2、不受其他客户端请求的影响
命令:multi(开启事务),exec(执行事务),discard(取消事务),watch(监视)
用法(结合场景)
转账业务:A现有200块,B 现有50块,A向B 转了100块。A变成了100块,B 变成了150块
这里需要注意下:multi 开启了事务,那么multi 嵌套多层无用,效果一样的
通过 exec 的命令执行事务。如果没有执行 exec,