Redis事务 和 pipleline

一、reidis事务

Redis 事务能够一次执行多个命令, 而且带有如下三个重要的保证:html

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

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

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

 

MULTI 开始一个事务, 而后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的全部命令:缓存

一、事务执行

image

二、watch

监视一个(或多个) key ,若是在事务执行以前这个(或这些) key 被其余命令所改动,那么事务将被打断。ruby

 

imageimage

 

三、discard

取消事务,放弃执行事务块内的全部命令。ide

 

image

二、jedis代码

一、配置支持事务

template.setEnableTransactionSupport(true);
 
 

二、代码:

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

三、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"));
相关文章
相关标签/搜索