redis-scala和salat框架问题记录
需求与优化方案
1. Redis 批量插入优化
问题描述
原代码通过 for 循环逐条将数据插入 Redis:
val elems = List("1", "2", "3")
for (elem <- elems) {
redis.sadd("elems", elem)
}源码分析
redis-scala 的 sadd 方法定义如下:
def sadd(key: Any, value: Any, values: Any*)(implicit format: Format): Option[Long] =
send("SADD", List(key, value) ::: values.toList)(asLong)优化方案
通过 List.head 和 List.tail 拆分参数,实现一次性批量插入:
val elems = List("1", "2", "3")
redis.sadd("elems", elems.head, elems.tail: _*)效果:避免逐条请求,提升性能。
2. Salat 自定义字段投影查询
需求场景
希望实现 MongoDB 原生操作的字段投影效果:
db.find({"uid":"1000"}, {name:1})目标:仅获取 name 字段。
Salat 实现方式
使用 primitiveProjections 方法实现投影:
UserDao.primitiveProjections[String](MongoDBObject("uid" -> uid), "name")关键说明
- 需要 Salat 版本支持(参考 Salat 官方文档)
- 返回类型需与投影字段类型匹配(示例为
String类型的name字段) - 支持链式查询(可通过
MongoDBObject构建更复杂的查询条件)
注意事项
- Redis 批量插入:确保单次请求数据量不超过 Redis 协议限制(建议拆分超大列表)
- Salat 投影:需要显式导入
SalatImplicits或手动提供TypeHintStrategy隐式参数 性能对比:
方案 优势 局限性 单条插入 简单直观 高网络延迟 批量插入 降低RTT 单包数据量限制 原生投影查询 减少数据传输 需熟悉底层语法 Salat 投影 类型安全 依赖框架支持