一、流水线
1、流水线简介
Redis提供的流水线允许客户端把任意多条Redis命令请求打包在一起,然后一次性地将它们全部发送给服务器,而服务器则会在流水线包含的所有命令请求都处理完毕之后,一次性地将它们的执行结果全部返回给客户端。使得将执行多个命令所需的网络通信次数从原来的N次降低为1次,并大幅度地减少程序在网络通信方面耗费的时间,程序的执行效率得到显著的提升。但这个特性还需要客户端支持才能使用。
虽然Redis服务器并不会限制客户端在流水线中包含的命令数量,但是却会为客户端的输入缓冲区设置默认值为1GB的体积上限:当客户端发送的数据量超过这一限制时,Redis服务器将强制关闭该客户端。因此用户在使用流水线特性时,最好不要一下把大量命令或者一些体积非常庞大的命令放到同一个流水线中执行,以免触碰到Redis的这一限制。
2、Java操作流水线
List<Object> results = stringRedisTemplate.executePipelined(
new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) throws DataAccessException {
StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
for(int i=0; i< batchSize; i++) {
stringRedisConn.rPop("myqueue");
}
return null;
}
});
二、事务
事务可以将多个命令打包一起来执行,当事务成功执行时,事务中包含的所有命令都会被执行,相反,如果事务中有一条命令没有执行成功,那么它所包含的所有命令都不会被执行。
-
开启事务 开启事务需通过MULTI命令,这个命令在成功执行之后将返回OK。当一个客户端执行MULTI命令之后,它就进入了事务模式,这时用户输入的所有数据操作命令都不会立即执行,而是会按顺序放入一个事务队列中,等待事务执行时再统一执行。 -
执行事务 在使用MULTI命令开启事务并将多个命令放入事务队列中后,就可以通过EXEC命令来执行事务。 当事务成功执行时,EXEC命令将返回一个列表作为结果,这个列表会按照命令的入队顺序依次包含各个命令的执行结果。 -
放弃事务 DISCARD命令可在开启事务之后将当前事务抛弃,DISCARD命令会清空事务队列中已有的所有命令,并让客户端退出事务模式,最后返回OK表示事务已被取消。 -
对键进行监听 通过WATCH命令可使服务器对一个或多个数据库键进行监听,如果在客户端尝试执行事务之前,这些键的值发生了变化,那么服务器将拒绝执行客户端发送的事务,并向它返回一个空值。 语法格式:WATCH key1 key2…
通过同时使用WATCH命令和Redis事务,可以构建出一种针对被监听键的乐观锁机制,确保事务只会在被监听键没有发生任何变化的情况下执行,从而保证事务对被监听键的所有修改都是安全、正确和有效的。
- 取消对键的监听
客户端可以通过执行UNWATCH命令,取消对所有键的监听。使用EXEC命令执行事务和使用DISCARD命令取消事务,同样会导致客户端撤销对所有键的监视,因为这两个命令在执行之后都会隐式地调用UNWATCH命令。
三、流水线与事务
Redis的事务在EXEC命令执行之前并不会产生实际效果,所以很多Redis客户端都会使用流水线去包裹事务命令,并将入队的命令缓存在本地,等到用户输入EXEC命令之后,再将所有事务命令通过流水线一并发送至服务器,这样客户端在执行事务时就可以达到“打包发送,打包执行”的最优效果。
|