zoukankan      html  css  js  c++  java
  • Redis事务 和 pipleline

    1、reidis事务

    Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

    • 批量操作在发送 EXEC 命令前被放入队列缓存。
    • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
    • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

    一个事务从开始到执行会经历以下三个阶段:

    • 开始事务。
    • 命令入队。
    • 执行事务。

    MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:

    1、事务执行

    image

    2、watch

    监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

    imageimage

    3、discard

    取消事务,放弃执行事务块内的所有命令。

    image

    2、jedis代码

    1、配置支持事务

    template.setEnableTransactionSupport(true);
    
    

    2、代码:

     redisTemplate.opsForValue().set("aaa", 321);
    redisTemplate.watch("aaa");
    redisTemplate.multi();
    redisTemplate.opsForValue().set("aaa", 123);
    redisTemplate.opsForValue().set("bbb", 123);
    redisTemplate.exec();

    3、pipleline

    jedis 代码:

    Map<String, Object> map = new HashMap<>();
    map.put("aaa", 111);
    map.put("bbb", 222);
    map.put("ccc", 3333);
    
    List list = redisTemplate.executePipelined(new RedisCallback<Object>() {
        @Override
        public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
            redisConnection.openPipeline();
            for (Map.Entry<String, Object> mapEntry : map.entrySet()) {
                redisConnection.set(redisTemplate.getKeySerializer().serialize(mapEntry.getKey()), redisTemplate.getValueSerializer().serialize(mapEntry.getValue()));
            }
            return null;
        }
    }, redisTemplate.getValueSerializer());
    
    System.out.println(redisUtil.get("aaa"));
    System.out.println(redisUtil.get("bbb"));
    System.out.println(redisUtil.get("ccc"));
  • 相关阅读:
    Oracle的并发多版本 读一致性
    挖掘ADO.NET Entity框架的性能
    System.Linq扩张方法Where (Lambda表达式)
    LINQ与HQL (二)
    HQL查询中的几个函数
    LINQ 与 HQL (一)
    C# 3.0的新特性(一)
    共享锁 排他锁
    Psytopic测试
    这些地方才是真正值得去的
  • 原文地址:https://www.cnblogs.com/happydreamzjl/p/11834809.html
Copyright © 2011-2022 走看看