> ## Documentation Index
> Fetch the complete documentation index at: https://blog.pig4cloud.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Redis一鱼两吃：向量数据库与缓存的完美结合

> 探索如何在同一个Redis实例中同时使用向量功能和缓存功能，实现资源的最优利用

在当今的技术生态中，Redis作为一个强大的内存数据存储系统，不仅仅是一个简单的缓存解决方案。随着AI和机器学习的蓬勃发展，Redis通过其搜索模块扩展了向量数据库的功能，使其能够在单一实例中同时服务于传统缓存和向量搜索两大场景。本文将深入探讨如何充分利用Redis的这两个强大功能。

<img src="https://minio.pigx.vip/oss/202502/1740533877.png" alt="1740533877" />

## 双重功能概述

### 作为缓存系统

Redis最广为人知的应用场景是作为缓存系统，它能够：

* 通过键值对快速存取数据
* 支持多种数据类型（字符串、哈希、列表等）
* 提供数据过期机制
* 实现高性能的读写操作

### 作为向量数据库

同时，Redis还可以作为向量数据库使用，支持：

* 存储高维向量数据
* 执行相似性搜索（KNN查询）
* 支持向量范围查询
* 提供元数据过滤功能

## 运行测试

```bash theme={null}
docker run -p 6379:6379 --name redis-stack redis/redis-stack:latest
```

#### 向量数据存储

Redis支持两种主要的向量存储方式：

1. Hash存储

```redis theme={null}
HSET docs:01 doc_embedding <vector_bytes> category sports
```

2. JSON存储

```redis theme={null}
JSON.SET docs:01 $ '{"doc_embedding":[0.34,0.63,-0.54,-0.69,0.98,0.61], "category": "sports"}'
```

在使用 RedisInsight 客户端进行数据可视化时，用户可以直观地查看 Redis 中存储的向量数据和其他信息。需要注意的是，使用 KEYS 命令无法查看到存储的向量数据，因为向量数据是以特定的格式存储在哈希或 JSON 中

<img src="https://minio.pigx.vip/oss/202502/1740152644.png" alt="1740152644" />

#### java sdk 接入向量

```java theme={null}
import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.sync.RedisCommands;
/**
 * @author lengleng
 */
public class LettuceVectorExample {
    public static void main(String[] args) {
        // 创建 Redis 客户端
        RedisClient redisClient = RedisClient.create("redis://localhost:6379");
        StatefulRedisConnection<String, String> connection = redisClient.connect();
        RedisCommands<String, String> commands = connection.sync();

        // 创建包含向量字段的索引
        String createIndex = "FT.CREATE myIndex ON HASH PREFIX 1 doc: SCHEMA embedding VECTOR FLAT 6 TYPE FLOAT32 DIM 4 DISTANCE_METRIC COSINE";
        commands.sendCommand("FT.CREATE", "myIndex", "ON", "HASH", "PREFIX", "1", "doc:", "SCHEMA", "embedding", "VECTOR", "FLAT", "6", "TYPE", "FLOAT32", "DIM", "4", "DISTANCE_METRIC", "COSINE");

        // 存储向量数据
        float[] vector = {0.1f, 0.2f, 0.3f, 0.4f};
        String vectorStr = floatArrayToString(vector); // 转换为字符串表示
        commands.hset("doc:1", "embedding", vectorStr);

        // 执行向量搜索（KNN）
        float[] queryVector = {0.15f, 0.25f, 0.35f, 0.45f};
        String query = "(@embedding:[VECTOR_RANGE 0.5 " + floatArrayToString(queryVector) + "])=>{$KNN: 1}";
        String result = commands.sendCommand("FT.SEARCH", "myIndex", query).toString();
        System.out.println("Search result: " + result);

        // 关闭连接
        connection.close();
        redisClient.shutdown();
    }

    // 辅助方法：将 float 数组转换为字符串
    private static String floatArrayToString(float[] vector) {
        StringBuilder sb = new StringBuilder();
        for (float v : vector) {
            sb.append(v).append(" ");
        }
        return sb.toString().trim();
    }
}
```

## 结论

Redis的双重功能为现代应用架构提供了独特的优势。通过合理配置和使用，可以在单一实例中同时满足缓存和向量搜索的需求，既节省了资源，又简化了系统架构。关键是要根据实际需求合理规划资源使用，实施适当的监控和优化策略。

## 参考资源

* [Redis官方向量文档](https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/vectors/)
* [Redis缓存最佳实践](https://redis.io/learn/howtos/solutions/microservices/caching)
* [Redis性能优化指南](https://redis.io/docs/latest/operate/rs/7.4/databases/memory-performance/)
