聊聊claudb的list command

2020-09-03 碼匠亂燉

本文主要研究一下claudb的list command



LeftPushCommand

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/LeftPushCommand.java

@Command(&34;)@ParamLength(2)@ParamType(DataType.LIST)public class LeftPushCommand implements DBCommand { @Override public RedisToken execute(Database db, Request request) {   ImmutableList<SafeString> values = request.getParams().asList().tail().reverse();​   DatabaseValue result = db.merge(safeKey(request.getParam(0)), list(values),       (oldValue, newValue) -> list(newValue.getList().appendAll(oldValue.getList())));​   return RedisToken.integer(result.size()); }}

  • LeftPushCommand實現了DBCommand接口,其execute方法提取values,然後執行db.merge,在newValue.getList()之後追加上oldValue.getList()

LeftPopCommand

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/LeftPopCommand.java

@Command(&34;)@ParamLength(1)@ParamType(DataType.LIST)public class LeftPopCommand implements DBCommand {​ @Override public RedisToken execute(Database db, Request request) {   List<SafeString> removed = new LinkedList<>();   db.merge(safeKey(request.getParam(0)), DatabaseValue.EMPTY_LIST,       (oldValue, newValue) -> {         ImmutableList<SafeString> list = oldValue.getList();         list.head().stream().forEach(removed::add);         return list(list.tail());       });​   if (removed.isEmpty()) {     return nullString();   } else {     return string(removed.remove(0));   } }}

  • LeftPopCommand實現了DBCommand接口,其execute方法執行db.merge,它先獲取oldValue.getList(),然後取出head添加到removed中,然後再通過list.tail()丟棄head作為新的結果

RightPushCommand

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/RightPushCommand.java

@Command(&34;)@ParamLength(2)@ParamType(DataType.LIST)public class RightPushCommand implements DBCommand {​ @Override public RedisToken execute(Database db, Request request) {   ImmutableList<SafeString> values = request.getParams().asList().tail();​   DatabaseValue result = db.merge(safeKey(request.getParam(0)), list(values),       (oldValue, newValue) -> list(oldValue.getList().appendAll(newValue.getList())));​   return integer(result.size()); }}

  • RightPushCommand實現了DBCommand接口,其execute方法提取values,然後執行db.merge,在oldValue.getList()之後追加上newValue.getList()

RightPopCommand

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/RightPopCommand.java

@Command(&34;)@ParamLength(1)@ParamType(DataType.LIST)public class RightPopCommand implements DBCommand {​ @Override public RedisToken execute(Database db, Request request) {   List<SafeString> removed = new LinkedList<>();   db.merge(safeKey(request.getParam(0)), DatabaseValue.EMPTY_LIST,       (oldValue, newValue) -> {         ImmutableList<SafeString> list = oldValue.getList();         list.reverse().head().stream().forEach(removed::add);         return list(list.reverse().tail().reverse());       });​   if (removed.isEmpty()) {     return nullString();   } else {     return string(removed.remove(0));   } }}

  • RightPopCommand實現了DBCommand接口,其execute方法執行db.merge,它先獲取oldValue.getList(),然後取出list倒數的head添加到removed中,然後再通過list.reverse().tail()丟棄head再reverse作為新的結果

ListLengthCommand

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/ListLengthCommand.java

@ReadOnly@Command(&34;)@ParamLength(1)@ParamType(DataType.LIST)public class ListLengthCommand implements DBCommand {​ @Override public RedisToken execute(Database db, Request request) {   ImmutableList<SafeString> list = db.getList(request.getParam(0));   return integer(list.size()); }}

  • ListLengthCommand實現了DBCommand接口,其execute方法先通過db.getList(request.getParam(0))獲取list,然後返回integer(list.size())

ListRangeCommand

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/ListRangeCommand.java

@ReadOnly@Command(&34;)@ParamLength(3)@ParamType(DataType.LIST)public class ListRangeCommand implements DBCommand {​ @Override public RedisToken execute(Database db, Request request) {   try {     DatabaseValue value = db.getOrDefault(safeKey(request.getParam(0)), DatabaseValue.EMPTY_LIST);     ImmutableList<SafeString> list = value.getList();​     int from = Integer.parseInt(request.getParam(1).toString());     if (from < 0) {       from = list.size() + from;     }     int to = Integer.parseInt(request.getParam(2).toString());     if (to < 0) {       to = list.size() + to;     }​     int min = Math.min(from, to);     int max = Math.max(from, to);​     // TODO: use Array     ImmutableList<SafeString> result = ImmutableList.from(list.stream().skip(min).limit((max - min) + 1));​     return convert(result);   } catch (NumberFormatException e) {     return error(&34;);   } }}

  • ListRangeCommand實現了DBCommand接口,其execute方法先獲取list,之後修正min及max,然後取ImmutableList.from(list.stream().skip(min).limit((max - min) + 1))

ListIndexCommand

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/ListIndexCommand.java

@ReadOnly@Command(&34;)@ParamLength(2)@ParamType(DataType.LIST)public class ListIndexCommand implements DBCommand {​ @Override public RedisToken execute(Database db, Request request) {   try {     ImmutableList<SafeString> list = db.getList(request.getParam(0));​     int index = Integer.parseInt(request.getParam(1).toString());     if (index < 0) {       index = list.size() + index;     }​     // TODO: fix asArray     return string(list.asArray().get(index));   } catch (NumberFormatException e) {     return error(&34;);   } catch (IndexOutOfBoundsException e) {     return nullString();   } }}

  • ListIndexCommand實現了DBCommand接口,其execute方法先獲取list,然後返回string(list.asArray().get(index))

ListSetCommand

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/ListSetCommand.java

@Command(&34;)@ParamLength(3)@ParamType(DataType.LIST)public class ListSetCommand implements DBCommand {​ @Override public RedisToken execute(Database db, Request request) {   try {     int index = Integer.parseInt(request.getParam(1).toString());     db.merge(safeKey(request.getParam(0)), DatabaseValue.EMPTY_LIST,         (oldValue, newValue) -> {           ImmutableList<SafeString> oldList = oldValue.getList();           // TODO: use Array           List<SafeString> array = new ArrayList<>(oldList.toList());           array.set(index > -1 ? index : array.size() + index, request.getParam(2));           return list(array);         });     return status(&34;);   } catch (NumberFormatException e) {     return error(&34;);   } catch (IndexOutOfBoundsException e) {     return error(&34;);   } }}

  • ListSetCommand實現了DBCommand接口,其execute方法先讀取index參數,然後執行db.merge,它讀取oldList,然後執行array.set(index > -1 ? index : array.size() + index, request.getParam(2)),最後返回list(array)

小結

claudb list相關的command有LeftPushCommand、LeftPopCommand、RightPushCommand、RightPopCommand、ListLengthCommand、ListRangeCommand、ListIndexCommand、ListSetCommand

doc

  • command/list

相關焦點

  • 聊聊claudb的set command
    序本文主要研究一下claudb的set command-1.7.1/src/main/java/com/github/tonivade/claudb/command/set/SetAddCommand.java@Command(&34;)@ParamLength(2)@ParamType(DataType.SET)public
  • 聊聊claudb的hash command
    序本文主要研究一下claudb的hash command-1.7.1/src/main/java/com/github/tonivade/claudb/command/hash/HashSetCommand.java@Command(&34;)@ParamLength(3)@ParamType(DataType.HASH)
  • 聊聊claudb的keys command
    序本文主要研究一下claudb的keys command-1.7.1/src/main/java/com/github/tonivade/claudb/command/key/KeysCommand.java@ReadOnly@Command(&34;)@ParamLength(1)public class KeysCommand
  • 聊聊claudb的transaction command
    序本文主要研究一下claudb的transaction command-1.7.1/src/main/java/com/github/tonivade/claudb/command/transaction/MultiCommand.java@Command(&34;)@TxIgnorepublic class MultiCommand implements DBCommand {​ private static final String
  • 聊聊claudb的server command
    序本文主要研究一下claudb的server command-1.7.1/src/main/java/com/github/tonivade/claudb/command/server/SelectCommand.java@ReadOnly@Command(&34;)@ParamLength(1)public class SelectCommand
  • 聊聊claudb的string command
    序本文主要研究一下claudb的string command-1.7.1/src/main/java/com/github/tonivade/claudb/command/string/GetCommand.java@ReadOnly@Command(&34;)@ParamLength(1)@ParamType(DataType.STRING
  • 聊聊claudb的scripting command
    序本文主要研究一下claudb的scripting command-1.7.1/src/main/java/com/github/tonivade/claudb/command/scripting/AbstractEvalCommand.javaabstract class AbstractEvalCommand implements
  • 聊聊claudb的pubsub command
    序本文主要研究一下claudb的pubsub command-1.7.1/src/main/java/com/github/tonivade/claudb/command/pubsub/PublishCommand.java@Command(&34;)@ParamLength(2)public class PublishCommand
  • 聊聊claudb的zset command
    -1.7.1/src/main/java/com/github/tonivade/claudb/command/zset/SortedSetAddCommand.java@Command(&34;)@ParamLength(3)@ParamType(DataType.ZSET
  • 聊聊claudb的MasterReplication
    );createCommands先添加ping命令,然後再添加commandsToReplicate;commandsToReplicate方法遍歷server.getCommandsToReplicate(),遇到array方法時先添加select命令,再添加command命令,最後返回commands
  • 聊聊claudb的SlaveReplication
    序本文主要研究一下claudb的SlaveReplication-1.7.1/src/main/java/com/github/tonivade/claudb/command/DBCommandProcessor.javapublic class DBCommandProcessor { private static final Logger LOGGER = LoggerFactory.getLogger(DBCommandProcessor.class
  • 聊聊claudb的NotificationManager
    序本文主要研究一下claudb的NotificationManagerNotificationManagerclaudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/pubsub/PatternSubscriptionSupport.javapublic interface PatternSubscriptionSupport extends BaseSubscriptionSupport { String PSUBSCRIPTION_PREFIX
  • 聊聊claudb的importRDB
    序本文主要研究一下claudb的importRDB-1.7.1/src/main/java/com/github/tonivade/claudb/DBServerState.javapublic class DBServerState {​ //......​
  • 聊聊claudb的exportRDB
    序本文主要研究一下claudb的exportRDBexportRDBclaudb-1.7.1/src/main/java/com/github/tonivade/claudb/DBServerState.javapublic class DBServerState {​ //......​
  • 聊聊claudb的Database
    序本文主要研究一下claudb的DatabaseDatabaseclaudb-1.7.1/src/main/java/com/github/tonivade/claudb/data/Database.javapublic interface Database {​ int size();​ boolean isEmpty();​ boolean
  • 聊聊claudb的DatabaseCleaner
    序本文主要研究一下claudb的DatabaseCleaner-1.7.1/src/main/java/com/github/tonivade/claudb/data/DatabaseCleaner.javapublic class DatabaseCleaner {​ private static final Logger
  • BanCommandPlus v1.1.0 發布,屏蔽命令的 Bungeecord 插件
    在v1.1.0或v1.1.0以後我們棄用了properties作為配置文件,使用了yml作為配置文件 將從Releases上下載的插件放入Bungeecord端根目錄的plugins文件夾裡 首次運行會在plugins文件裡生成BanCommandPlus文件夾下的config.yml配置文件,推薦使用Notepad++來編輯 本插件config.yml配置文件規範: banned-command
  • 詳解command設計模式,解耦操作和回滾
    今天我們介紹的設計模式叫做命令模式(command),在這個模式下,我們可以實現do和undo的解耦,讓使用方不用關心內部的實現細節。command模式這個模式我們在日常當中經常使用,舉一個很簡單的例子,比如說我們發布代碼。
  • GoF設計模式(十四):Command Pattern 命令模式
    可以看到,其內部會通過持有一個具體命令角色的實例實現請求的轉發/** * 調用者: 遙控器 */public class RemoteControl {    private Command command;    public void setCommand(Command command
  • ipset_list 3.1 發布,netfilter 封裝腳本
    ipset_list 3.1 發布了,改進記錄包括:adds the new option -Hi.