2
votes

Existe-t-il un moyen de passer des commandes redis dans jedis, sans utiliser les fonctions?

Nous essayons de créer une console pour traiter les requêtes Redis. Mais, dans le back-end, nous devons utiliser Jedis. Ainsi, les commandes, données comme entrées, doivent être traitées à l'aide de Jedis. Par exemple, dans redis-cli, nous utilisons "keys *". Pour la même chose, nous utilisons jedis.keys ("*") dans Jedis. Je n'ai aucune idée, comment convertir "keys *" en jedis.keys ("*"). Veuillez me faire part de quelques suggestions ....


0 commentaires

3 Réponses :


1
votes

Hmm ... Vous pouvez faire la même chose en vous référant à ce qui suit.
redis.clients.jedis.Connection.sendCommand (Commande, Chaîne ...)
Créez une classe étendre la connexion .
Créez une instance class extend Connection et appelez la méthode connect () .
Appelez super.sendCommand (Protocol.Command.valueOf (args [0] .toUpperCase ()), args [1 ~ end]) .
exemple pour vous:

public class JedisConn extends Connection {

    public JedisConn(String host, int port) {

        super(host, port);
    }

    @Override
    protected Connection sendCommand(final Protocol.Command cmd, final String... args) {
        return super.sendCommand(cmd, args);
    }


    public static void main(String[] args) {

        JedisConn jedisConn = new JedisConn("host", 6379);
        jedisConn.connect();

        Connection connection = jedisConn.sendCommand(Protocol.Command.valueOf(args[0].toUpperCase()),  Arrays.copyOfRange(args, 1, args.length));
        System.out.println(connection.getAll());
        jedisConn.close();
    }
}

Haha ~~


0 commentaires

1
votes

J'ai trouvé un moyen pour cela. Il existe une fonction nommée eval (). Nous pouvons l'utiliser pour cela comme indiqué ci-dessous.

`Scanner s=new Scanner(System.in);String query=s.nextLine();
 String[] q=query.split(" ");
 String cmd='\''+q[0]+'\'';
 for(int i=1;i<q.length;i++)
 cmd+=",\'"+q[i]+'\'';
 System.out.println(j.eval("return redis.call("+cmd+")"));`


0 commentaires

2
votes

Je sais que c'est une vieille question, mais j'espère que la suivante sera utile pour d'autres.

Voici quelque chose que j'ai proposé car la version la plus récente de Jedis (3.2.0 à ce jour) ne supportait pas le Commande "memory usage" disponible sur Redis> = 4. Ce code suppose qu'un objet Jedis a été créé, probablement à partir d'un pool de ressources Jedis:

Long byteSize = jedis.memoryUsage(key);

Ceci est une commande de cas particulier car elle a un mot clé principal memory avec une action secondaire usage (les autres sont doctor , stats , purge , etc.). Lors de l'envoi de commandes à plusieurs mots-clés à Redis, les mots-clés doivent être traités comme une liste. Ma première tentative de spécification de l ' utilisation de la mémoire en tant qu'argument unique a échoué avec une erreur de serveur Redis.

Par la suite, il semble que l'implémentation actuelle de Jedis soit orientée vers des commandes à mot-clé unique, car sous le capot, il y a un tas de code spécial pour gérer les commandes à plusieurs mots-clés telles que debug object cela ne correspond pas tout à fait au cadre de mot-clé de commande d'origine.

Quoi qu'il en soit, une fois mon projet actuel qui nécessitait la possibilité d'appeler utilisation de la mémoire est terminé, je vais essayer de fournir un correctif au mainteneur de Jedis pour implémenter la commande ci-dessus d'une manière plus officielle / conventionnelle, qui ressemblerait à quelque chose comme:

import redis.clients.jedis.util.SafeEncoder;
// ... Jedis setup code ...
byteSize = (Long) jedis.sendCommand(new ProtocolCommand() {
                                        @Override
                                        public byte[] getRaw() {
                                          return SafeEncoder.encode("memory");
                                        }}, 
                                    SafeEncoder.encode("usage"), 
                                    SafeEncoder.encode(key));

Enfin, pour répondre à votre besoin spécifique, le mieux est d'utiliser la méthode scan () de la classe Jedis. Il y a des articles ici sur SO qui expliquent comment utiliser la méthode scan ().


0 commentaires