中间件
先来回顾下我们撮合程序项目中关于中间件的目录结构:
├── middleware # 中间件的包
│ ├── cache # 缓存包
│ │ └── cache.go # 缓存操作
│ ├── mq # 消息队列包
│ │ └── mq.go # MQ操作
│ └── redis.go # 主要做Redis初始化操作
虽然现在只用到了 Redis 一个中间件,但设计个 middleware 包,会方便以后扩展添加其他中间件,如 Kafka 或 RocketMQ 等。
再将缓存和消息队列分包,职责上就很分明,应用时也很明确。
redis.go 就只是做初始化的连接,我们来看看代码:
package middleware
import (
"matching/log"
"github.com/go-redis/redis"
"github.com/spf13/viper"
)
var RedisClient *redis.Client
func Init() {
addr := viper.GetString("redis.addr")
RedisClient = redis.NewClient(&redis.Options{
Addr: addr,
Password: "", // no password set
DB: 0, // use default DB
})
_, err := RedisClient.Ping().Result()
if err != nil {
panic(err)
} else {
log.Printf("Connected to redis: %s", addr)
}
}
其中,viper 是前文说过的第三方配置库,通过 viper.GetString("redis.addr") 从配置文件读取出要连接的 Redis 的地址,之后就新建一个 Redis 客户端并连接上 Redis 服务器了。
缓存的设计
讲数据结构设计时,我们已经说过,使用缓存的目的主要有两个:
1