jedis与redis
在本文中,我们将讨论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 usernamesSystem.out.println(jedis.sort("all:users"));//[ribeiro, francisco, junior, user4]//[2]sorting the username alpha//jedis sort method receives a SortingParams instance for modifiersSystem.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 ideasSystem.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 DESCSystem.out.println(jedis.sort("all:users", new SortingParams().by("user:*->num_ideas").desc()));}}
在第二个示例中,我们通过一个外部值(在本例中为“ num_ideas ”)对用户名进行排序。 在这种情况下,我们使用哈希模式进行排序,我们使用以下模式“ user:*-> num_ideas ”。 使用这种模式,我们要寻找键“ user:* ”,其中的“ *”将被列表中的值替换。 由于它是一个散列,因此我们需要通知该字段,因此我们使用模式“ -> fieldname ”进行操作。 如果我们按字符串键排序,则可以考虑使用一个键来存储每个用户的想法数量,因此可以使用以下模式“ num_ideas_ * ”。
在第一次调用它检索排序ASC他们的价值观,我们也可以告诉Redis的对它进行排序DESC使用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 nameSystem.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 emailSystem.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,接收一个vararg,因此我们可以传递要从中检索值的所有外部键。
我们可以做的另一件事是将排序结果存储在一个键中。 对于要缓存排序结果的情况很有用,我们可以为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
- 我们可以在redis站点中找到命令文档。
翻译自: https://www.javacodegeeks.com/2014/02/redis-sort-with-jedis.html
jedis与redis