From eb290fd6e70b6523ea0889936dba4d9f2d5c4b53 Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期二, 10 三月 2026 18:58:39 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 xp-robotaxi-common/xp-common-redis/src/main/java/com/xiaopeng/common/redis/service/RedisService.java |   42 ++++++++++++++++++++++++++++++++++++++----
 1 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/xp-robotaxi-common/xp-common-redis/src/main/java/com/xiaopeng/common/redis/service/RedisService.java b/xp-robotaxi-common/xp-common-redis/src/main/java/com/xiaopeng/common/redis/service/RedisService.java
index b0a2138..96df056 100644
--- a/xp-robotaxi-common/xp-common-redis/src/main/java/com/xiaopeng/common/redis/service/RedisService.java
+++ b/xp-robotaxi-common/xp-common-redis/src/main/java/com/xiaopeng/common/redis/service/RedisService.java
@@ -6,10 +6,7 @@
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.BoundSetOperations;
-import org.springframework.data.redis.core.HashOperations;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.data.redis.core.*;
 import org.springframework.data.redis.core.script.DefaultRedisScript;
 import org.springframework.data.redis.core.script.RedisScript;
 import org.springframework.stereotype.Component;
@@ -214,6 +211,43 @@
         RedisScript<Long> script = new DefaultRedisScript<>(luaScript, Long.class);
         return redisTemplate.execute(script, Collections.singletonList(key), value);
     }
+
+    /**
+     * 从 List 中移除所有 value 包含指定关键字的元素
+     * @param key Redis key
+     * @param pattern 要匹配的关键字(如 "abc" 会匹配包含 "abc" 的所有元素)
+     * @return 移除的数量
+     */
+    public Long removeByPattern(String key, String pattern) {
+        ListOperations<String, String> listOps = redisTemplate.opsForList();
+
+        // 1. 获取 List 长度
+        Long size = listOps.size(key);
+        if (size == null || size == 0) {
+            return 0L;
+        }
+
+        // 2. 获取整个 List(小数据量可用,大数据量要优化)
+        List<String> allValues = listOps.range(key, 0, -1);
+        if (allValues == null || allValues.isEmpty()) {
+            return 0L;
+        }
+
+        // 3. 找到匹配的元素并记录位置(从后往前删除,避免索引变化)
+        long removedCount = 0;
+        for (int i = allValues.size() - 1; i >= 0; i--) {
+            String value = allValues.get(i);
+            if (value != null && value.contains(pattern)) {
+                // 使用 LREM 命令删除(从头部开始删除,count=1 表示只删一个)
+                Long result = listOps.remove(key, 1, value);
+                if (result != null && result > 0) {
+                    removedCount++;
+                }
+            }
+        }
+
+        return removedCount;
+    }
     /**
      * 缓存Set
      *

--
Gitblit v1.7.1