当前位置: 首页 > wzjs >正文

桂林生活网站自建站模板

桂林生活网站,自建站模板,教育行业网站设计,做目录右内容网站redis的事务类似于队列操作,执行过程分为三步: 开启事务入队操作执行事务 使用到的几个命令如下: 命令说明multi开启一个事务exec事务提交discard事务回滚watch监听key(s):当监听一个key(s)时,如果在本次事务提交之…

redis的事务类似于队列操作,执行过程分为三步:

  1. 开启事务
  2. 入队操作
  3. 执行事务

使用到的几个命令如下:

命令说明
multi开启一个事务
exec事务提交
discard事务回滚
watch监听key(s):当监听一个key(s)时,如果在本次事务提交之前,有其他命令修改了该key的值,那么本地事务就会失效
unwatch取消监听key(s)

下面我们使用一个springboot的代码操作来说明这几个命令的含义:

package com.test.spring;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.RedisSystemException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class TestSpringApplication {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@RequestMapping("/exec1")public String test1(){stringRedisTemplate.execute(new RedisCallback<Boolean>() {@Overridepublic Boolean doInRedis(RedisConnection connection) throws DataAccessException {connection.multi();connection.commands().set("k1".getBytes(),"1".getBytes());connection.commands().set("k2".getBytes(),"2".getBytes());connection.exec();return true;}});return "k1="+stringRedisTemplate.opsForValue().get("k1")+",k2="+stringRedisTemplate.opsForValue().get("k2");}@RequestMapping("/exec2")public String exec2(){try{stringRedisTemplate.execute(new RedisCallback<Boolean>() {private int i=0;@Overridepublic Boolean doInRedis(RedisConnection connection) throws DataAccessException {connection.multi();connection.commands().set("k1".getBytes(),"11".getBytes());connection.commands().set("k2".getBytes(),"22".getBytes());if(i==0){throw new RedisSystemException("一个异常",new RuntimeException("1"));}connection.exec();return true;}});}catch (Exception e){e.printStackTrace();}return "k1="+stringRedisTemplate.opsForValue().get("k1")+",k2="+stringRedisTemplate.opsForValue().get("k2");}@RequestMapping("/discard")public String discard(){try{stringRedisTemplate.execute(new RedisCallback<Boolean>() {@Overridepublic Boolean doInRedis(RedisConnection connection) throws DataAccessException {connection.multi();connection.commands().set("k3".getBytes(),"3".getBytes());connection.commands().set("k4".getBytes(),"4".getBytes());connection.discard();connection.exec();return true;}});}catch (Exception e){e.printStackTrace();}return "k3="+stringRedisTemplate.opsForValue().get("k3")+",k4="+stringRedisTemplate.opsForValue().get("k4");}@RequestMapping("/watch1")public String watch1(){//开启一个线程new Thread(()->{stringRedisTemplate.execute(new RedisCallback<Boolean>() {@Overridepublic Boolean doInRedis(RedisConnection connection) throws DataAccessException {try {connection.watch("k5".getBytes());connection.multi();connection.commands().set("k5".getBytes(), "5".getBytes());//休眠5秒钟在提交事务try {Thread.sleep(5000);} catch (InterruptedException e) {}connection.exec();}catch (Exception e){e.printStackTrace();}return true;}});}).start();//开启一个线程new Thread(()->{stringRedisTemplate.execute(new RedisCallback<Boolean>() {@Overridepublic Boolean doInRedis(RedisConnection connection) throws DataAccessException {try {connection.multi();connection.commands().set("k5".getBytes(), "55".getBytes());connection.exec();}catch (Exception e){e.printStackTrace();}return true;}});}).start();return "success";}@RequestMapping("/watch2")public String watch2(){return "k5="+stringRedisTemplate.opsForValue().get("k5");}public static void main(String[] args) {SpringApplication.run(TestSpringApplication.class, args);}}
  1. exec1
    正常流程,使用curl进行测试会返回:k1=1,k2=2
  2. exec2
    我们模拟在事务队列中发送异常,会发现这段设值不成功,测试返回:k1=1,k2=2
  3. discard
    事务回滚,我们先回滚,再提交,后台会抛出:ERR EXEC without MULTI错误,说明设值失败
  4. watch1、watch2
    这里我们模拟两个线程,第一个线程先监听key,然后等待5秒钟,但是第二个线程直接去修改这个key,当5秒结束时,第一个线程再去提交事务时,会发现已经失效了,然后我们再通过watch2去查询值,测试返回:k5=55,说明线程1事务失效

最后再说明一下unwatch,每次操作exec()后,底层会自动调用unwatch,所以我们可以不用显示去调用unwatch命令。

http://www.dtcms.com/wzjs/440967.html

相关文章:

  • 平邑网站制作百度app下载
  • 中国风 网站模板东莞seo优化方案
  • 怎么免费做自己的网站网站创建流程
  • 一键生成表白网站百度的广告怎么免费发布
  • 绘制网站地图山东服务好的seo公司
  • 做网站要多少钱呀google adwords
  • 一站式网站建设多少钱好的网络推广平台
  • 国外网站代做seo还有哪些方面的优化
  • 写好网页怎么建成网站seo业务培训
  • 网站建设杭州网站设计模板
  • 免费个人网站在线制作网站用户体验优化
  • 网站建设默认字体网站开发流程是什么
  • 做网站外包大学生外链群发软件
  • 小说网站如何做书源外贸网站模板
  • 网站空间 域名广告营销策略
  • 网站 模板 html代运营竞价公司
  • 安阳哪里做网站网站运营是做什么的
  • 天津网站排名优化新人做外贸怎么找国外客户
  • 做设计在哪个网站上找高清图片大全客户管理软件哪个好用
  • 用手机制作网站的软件手机百度搜索引擎入口
  • 网站是用什么技术做的百度指数查询官网入口登录
  • 单位网站建设管理工作总结网红营销
  • 内销网站要怎么做百度问答官网
  • 正规网站优化公司茶叶网络营销策划方案
  • 免费网站空间怎么做百度指数可以用来干什么
  • 做神马网站优化排名深圳seo排名
  • 公司就我一个设计热狗seo顾问
  • 阿里云做网站经费故事式软文广告300字
  • 长沙网站建设工作室搜索引擎关键词优化技巧
  • 网站 建设 标准方案seo策略工具