![](/img/trans.png)
[英]How to delete a list of keys in Redis using Java/Spring APIs and return whether all keys delete or not?
[英]How to efficiently delete Multiple Session Keys in Java?
我正在嘗試優化下面的代碼片段。 我想使用一個循環來清除Java中的多個會話鍵。 因此,要求是我不想清除所有會話密鑰,而我想保留一些會話密鑰。 例如,在下面的代碼片段中,我試圖刪除包含ID_NAME_
鍵,並保留將ID傳遞給該方法的鍵。
下面是我寫的代碼片段,可以正常工作:
private void clearPreviousIdFromSession(HttpServletRequest request, String id) {
HttpSession session = request.getSession();
Enumeration keys = session.getAttributeNames();
ArrayList<String> keyArrs = new ArrayList<>();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
System.out.println("Keys for session : " + key);
if (key.contains("ID_NAME_"+id)) {
continue;
} else if(key.contains("ID_NAME_")) {
keyArrs.add(key);
}
}
for(String k : keyArrs){
System.out.println(k);
session.setAttribute(k, null);
session.removeAttribute(k);
}
}
下面是我試圖使其變成一個循環的代碼,但是由於removeAttribute()
將從此會話中刪除與指定名稱綁定的對象而導致錯誤。 在這種情況下,我認為key
將被刪除,並且將無法檢查列表中的nextElement。
private void clearPreviousIdFromSession(HttpServletRequest request, String id) {
HttpSession session = request.getSession();
Enumeration keys = session.getAttributeNames();
//ArrayList<String> keyArrs = new ArrayList<>();
String key;
while (keys.hasMoreElements()) {
key = (String) keys.nextElement();
System.out.println("Keys for session : " + key);
if (key.contains("ID_NAME_" + id)) {
continue;
} else if (key.contains("ID_NAME_")) {
session.removeAttribute(key);
}
}
}
您想優化已經設計好的東西。
由於您不應該在元素迭代期間刪除元素,因此可以收集要刪除的元素到列表中,並在迭代后迭代此列表以刪除它們。
這種方法很好,並且邏輯流程已“優化”。
如果您必須真正更改實際代碼中的某些內容,則可能是多余的操作:
session.setAttribute(k, null);
session.removeAttribute(k);
您應該只選擇其中之一:
for(String k : keyArrs){
System.out.println(k);
session.removeAttribute(k);
}
由於session.setAttribute(k, null)
具有與調用session.removeAttribute(k)
相同的效果。
if (key.contains("ID_REPO_" + id)) {
continue;
} else if (key.contains("ID_REPO_")) {
session.removeAttribute(key);
}
將此重構為java流:
key.stream()
.filter(key -> !key.contains("ID_REPO_" + id)) //filter all keys that do not have string
.forEach(key -> session.removeAttribute(key)) // execute lambda on every key filtered
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.