精心整理Redis与Jedis排序

通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习。

在本文中,我们将讨论Redis SORT命令。

Redis提供了SORT命令,我们可以使用该命令从LIST,SET或ZSET中检索或存储排序的值。

以最简单的形式,我们可以在KEY上使用命令,如下面的示例所示:

SORT numbers_list

这将对键中包含的值进行排序并返回它们。 该命令将值排序为数字。 因此,假设我们有一个包含以下值的列表:

1, 110, 5

上面的命令将返回:

1 5 110

我们可以指定使用ALPHA修饰符按字母顺序对值进行排序。 有许多修饰符。 我们将在下面的示例中查看其中的一些。 这些示例将使用Jedis API。

对于我们的示例,让我们考虑一下我们有一个想法管理系统。 我们有一个包含系统中所有用户名的列表:

all:users [junior, francisco, ribeiro, user4]

对于每个用户名,将有一个包含用户信息的哈希:

user:

user:junior

  - name: "Junior User"

  - num_ideas : "5"

  - email:"fjunior@email.com"

user:francisco

 - name: "Francisco User"

 - num_ideas: "4"

 - email: "francisco@email.com"

...

对于我们的示例,我们可以看到一个将填充Redis的类:

package br.com.xicojunior.redistest;

import java.util.HashMap;

import java.util.Map;

import redis.clients.jedis.Jedis;

public class App 

{

    public static Jedis jedis = new Jedis("localhost");   

    public static void main( String[] args ){

        String names[] = new String[]{"junior", "francisco", "ribeiro", "user4"};

        for(String name: names){

            jedis.lpush("all:users", name);

        }

        addUserHash(names[0], "Junior User", "junior@junior.com", "5");

        addUserHash(names[1], "Francisco User", "francisco@francisco.com", "4");

        addUserHash(names[2], "Ribeiro User", "ribeiro@ribeiro.com", "3");

        addUserHash(names[3], "User 4", "user@user.com", "2");

        for(String name: names){

            System.out.println(jedis.hgetAll("user:".concat(name)));

        }

        System.out.println(jedis.lrange("all:users", 0, -1));

    }

    public static void addUserHash(String username, String name, String email, String numberOfIdeas){

        Map<String, String> userProp = new HashMap<String, String>();

        userProp.put("name",name);

        userProp.put("email", email);

        userProp.put("num_ideas", String.valueOf(numberOfIdeas));

        jedis.hmset("user:".concat(username), userProp);

    }

}

让我们看下面的代码示例:

package br.com.xicojunior.redistest;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.SortingParams;

public class SortTest {

    public static void main(String[] args) {

        Jedis jedis = new Jedis("localhost");

        //[1]sorting the usernames

        System.out.println(jedis.sort("all:users"));

        //[ribeiro, francisco, junior, user4]

        //[2]sorting the username alpha

        //jedis sort method receives a SortingParams instance for modifiers

        System.out.println(jedis.sort("all:users", new SortingParams().alpha()));

        //[francisco, junior, ribeiro, user4]

    }

}

在上面的示例中,我们对键“ all:users”进行排序。 第一次尝试时,似乎没有正确排序,因为默认排序考虑了数字。 在第二个示例中,我们使用ALPHA修饰符。 我们可以通过使用重载版本的sort方法来做到这一点。 它接收SortingParams类的实例。 在这种情况下,我们看到用户名已正确排序。

SORT命令的一个不错的功能是我们可以使用外部值(其他键中的值)对列表进行排序。 在下面的示例中,我们将按用户给出的提示数对all:users键进行排序。 可以使用“ BY”修饰符来完成,该修饰符接收要使用的键的模式。 让我们看下面的例子: 

package br.com.xicojunior.redistest;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.SortingParams;

public class SortTest {

    public static void main(String[] args) {

        Jedis jedis = new Jedis("localhost");

        //[1] Sorting the usernames by the number of ideas

        System.out.println(jedis.sort("all:users", new SortingParams().by("user:*->num_ideas")));

        //[user4, ribeiro, francisco, junior]

        //[1] Sorting the usernames by the number of ideas DESC

        System.out.println(jedis.sort("all:users", new SortingParams().by("user:*->num_ideas").desc()));

    }

}

在第二个示例中,我们通过一个外部值对用户名进行排序,在本例中,我们通过字段“ _numideas”对用户名进行排序。因为我们按哈希字段排序,所以使用了以下模式“ _user:-> numideas”。使用这种模式,我们说要查找键“ _user:”,其中“ *”将被列表中的值替换。由于是散列,因此我们需要通知该字段。我们使用模式“-> fieldname_”来完成。如果我们按字符串键排序,则可以使用模式“ _numideas * _”,因为有一个键可以存储每个用户的想法数。

在第一个调用中,它检索了值-将它们排序为ASC。我们还可以使用DESC修饰符告诉reRediso将其排序为_DESC。对于Jedis,BY和DESC是SortingParams中的方法。当所有方法都返回实例时,我们可以链接所有调用,这使读取代码更容易。

使用_SORT _命令,我们还可以从外部键检索值,也可以从外部哈希检索字段。我们可以使用GET修饰符进行此操作,并且可以多次使用。让我们在下面看到此修饰符的一些示例:

package br.com.xicojunior.redistest;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.SortingParams;

public class SortTest {

    public static void main(String[] args) {

        Jedis jedis = new Jedis("localhost");

        //[1] Sorting the usernames by the number of ideas and retrieving the user name

        System.out.println(jedis.sort("all:users", new SortingParams().by("user:*->num_ideas").get("user:*->name")));

        //[User 4, Ribeiro User, Francisco User, Junior User]

        //[2] Retrieving the name and email

        System.out.println(jedis.sort("all:users", new SortingParams().by("user:*->num_ideas").get("user:*->name","user:*->email")));

        //[User 4, user@user.com, Ribeiro User, ribeiro@ribeiro.com, Francisco User, francisco@francisco.com, Junior User, junior@junior.com]

        //[3] Retrieve the value of the key being sorted - Special pattern #

        System.out.println(jedis.sort("all:users", new SortingParams().by("user:*->num_ideas").get("user:*->name","user:*->email","#")));

        //[User 4, user@user.com, user4, Ribeiro User, ribeiro@ribeiro.com, ribeiro, Francisco User, francisco@francisco.com, francisco, Junior User, junior@junior.com, junior]

    }

}

在上面的代码中,我们可以看到GET修饰符的使用。 为了返回一个散列字段,我们可以使用类似于在BY修饰符中使用的模式。 首先,我们只是返回名称,但是正如我们所说的,我们可以多次使用GET。 在第二个中,我们从用户那里检索名称和电子邮件。 我们还可以检索使用特殊模式“#”排序的键的值。 GET方法接收一个变量,因此我们可以传递要从中检索值的所有外部键。

我们可以做的另一件事是将排序结果存储在一个键中。 在需要缓存排序结果的情况下很有用,我们可以为sort命令指定一个dest键。 结果将存储为LIST。

package br.com.xicojunior.redistest;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.SortingParams;

public class SortTest {

    public static void main(String[] args) {

        Jedis jedis = new Jedis("localhost");

        jedis.sort("all:users","dest_key1");

        System.out.println(jedis.lrange("dest_key1", 0, -1));

        //[ribeiro, francisco, junior, user4]

        jedis.sort("all:users", new SortingParams().alpha().desc(), "dest_key2");

        System.out.println(jedis.lrange("dest_key2", 0, -1));

        //[user4, ribeiro, junior, francisco]

    }

}

SORT命令的一个非常有用的功能是我们只能将其用于从相关键中获取值。 有一个修饰符指示不对NOSORT进行排序:

package br.com.xicojunior.redistest;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.SortingParams;

public class SortTest {

    public static void main(String[] args) {

        Jedis jedis = new Jedis("localhost");

        System.out.println(jedis.sort("all:users", new SortingParams().get("user:*->name","user:*->email").nosort()));

        //[User 4, user@user.com, Ribeiro User, ribeiro@ribeiro.com, Francisco User, francisco@francisco.com, Junior User, junior@junior.com]

    }

}

这段代码基本上为所有用户检索名称和电子邮件。 如果我们不使用SORT命令,则至少需要两个命令来执行相同的操作:

LRANGE all:users 0 -1 //TO get all usernames

然后为每个用户名分别调用HMGET,如下所示:

HMGET user:junior name email //TO get the name and email from a user

> 喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
 > 如果你对java技术很感兴趣也可以交流学习,共同学习进步。 
> 不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代

文章写道这里,欢迎完善交流。最后奉上近期整理出来的一套完整的java架构思维导图,分享给大家对照知识点参考学习。有更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java干货

 

posted @ 2020-03-24 10:33  Today今  阅读(629)  评论(0)    收藏  举报