You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中实现Redis的模糊查询(类似MySQL LIKE命令)

Redis实现类似MySQL LIKE的模糊搜索方案

Redis本身并非为复杂搜索场景设计,但可以通过几种实用方案实现类似MySQL LIKE的模糊搜索需求,以下是常用实现方式:

1. KEYS命令(仅适合测试/小数据量场景)

KEYS命令支持通配符匹配键,语法和LIKE类似:

  • * 匹配任意长度的任意字符
  • ? 匹配单个字符
  • [] 匹配指定范围内的字符

示例PHP代码:

// 搜索所有包含"tutorial"的键
$matchingKeys = $redis->keys("*tutorial*");
foreach ($matchingKeys as $key) {
    $value = $redis->get($key);
    // 处理获取到的键值对
}

注意:KEYS会遍历Redis所有键,数据量大时会阻塞服务,绝对禁止在生产环境使用。

2. SCAN命令(生产环境推荐)

SCAN是迭代式的键匹配命令,不会阻塞Redis,适合生产环境处理大数据量的模糊搜索:

示例PHP代码:

$iterator = null;
do {
    // 参数:迭代器、匹配模式、每次返回的最大数量(可按需调整)
    $result = $redis->scan($iterator, "*tutorial*", 10);
    if ($result !== false) {
        foreach ($result as $key) {
            $value = $redis->get($key);
            // 处理结果
        }
    }
} while ($iterator > 0);

SCAN通过迭代器分批返回结果,需循环直到迭代器变为0,确保遍历所有匹配的键。

3. RedisSearch模块(复杂内容搜索首选)

如果需要对值的内容而非键进行模糊搜索,推荐使用Redis官方的RedisSearch扩展模块,它支持全文搜索、分词、过滤等高级功能:

示例PHP代码:

// 1. 创建索引,定义要搜索的字段(比如title字段为文本类型)
$redis->rawCommand('FT.CREATE', 'tutorial_index', 'SCHEMA', 'title', 'TEXT');

// 2. 添加文档到索引
$redis->rawCommand('FT.ADD', 'tutorial_index', 'doc_1', 1.0, 'FIELDS', 'title', 'Redis tutorial');
$redis->rawCommand('FT.ADD', 'tutorial_index', 'doc_2', 1.0, 'FIELDS', 'title', 'Advanced Redis guide');

// 3. 执行模糊搜索,类似LIKE '%Redis%'
$searchResult = $redis->rawCommand('FT.SEARCH', 'tutorial_index', '*Redis*');

RedisSearch支持更精准的搜索逻辑,比如短语匹配、权重排序等,但需要额外安装该模块。

4. 有序集合(ZSET)实现前缀/后缀搜索

如果只需要前缀或后缀匹配,可以用ZSET的ZRANGEBYLEX命令,性能优于KEYS/SCAN:

前缀匹配(类似LIKE 'Redis%')

// 初始化有序集合,将需要搜索的字符串作为成员存入(分数设为0即可)
$redis->zAdd('tutorial_zset', 0, 'Redis tutorial');
$redis->zAdd('tutorial_zset', 0, 'Redis advanced');

// 搜索前缀为"Redis"的所有成员
$prefixResults = $redis->zRangeByLex('tutorial_zset', '[Redis', '[Redis\xff');

后缀匹配(类似LIKE '%tutorial')

需要先将字符串反转存入另一个ZSET,再按前缀搜索后反转回来:

// 存入反转后的字符串
$redis->zAdd('tutorial_zset_rev', 0, strrev('Redis tutorial'));
$redis->zAdd('tutorial_zset_rev', 0, strrev('Python tutorial'));

// 搜索反转后的前缀(对应原字符串的后缀)
$revResults = $redis->zRangeByLex('tutorial_zset_rev', '[lairotut', '[lairotut\xff');
// 反转结果得到原字符串
$suffixResults = array_map(fn($str) => strrev($str), $revResults);

内容的提问来源于stack exchange,提问作者John Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:05:03