【问题标题】:Will the redis callback be executed in redis and not in my program?redis 回调会在 redis 中执行,而不是在我的程序中执行吗?
【发布时间】:2020-12-02 18:30:13
【问题描述】:

比如说我有以下代码:

return (long) redisTemplate.execute(new RedisCallback() {
        @Override
        public Object doInRedis(RedisConnection connection) throws DataAccessException {
            String redisKey = RedisKeyUtil.getDAUKey(df.format(start), df.format(end));
            connection.bitOp(RedisStringCommands.BitOperation.OR,
                    redisKey.getBytes(), keyList.toArray(new byte[0][0]));
            return connection.bitCount(redisKey.getBytes());
        }
    });

这个doInredis方法会在redis集群中执行而不是在我的程序中执行吗?

【问题讨论】:

    标签: java spring-boot redis spring-data-redis


    【解决方案1】:

    没有。 RedisTemplate 只是一个 Springboot 帮助类,它简化了你的 Redis 数据访问代码,它仍然在你的线程中本地执行。

    如果您的用例都与基本 Redis 命令相关,您可以使用 Lua(示例代码 here)。但是,列表操作中没有前缀过滤,所以您可能也可以尝试CompletableFuture,这样您的数据处理就不会阻塞其他操作。

    【讨论】:

      【解决方案2】:

      您的 Java 代码不会在 Redis 中运行。 Redis 甚至不知道 JVM,所以它根本做不到。

      【讨论】:

      • 有没有办法通过redis模板根据一定的条件过滤数据?假设我有一个键值对 mykey -> ["johnfernando", ''Danieldario"] 我只想映射列表中前缀为 Daniel 的字符串。
      • 我认为有一种叫做 lua 脚本的东西,您可以在其中将脚本发送到 redis 服务器。如果可能,请详细说明。
      • 您可以在 Redis 中使用 Lua 脚本。有关其工作原理的所有详细信息都在 EVAL 命令文档中。请注意,如果您使用带有 Lua 脚本的集群,则需要特别注意。一切都需要在同一个分片中。 redis.io/commands/eval
      猜你喜欢
      • 2018-11-09
      • 2021-03-04
      • 2016-04-26
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 2013-07-12
      • 2020-10-30
      • 1970-01-01
      相关资源
      最近更新 更多