事务
以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令
命令:
标记一个事务开始:multi
执行事务块内命令:exec
取消事务,放弃执行事务块:discard
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断: WATCH key [key ...]
取消 WATCH 命令对所有 key 的监视: UNWATCH
MULTI
SET key value1
SADD skey value1 value2
EXEC
发布订阅
发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。客户端可以订阅任意数量的频道。
频道 channel1 , 订阅频道的客户端之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
命令:
订阅一个或多个符合给定模式的频道, 模式以 * 作为匹配符: PSUBSCRIBE pattern [pattern ...]
查看订阅与发布系统状态,它由数个不同格式的子命令组成: PUBSUB <subcommand> [argument [argument ...]]
将信息发送到指定的频道: PUBLISH channel message
退订所有给定模式的频道: PUNSUBSCRIBE [pattern [pattern ...]]
订阅给定的一个或多个频道的信息: SUBSCRIBE channel [channel ...]
退订给定的一个或多个频道的信息: UNSUBSCRIBE channel [channel ...]
demo
订阅
subscribe redis_channel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redis_channel"
3) (integer) 1
1) "message"
2) "redis_channel"
3) "my_msg"
发布
publish redis_channel my_msg
管道技术
Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:
1.客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
2.服务端处理命令,并将结果返回给客户端。
管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。
管道技术最显著的优势是提高了 redis 服务的性能。
Jedis demo
try {
Jedis jedis = new Jedis("IP", 6379);
Pipeline pipeline = jedis.pipelined();
for (int i = 0; i < 1000; i++) {
pipeline.incr("test2");
}
pipeline.sync();
jedis.disconnect();
} catch (Exception e) { }
Springboot RedisTemplate Demo
List<Object> resultList = redisTemplate.executePipelined(new RedisCallback<Object>() {
@Override
public String doInRedis(RedisConnection connection) throws DataAccessException {
//connection 打开管道
connection.openPipeline();
//connection 给本次管道内添加 要一次性执行的多条命令
//一个set操作
connection.set("mykey1".getBytes(),"字符串value".getBytes());
//一个批量mset操作
Map<byte[],byte[]> tuple = new HashMap<>();
tuple.put("m_mykey1".getBytes(),"m_value1".getBytes());
tuple.put("m_mykey2".getBytes(),"m_value2".getBytes());
tuple.put("m_mykey3".getBytes(),"m_value3".getBytes());
connection.mSet(tuple);
//一个get操作
connection.get("m_mykey2".getBytes());
//关闭管道 不需要close 否则拿不到返回值
connection.closePipeline();
//这里一定要返回null,最终pipeline的执行结果,才会返回给最外层
return null;
}
});