redis~事务~发布订阅~管道技术

事务

以 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;
    }
});

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值