private <T> void onCommonChanged(final String configKeyPrefix, final List<T> changedList,
                                     final DataEventTypeEnum eventType, final Function<? super T, ? extends String> mapperToKey,
                                     final Class<T> tClass) {
        // Avoiding concurrent operations on list nodes
        final ReentrantLock reentrantLock = listSaveLockMap.computeIfAbsent(configKeyPrefix, key -> new ReentrantLock());
        try {
            reentrantLock.lock();
            final List<String> changeNames = changedList.stream().map(mapperToKey).collect(Collectors.toList());
            switch (eventType) {
                case DELETE:
                    changedList.stream().map(mapperToKey).forEach(removeKey -> delConfig(configKeyPrefix + removeKey));
                    delChangedData(configKeyPrefix, changeNames);
                    break;
                case REFRESH:
                case MYSELF:
                    final List<String> configDataNames = this.getConfigDataNames(configKeyPrefix);
                    changedList.forEach(changedData -> publishConfig(configKeyPrefix + mapperToKey.apply(changedData), changedData));

                    if (Objects.nonNull(configDataNames) && configDataNames.size() > changedList.size()) {
                        configDataNames.removeAll(changeNames);
                        configDataNames.forEach(this::delConfig);
                    }

                    publishConfig(configKeyPrefix + DefaultNodeConstants.LIST_STR, changeNames);
                    break;
                default:
                    changedList.forEach(changedData -> publishConfig(configKeyPrefix + mapperToKey.apply(changedData), changedData));
                    putChangeData(configKeyPrefix, changeNames);
                    break;
            }
        } catch (Exception e) {
            LOG.error("AbstractNodeDataChangedListener onCommonMultiChanged error ", e);
        } finally {
            reentrantLock.unlock();
        }
    }
onCommonChanged.
save to configuration center common methods.
examples data:
 namespaceId.meta.list
  -> meta.id
  -> meta.id
  -> meta.id

@param configKeyPrefix configKeyPrefix
@param changedList changedList
@param eventType eventType
@param mapperToKey mapperToKey
@param tClass tClass
shenyu-admin-listener/shenyu-admin-listener-api/src/main/java/org/apache/shenyu/admin/listener/AbstractNodeDataChangedListener.java