mirror of
https://github.com/songquanpeng/one-api.git
synced 2025-09-17 01:06:37 +08:00
feat: support Redis Sentinel and Redis Cluster (#1952)
* feature: support Redis Sentinel and Redis Cluster * chore: update implementation --------- Co-authored-by: JustSong <quanpengsong@gmail.com>
This commit is contained in:
parent
59eae186a3
commit
381172cb36
@ -222,7 +222,7 @@ docker-compose ps
|
|||||||
3. 所有从服务器必须设置 `NODE_TYPE` 为 `slave`,不设置则默认为主服务器。
|
3. 所有从服务器必须设置 `NODE_TYPE` 为 `slave`,不设置则默认为主服务器。
|
||||||
4. 设置 `SYNC_FREQUENCY` 后服务器将定期从数据库同步配置,在使用远程数据库的情况下,推荐设置该项并启用 Redis,无论主从。
|
4. 设置 `SYNC_FREQUENCY` 后服务器将定期从数据库同步配置,在使用远程数据库的情况下,推荐设置该项并启用 Redis,无论主从。
|
||||||
5. 从服务器可以选择设置 `FRONTEND_BASE_URL`,以重定向页面请求到主服务器。
|
5. 从服务器可以选择设置 `FRONTEND_BASE_URL`,以重定向页面请求到主服务器。
|
||||||
6. 从服务器上**分别**装好 Redis,设置好 `REDIS_CONN_STRING`,这样可以做到在缓存未过期的情况下数据库零访问,可以减少延迟。
|
6. 从服务器上**分别**装好 Redis,设置好 `REDIS_CONN_STRING`,这样可以做到在缓存未过期的情况下数据库零访问,可以减少延迟(Redis 集群或者哨兵模式的支持请参考环境变量说明)。
|
||||||
7. 如果主服务器访问数据库延迟也比较高,则也需要启用 Redis,并设置 `SYNC_FREQUENCY`,以定期从数据库同步配置。
|
7. 如果主服务器访问数据库延迟也比较高,则也需要启用 Redis,并设置 `SYNC_FREQUENCY`,以定期从数据库同步配置。
|
||||||
|
|
||||||
环境变量的具体使用方法详见[此处](#环境变量)。
|
环境变量的具体使用方法详见[此处](#环境变量)。
|
||||||
@ -351,6 +351,11 @@ graph LR
|
|||||||
1. `REDIS_CONN_STRING`:设置之后将使用 Redis 作为缓存使用。
|
1. `REDIS_CONN_STRING`:设置之后将使用 Redis 作为缓存使用。
|
||||||
+ 例子:`REDIS_CONN_STRING=redis://default:redispw@localhost:49153`
|
+ 例子:`REDIS_CONN_STRING=redis://default:redispw@localhost:49153`
|
||||||
+ 如果数据库访问延迟很低,没有必要启用 Redis,启用后反而会出现数据滞后的问题。
|
+ 如果数据库访问延迟很低,没有必要启用 Redis,启用后反而会出现数据滞后的问题。
|
||||||
|
+ 如果需要使用哨兵或者集群模式:
|
||||||
|
+ 则需要把该环境变量设置为节点列表,例如:`localhost:49153,localhost:49154,localhost:49155`。
|
||||||
|
+ 除此之外还需要设置以下环境变量:
|
||||||
|
+ `REDIS_PASSWORD`:Redis 集群或者哨兵模式下的密码设置。
|
||||||
|
+ `REDIS_MASTER_NAME`:Redis 哨兵模式下主节点的名称。
|
||||||
2. `SESSION_SECRET`:设置之后将使用固定的会话密钥,这样系统重新启动后已登录用户的 cookie 将依旧有效。
|
2. `SESSION_SECRET`:设置之后将使用固定的会话密钥,这样系统重新启动后已登录用户的 cookie 将依旧有效。
|
||||||
+ 例子:`SESSION_SECRET=random_string`
|
+ 例子:`SESSION_SECRET=random_string`
|
||||||
3. `SQL_DSN`:设置之后将使用指定数据库而非 SQLite,请使用 MySQL 或 PostgreSQL。
|
3. `SQL_DSN`:设置之后将使用指定数据库而非 SQLite,请使用 MySQL 或 PostgreSQL。
|
||||||
|
@ -2,13 +2,15 @@ package common
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/go-redis/redis/v8"
|
"github.com/go-redis/redis/v8"
|
||||||
"github.com/songquanpeng/one-api/common/logger"
|
"github.com/songquanpeng/one-api/common/logger"
|
||||||
"os"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var RDB *redis.Client
|
var RDB redis.Cmdable
|
||||||
var RedisEnabled = true
|
var RedisEnabled = true
|
||||||
|
|
||||||
// InitRedisClient This function is called after init()
|
// InitRedisClient This function is called after init()
|
||||||
@ -23,13 +25,23 @@ func InitRedisClient() (err error) {
|
|||||||
logger.SysLog("SYNC_FREQUENCY not set, Redis is disabled")
|
logger.SysLog("SYNC_FREQUENCY not set, Redis is disabled")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
logger.SysLog("Redis is enabled")
|
redisConnString := os.Getenv("REDIS_CONN_STRING")
|
||||||
opt, err := redis.ParseURL(os.Getenv("REDIS_CONN_STRING"))
|
if os.Getenv("REDIS_MASTER_NAME") == "" {
|
||||||
if err != nil {
|
logger.SysLog("Redis is enabled")
|
||||||
logger.FatalLog("failed to parse Redis connection string: " + err.Error())
|
opt, err := redis.ParseURL(redisConnString)
|
||||||
|
if err != nil {
|
||||||
|
logger.FatalLog("failed to parse Redis connection string: " + err.Error())
|
||||||
|
}
|
||||||
|
RDB = redis.NewClient(opt)
|
||||||
|
} else {
|
||||||
|
// cluster mode
|
||||||
|
logger.SysLog("Redis cluster mode enabled")
|
||||||
|
RDB = redis.NewUniversalClient(&redis.UniversalOptions{
|
||||||
|
Addrs: strings.Split(redisConnString, ","),
|
||||||
|
Password: os.Getenv("REDIS_PASSWORD"),
|
||||||
|
MasterName: os.Getenv("REDIS_MASTER_NAME"),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
RDB = redis.NewClient(opt)
|
|
||||||
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user