Redis 事務能夠一次執行多個命令, 而且帶有如下三個重要的保證:html
- 批量操做在發送 EXEC 命令前被放入隊列緩存。
- 收到 EXEC 命令後進入事務執行,事務中任意命令執行失敗,其他的命令依然被執行。
- 在事務執行過程,其餘客戶端提交的命令請求不會插入到事務執行命令序列中。
一個事務從開始到執行會經歷如下三個階段:redis
- 開始事務。
- 命令入隊。
- 執行事務。
MULTI 開始一個事務, 而後將多個命令入隊到事務中, 最後由 EXEC 命令觸發事務, 一併執行事務中的全部命令:緩存
一、事務執行
二、watch
監視一個(或多個) key ,若是在事務執行以前這個(或這些) key 被其餘命令所改動,那麼事務將被打斷。ruby
三、discard
取消事務,放棄執行事務塊內的全部命令。ide
一、配置支持事務
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();
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"));