redis管道代码

这篇具有很好参考价值的文章主要介绍了redis管道代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 1 总结

1:如果将redis的key,在redis删除或者过期,返回数据会是null

2:返回的list是所有key的合集 ,如果key不存在,则返回null

3:  存的key和value是否是二进制跟你的配置文件有关,

1.1 实例:key不存情况

[null, [User(name=aa, age=17), User(name=bb, age=20), User(name=cc, age=17)]]

   准备的数据

    private List<User> initList(){
        List<User> userList = Lists.newArrayList();
        userList.add(new User("小明",17));
        userList.add(new User("红红",20));
        userList.add(new User("黄黄",17));
        return userList;
    }
    private HashMap<String, List<User>> initHash(){
        List<User> userList = Lists.newArrayList();
        userList.add(new User("小明",17));
        userList.add(new User("红红",20));
        userList.add(new User("黄黄",17));

        List<User> userList1 = Lists.newArrayList();
        userList1.add(new User("aa",17));
        userList1.add(new User("bb",20));
        userList1.add(new User("cc",17));

        HashMap<String, List<User>> hashMap = new HashMap<>();
        hashMap.put("aa",userList);
        hashMap.put("bb",userList1);
        return hashMap;
    }

1.1 RedisCallback

    /**
     * 管道测试
     */
    @Test
    void test9() {
      //这里获取String类型的序列化
        RedisSerializer stringSerializer = redisTemplate.getStringSerializer();
        List<User> userList = initList();
        HashMap<String, List<User>> collect = initHash();

        //key 不是字节,值是字节
        redisTemplate.executePipelined(new RedisCallback<Object>() {
            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
                connection.openPipeline();
                for (String key : collect.keySet()) {
                    //hash方式
                    connection.hSet(redisKey.getBytes(), key.getBytes(),
                        redisTemplate.getValueSerializer().serialize(collect.get(key).toString()));
   //hash方式
   connection.hSet(redisKey.getBytes(), key.getBytes(),
                        JSON.toJSONString(collect.get(key)).getBytes());

                    //正常方式
                  //  connection.set("key1".getBytes(), "value1".getBytes());
                }
                //设置过期时间 不能单独设置失效时间
                connection.pExpire(redisKey.getBytes(), 1000 * 60 * 60 * 6);
                return null;
            }
        });

        RedisCallback<HashMap<String, Object>> redisCallback = new RedisCallback<HashMap<String, Object>>() {
            @Override public HashMap<String, Object> doInRedis(RedisConnection connection) throws DataAccessException {
                connection.openPipeline();
                for (String key : collect.keySet()) {
                    //hash方式获取
                    connection.hGet(redisKey.getBytes(), key.getBytes());
                   // connection.get(redisKey.getBytes());
                }
                return null;
            }
        };

        //key
        List list = redisTemplate.executePipelined(redisCallback);
        //返回是所有key的值得集合 [null, [User(name=aa, age=17), User(name=bb, age=20), User(name=cc, age=17)]]
        System.out.println(list);

    }

1.2 SessionCallback

    @Test
    void test10() {

        SessionCallback<HashMap<String, Object>> sessionCallback = new SessionCallback<HashMap<String, Object>>() {
            @Override public <K, V> HashMap<String, Object> execute(RedisOperations<K, V> redisOperations)
                throws DataAccessException {
                HashOperations hashOperations = redisOperations.opsForHash();
                hashOperations.get("redis_executePipelined", "aa");
                hashOperations.get("redis_executePipelined", "bb");

              /*  redisOperations.opsForValue().set("key2", "value2");
                redisOperations.opsForHash().put("hash2", "field", "test");
                operations.delete("redistest:"+"k"+i);*/
                return null;
            }
        };

        List list = redisTemplate.executePipelined(sessionCallback);
        [[User(name=小明, age=17), User(name=红红, age=20), User(name=黄黄, age=17)], [User(name=aa, age=17), User(name=bb, age=20), User(name=cc, age=17)]]
        System.out.println(list);
        for (JSONArray str : list) {
            List<User> userList = JSONArray.parseArray(JSON.toJSONString(str), User.class);
            System.out.println(userList);
        }

    }

2 execute 和 executePipelined 区别

execute :方法是串行的,命令请求发出后,必须得到响应数据,才能发送下一条命令请求。所以在一次 Redis 会话中,一次会话可能包含多次请求,即多次 RTT

executePipelined: 是穿插的,批量发送命令到服务器,批量获取响应数据。即可能使用一次 RTT 就能完成批量操作。文章来源地址https://www.toymoban.com/news/detail-602947.html

对比 execute executePipelined
执行方式 逐个执行 Redis 命令 将多个 Redis 命令封装在管道内,一次性提交
返回结果 根据具体 Redis 命令返回不同类型的结果 返回多个 Redis 命令的执行结果列表
效率 较慢,需要频繁的连接获取和释放 快,将多个 Redis 命令封装在一个管道内,减少连接数

到了这里,关于redis管道代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis如何保证缓存和数据库一致性?

    现在我们在面向增删改查开发时,数据库数据量大时或者对响应要求较快,我们就需要用到Redis来拿取数据。 Redis:是一种高性能的内存数据库,它将数据以键值对的形式存储在内存中,具有读写速度快、支持多种数据类型、原子性操作、丰富的特性等优势。 优势: 性能极高

    2024年01月16日
    浏览(66)
  • Redis如何保障缓存与数据库的数据一致性问题?

    目录 一.最经典的数据库加缓存的双写双删模式 二. 高并发场景下的缓存+数据库双写不一致问题分析与解决方案设计 三、上面高并发的场景下,该解决方案要注意的问题 1.1 Cache Aside Pattern概念以及读写逻辑 (1)读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取

    2023年04月21日
    浏览(47)
  • redis的缓存更新策略以及如何保证redis与数据库的数据一致性

    redis的缓存更新策略有这么几种: 1、由应用直接和redis以及数据库相连接:         查询数据时,应用去redis中查询,查不到的话再由应用去数据库中查询,并将查询结果放在redis;         更新数据时,由应用去触发redis数据的删除以及数据库的update。 2、应用只跟redi

    2024年02月13日
    浏览(53)
  • Redis数据库 | 发布订阅、主从复制、哨兵模式、缓存雪崩

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息 Redis 客户端可以订阅任意数量的频道 Redis主从复制是指在Redis中设置一个主节点(Master)和一个或多个从节点(Slave),

    2024年02月15日
    浏览(51)
  • 数据库缓存服务——NoSQL之Redis配置与优化

    目录 一、缓存概念 1.1 系统缓存 1.2 缓存保存位置及分层结构 1.2.1 DNS缓存 1.2.2 应用层缓存 1.2.3 数据层缓存 1.2.4 硬件缓存 二、关系型数据库与非关系型数据库 2.1 关系型数据库 2.2 非关系型数据库 2.3 关系型数据库和非关系型数据库区别: 2.4 非关系型数据库产生背景 2.5 总结

    2024年02月15日
    浏览(48)
  • Springboot+Redis:实现缓存 减少对数据库的压力

    🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 Redis实战与进阶 本专栏讲解Redis从原理到实践 这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.csdn.net/   目录 缓存如何实现?

    2024年03月24日
    浏览(54)
  • REDIS21_缓存双写一致方案、先更新数据库再删除缓存

    ①. 缓存双写一致性,谈谈你的理解 如果redis中有数据,需要和数据库中的值相同 如果redis中无数据,数据库中的值要是最新值 ②. 什么时候同步直写? 小数据,某条、某一小戳热点数据,要求立刻变更,可以前台服务降价一下,后台马上同步直写 ③. 什么时候异步缓写? 正常业务,马

    2023年04月08日
    浏览(45)
  • Redis缓存MySQL数据库存储二者如何保证数据一致性

    在大型互联网应用中,由于数据库读写频繁、压力大等原因,我们通常会使用缓存来减少数据库的访问次数,提高系统的性能。而Redis作为一个高性能的内存数据库,成为了缓存的首选方案之一。但是,缓存和数据库之间存在数据一致性的问题,如何解决这个问题呢?本文将

    2023年04月19日
    浏览(49)
  • redis面试题目-如何保证数据库与缓存的数据一致性

    原视频:https://www.bilibili.com/video/BV1Km4y1r75f?p=62vd_source=fa75329ae3880aa55609265a0e9f5d34 由于缓存和数据库是分开的,无法做到原子性的同时进行数据修改,可能出现缓存更新失败,或者数据库更新失败的情况,这时候会出现数据不一致,影响前端业务 先更新数据库,再更新缓存。缓

    2024年02月05日
    浏览(59)
  • Redis 缓存与数据库双写不一致如何解决

    Redis缓存与数据库双写不一致是一个常见的挑战,但可以通过一些方法来解决或减轻这种不一致性。以下是一些可能的解决方案: 事务处理: 在进行缓存和数据库双写时,确保它们被包含在同一事务中。这可以通过使用支持事务的数据库和Redis事务来实现。这样,要么两者同

    2024年01月21日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包