Redis高性能内存数据库(四)

Redis的事务和消息机制*(重点)

(1)复习:事务 关系型数据库

什么是事务

事务由一组DML语句(插入更新删除操作语句)组成。

事务的特点:要么都成功,要么都失败

事务的特性:ACID 原子性、一致性、隔离性、持久性

(2)Redis中的事务的本质:

将一组操作放在队列中,一次性执行

(3)对比Oracle和Redis的事务的区别

 

不过,事务最好放到关系型数据库中去写。

Redis的事务

Redis对事务的支持目前还比较简单。

redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。

由于redis是单线程来处理所有client的请求的所以做到这点是很容易的。

一般情况下redis在接受到一个client发来的命令后会立即处理并返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一个队列中

当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client.然后此连接就结束事务上下文。

Oracle数据库中的事务和Redis的事务对比

 

Oracle

Redis

开启事务的方式

自动开启事务

multi

操作

DML语句

Redis命令

提交事务

commit

exec

回滚事务

rollback

discard

(4)举例-1

Redis的事务示例:银行转账

从Tom转100块钱给Mike

set tom 1000

set mike 1000

multi

decrby tom 100

incrby mike 100

exec

****自己操作****

模拟银行转账

127.0.0.1:6379> set tom 1000

OK

127.0.0.1:6379> set mike 1000

OK

Tom给Mike转账:

事务开启-multi命令-多条语句一起执行

127.0.0.1:6379> multi

OK

127.0.0.1:6379> decrby tom 100

QUEUED  没有当时执行,而是放到队列里面等待执行

127.0.0.1:6379> incrby mike 100

QUEUED  没有当时执行,而是放到队列里面等待执行

127.0.0.1:6379> exec    执行事务

1) (integer) 900

2) (integer) 1100

(5)举例-2:

买票

127.0.0.1:6379> set tom 1000

OK

127.0.0.1:6379> set ticket 1

OK

127.0.0.1:6379> multi

OK

127.0.0.1:6379> decrby tom 500    “decrby ... 500”减500的意思

QUEUED  

127.0.0.1:6379> decr ticket       “decr” ---减1的意思,票数减一                   

QUEUED     

在提交之前从另一个窗口把票买了

127.0.0.1:6379> decr ticket

(integer) 0

127.0.0.1:6379> exec

1) (integer) 500

2) (integer) -1  

 

票变成-1了,如果想让他不是-1,就要用到分布式锁

(6)Redis的锁机制:watch

Redis锁机制(简单的锁):执行事务操作的时候,如果监视的值发生变化,则提交失败。

举例:买票

 

****自己操作****

命令 watch

举例:买票

127.0.0.1:6379> set tom 1000

OK

127.0.0.1:6379> set ticket 1

OK

127.0.0.1:6379> watch ticket

OK

127.0.0.1:6379> multi

OK

127.0.0.1:6379> decrby tom 500

QUEUED

127.0.0.1:6379> decr ticket

QUEUED

   在另一个窗口抢票:

   127.0.0.1:6379> decr ticket

(integer) 0

然后执行

127.0.0.1:6379> exec

(nil)  操作失败了

127.0.0.1:6379> get tom

"1000"

127.0.0.1:6379> get ticket

"0"

打印出nil代表操作没有执行,或者操作执行失败。

------------------ 讲  义 ----------------------

Java应用程序中的事务和锁

① 事务

 

② 锁

 

(7)Redis的消息机制:消息的发布与订阅,适合做在线聊天

Redis消息机制:消息系统

(1)消息的类型:

        Queue消息:队列(点对点) 张三发给李四,只有李四收到。消息可以是字符串,也可以是对象。

        Topic消息:主题(广播、群发):发布消息、订阅消息

(2)常见的消息系统:

Redis:只支持Topic消息

Kafka:只支持Topic消息,需要zookeeper支持。

JMS:Java Messaging Service。Java消息服务标准,支持Queue,也支持Topic。

    产品:Weblogic(轻量级的用Redis,重量级的用Kafka)

(3)Redis的消息机制

命令:

publish 发布消息

subscribe 订阅消息

psubscribe 订阅消息 可以使用通配符来订阅消息(可订阅多个消息)

自己操作:

 

------------------ 讲  义 ---------------------

publish:发布消息

格式:publish   channel名称 “消息内容”

subscribe: 订阅消息

格式:subscribe   channel名称

psubscribe: 使用通配符定义消息

格式:psubscribe  channel*名称

使用Java程序实现消息的发布与订阅,需要继承JedisPubSub

 

 

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3