Linux-Xshell-Redis2

一、Redis的发布和订阅

        Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

        Redis 客户端可以订阅任意数量的频道。

Redis的发布和订阅

客户端订阅频道发布的消息

频道发布消息 订阅者就可以收到消息

发布订阅的代码实现

1.订阅频道消息

        打开一个客户端订阅channel1

        命令:subscribe channel1

2.发布频道消息

        打开另一个客户端,给channel1发布消息

        命令: public channel1 [消息]

这里返回的1是订阅者数量

3.查看频道消息

        打开第一个客户端就可以看到发送的消息

二、Redis事务

1.事务简介

        可以一次执行多个命令,本质是一组命令的集合。一个事务中的 所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。

        单独的隔离的操作

        redis 事务处理的基础由MULTI、EXEC、DISCARD、WATCH这四个指令构成。

        1.MULTI 用来组装一个事务;将命令存放到一个队列里面

        2.EXEC 用来执行一个事务;//commit

        3.DISCARD 用来取消一个事务;//rollback

        4.WATCH 用来监视一些 key,一旦这些 key 在事务执行之前被改变,则取消事务的执行。

2.有关事务,经常会遇到的是两类错误

2.1调用 EXEC 之前的错误

        “调用 EXEC 之前的错误”,有可能是由于语法有误导致的,也可能时由于内存不足导致的。只要出现某个命令无法成功写入缓冲队列的情况,redis 都会进行记录,在客户端调用 EXEC 时,redis 会拒绝执行这一事务

代码如下:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> heihei //一个错误的指令
(error) ERR unknown command 'heihei'
127.0.0.1:6379> ping
QUEUED
127.0.0.1:6379> exec
//redis 拒绝了事务的执行,原因是“之前出现了错误”
(error) EXECABORT Transaction discarded because of previous errors.

2.2调用 EXEC 之后的错误

代码如下:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 23
QUEUED
//age 不是集合,所以如下是一条明显错误的指令
127.0.0.1:6379> sadd age 15 
QUEUED
127.0.0.1:6379> set age 28
QUEUED
127.0.0.1:6379> exec //执行事务时,redis 不会理睬第 2 条指令执行错误
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
127.0.0.1:6379> get age
"28" //可以看出第 3 条指令被成功执行了

3.redis事务冲突

        双十一去购物的时候使用同一张银行卡去付款

        总金额10000

        一个请求想给金额减8000

        一个请求想给金额减5000

        一个请求想给金额减1000

解决方案

①悲观锁

select * from biao where 1=1 for update;、

        悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

②乐观锁

version 1

查余额 10000 version:1

10000>8000 -8000 update uuuu set moner-=8000 where version=1 1.1

10000 -5000 UPDATE uuuuu SET MONTY-=5000 WHERE VERSION=1

2000 2000>1000 UPDATE uuuu SET MONTY-=1000 WHERE VERSION=1.1 1.2

  

      乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。

4.WATCH

        “WATCH”可以帮我们实现类似于“乐观锁”的效果,即 CAS(check and set)。

        WATCH 本身的作用是“监视 key 是否被改动过”,而且支持同时监视多个 key,只要还没真正触发事务,WATCH 都会尽职尽责的监视,一旦发现某个 key 被修改了,在执行 EXEC 时就会返回 nil,表示事务无法触发。

代码如下:

127.0.0.1:6379> set age 23
OK
127.0.0.1:6379> watch age //开始监视 age
OK
127.0.0.1:6379> set age 24 //在 EXEC 之前,age 的值被修改了
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 25
QUEUED
127.0.0.1:6379> get age
QUEUED
127.0.0.1:6379> exec //触发 EXEC
(nil) //事务无法被执行

5.事务回滚

        Redis中的事务回滚是指在一个事务执行过程中,如果发生了错误或者用户主动取消了事务,那么Redis会自动回滚事务,撤销已经执行的命令,保证数据的一致性。

代码如下;

192.168.109.34:6379> multi
OK
192.168.109.34:6379> set testsy testq
QUEUED
192.168.109.34:6379> set testsy2 test2
QUEUED
192.168.109.34:6379> discard
OK

三、Redis的使用

1.创建java项目

2.添加redis的依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.2.0</version>
</dependency>

3.测试

1.初次测试

2.string-api

//操作string类型的数据
jedis.set("bbb","b1");
String b = jedis.get("bbb");
System.out.println(b);
System.out.println("=============================");
// 批量设置
jedis.mset("str1","v1","str2","v2","str3","v3");
//批量获取key
System.out.println(jedis.mget("str1","str2","str3"));

3.hash-api

//设置 一个key叫做hash1 对应的field是username,value是wangWu
jedis.hset("hash1","userName","wangWu");
//获取key为hash1的对应的fileld为username的值
System.out.println(jedis.hget("hash1","userName"));
Map<String,String> map = new HashMap<String,String>();
map.put("telphone","13838389438");
map.put("address","郑州");
map.put("email","abc@163.com");
//批量设置
jedis.hmset("hash2",map);
//批量获取
List<String> result = jedis.hmget("hash2", "telphone","email");
for (String element : result) {
    System.out.println(element);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值