jedis与redis_Redis与Jedis排序
jedis與redis
在本文中,我們將討論Redis SORT命令。
Redis提供了SORT命令,我們可以使用該命令從LIST,SET或ZSET中檢索或存儲排序的值。
我們可以使用最簡單的形式在KEY上使用命令,如下例所示:
這將對鍵中包含的值進行排序并返回它們。 該命令將值按數(shù)字排序。 因此,可以說我們有一個包含以下值的列表:
1, 110, 5上面的命令將返回
1 5 110我們可以指定使用ALPHA修飾符按字母順序?qū)χ颠M行排序。 有許多修飾符。 我們將在下面的示例中查看其中的一些。 這些示例將使用Jedis api。
對于我們的示例,讓我們考慮一下我們有一個想法管理系統(tǒng)。 我們有一個列表,其中包含系統(tǒng)中的所有用戶名:
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 ”進行了排序。 在第一次嘗試中,它似乎沒有正確排序,因為默認排序考慮了數(shù)字。 在第二個示例中,我們使用ALPHA修飾符。 我們可以通過使用sort方法的重載版本來實現(xiàn)。 它接收SortingParams類的實例。 在這種情況下,我們看到用戶名已正確排序。
SORT命令的一個不錯的功能是我們可以使用外部值(其他鍵中的值)對列表進行排序。 在下面的示例中,我們將按用戶給出的提示數(shù)對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 ”進行操作。 如果我們按字符串鍵排序,則可以考慮使用一個鍵來存儲每個用戶的想法數(shù)量,因此可以使用以下模式“ num_ideas_ * ”。
在第一次調(diào)用它檢索排序ASC他們的價值觀,我們也可以告訴Redis的對它進行排序DESC使用DESC修改。 jedis BY和DESC是SortingParams中的方法。 當所有方法都返回實例時,我們可以鏈接所有調(diào)用,這使代碼讀取更容易。
使用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,因此我們可以傳遞要從中檢索值的所有外部鍵。
我們可以做的另一件事是將排序結(jié)果存儲在一個鍵中。 對于要緩存排序結(jié)果的情況很有用,我們可以為sort命令指定一個dest鍵。 結(jié)果將存儲為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命令的一個非常有用的功能是我們只能將其用于從相關(guān)鍵中獲取值。 有一個修飾符指示不對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命令,則至少需要兩個命令來執(zhí)行相同的操作:
LRANGE all:users 0 -1 //TO get all usernames然后為每個用戶名分別調(diào)用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
總結(jié)
以上是生活随笔為你收集整理的jedis与redis_Redis与Jedis排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 霍廷格对内斯蒂夫-哪一个更好?[2022
- 下一篇: 电脑cmd命令ping网络连接数据库(c