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类