您好,登錄后才能下訂單哦!
在優銳課學習筆記中,我們將討論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
我們可以在redis網站上找到命令文檔。
抽絲剝繭,細說架構那些事--優銳課
文章寫道這里,歡迎朋友點贊關注,如有不足之處,歡迎評論交流!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。