1

アプリケーション (jedis ドライバーを使用して Java で記述) から少量のデータ (約 50 バイト) を、約 360 のメンバー (各メンバーにも非常に少量のデータが含まれる) を持つソート済みセットにプッシュしようとしています。アプリケーションが挿入を行ってから、redis サーバー (別のデータ センターにある別のサーバー) で結果を確認するまでに 60 ~ 90 秒のタイムラグが発生しています。これは一貫して発生します。最初は、アプリケーションに何かが原因でクエリがハングし、1 分後に実行されると思っていましたが、そうではありません。クエリを実行した直後にアプリケーション サーバーを完全にシャットダウンし、新しいアイテムがまだ 1 分表示されるためです。後でRedisで。さらに、セットのすべての要素を削除して挿入を再試行すると、すぐに実行されました (これは意図した動作です)。

これは完全にテスト環境にあり、他のトラフィックがどちらのサーバーにもヒットしていません。私のRedisサーバーにはデータがほとんどなく、十分なRAMとCPUがあります。アプリケーション サーバーと redis サーバー間のレイテンシは約 50 ミリ秒です。

このような遅延を引き起こしている可能性のある、私が見逃している構成設定はありますか?

前もって感謝します。

編集:挿入するための私のコードは次のとおりです

public void save(RedisEntity entity) {
    String key = entity.getKey();
    String value = entity.getValue();
    Jedis jedis = database.getJedis();

    try {
        if (entity instanceof RedisListEntity) {
            if (((RedisListEntity)entity).isSavePushesLeft()) {
                jedis.lpush(key, value);
            } else {
                jedis.rpush(key, value);
            }
        } else if (entity instanceof RedisSortedSetEntity) {
            Long score = ((RedisSortedSetEntity)entity).getScore();
            jedis.zadd(key, score, value);
        } else if (entity instanceof RedisSetEntity) {
            jedis.sadd(key, value);
        } else {
            jedis.set(key, value);
        }
    } catch (JedisConnectionException e) {
        raiseErrorForSave(key, value);
        database.returnBrokenResourceToPool(jedis);
    } finally {
        database.returnResourceToPool(jedis);
    }
}

そして取得 (ただし、挿入後 1 ~ 2 分間はキーが redis サーバーの redis-cli に表示されないことに注意してください。したがって、このコードは決して問題の一部ではありませんでした):

public Set<String> getSortedSetMembersWithRangeRankRev(String key, double min, double max, int start, int size) {
    Set<String> result = null;
    Jedis jedis = database.getJedis();

    try {
        result = jedis.zrevrangeByScore(key, max, min, start, size);
    } catch (JedisConnectionException e) {
        logger.warn("Failed to retrieve set for key " + key);
        logger.warn(e.getMessage());
        database.returnBrokenResourceToPool(jedis);
    } finally {
        database.returnResourceToPool(jedis);
    }
    return result;
}

編集: いくつかの詳細情報 - Redis サーバーを数日間オンにしてから再起動しました (開発環境にあるため、トラフィックはほとんどありません)。セットが 1000 メンバーに達すると、更新が即座に行われるようです。この問題は私にとってはまだ厄介な問題であり、原因を特定して今後発生しないようにしたいと考えています。それまでは、これを本番環境にリリースすることはできません。

4

0 に答える 0