添加dbm的缓存及清理机制

This commit is contained in:
junleea 2025-09-09 20:45:04 +08:00
parent 5e184badca
commit defbafd9d6
5 changed files with 43 additions and 2 deletions

View File

@ -7,11 +7,15 @@ import (
"gorm.io/driver/sqlite" "gorm.io/driver/sqlite"
"gorm.io/gorm" "gorm.io/gorm"
"log" "log"
"sync"
"videoplayer/proto" "videoplayer/proto"
) )
var DB *gorm.DB var DB *gorm.DB
var DBMMap map[uint]*proto.DBValue
var DBMMapRWMutex = &sync.RWMutex{} //dbm日志
func Init() error { func Init() error {
var db *gorm.DB var db *gorm.DB
var err error var err error

View File

@ -232,6 +232,7 @@ func myTask() {
RunGeneralCron() RunGeneralCron()
service.ShellWillRunFromServer() service.ShellWillRunFromServer()
service.SyncTokenSecretFromUserCenter() service.SyncTokenSecretFromUserCenter()
service.DelDBMMap() //定时处理DBMMap中的数据
} }

View File

@ -27,13 +27,13 @@ var SigningKeyIsValid = true // 是否有效的签名密钥
const ( const (
MYSQL_USER = "video_t2" MYSQL_USER = "video_t2"
MYSQL_DB = "video_t2" MYSQL_DB = "video_t2"
MYSQL_PASSWORD = "2t2SKHmWEYj2xFKF" MYSQL_PASSWORD = "2fdreYj2xFKF"
MYSQL_PORT = "3306" MYSQL_PORT = "3306"
MYSQL_HOST = "127.0.0.1" MYSQL_HOST = "127.0.0.1"
MYSQL_DSN = MYSQL_USER + ":" + MYSQL_PASSWORD + "@tcp(" + MYSQL_HOST + ":" + MYSQL_PORT + ")/" + MYSQL_DB + "?charset=utf8mb4&parseTime=True&loc=Local" MYSQL_DSN = MYSQL_USER + ":" + MYSQL_PASSWORD + "@tcp(" + MYSQL_HOST + ":" + MYSQL_PORT + ")/" + MYSQL_DB + "?charset=utf8mb4&parseTime=True&loc=Local"
REDIS_ADDR = "127.0.0.1:6379" REDIS_ADDR = "127.0.0.1:6379"
REDIS_PASSWORD = "lj502138" REDIS_PASSWORD = "lgybvueiogvter"
REIDS_DB = 2 REIDS_DB = 2
TOKEN_SECRET = "mfjurnc_32ndj9dfhj" TOKEN_SECRET = "mfjurnc_32ndj9dfhj"
@ -43,6 +43,8 @@ const (
// 以下是文件上传的配置 // 以下是文件上传的配置
FILE_BASE_DIR = "/home/lijun/file/" FILE_BASE_DIR = "/home/lijun/file/"
DBMMap_Max_Keep_Time = 10 * 60 //DBMap中的数据最大保持时间10min
) )
const ( const (

View File

@ -111,3 +111,8 @@ type DBTableAttribute struct {
ColumnName string `json:"column_name"` // 列名 ColumnName string `json:"column_name"` // 列名
ColumnType string `json:"column_type"` // 列类型 ColumnType string `json:"column_type"` // 列类型
} }
type DBValue struct {
LastUserTime int64 `json:"last_user_time"`
Value *gorm.DB `json:"value"`
}

View File

@ -8,6 +8,7 @@ import (
"strconv" "strconv"
"videoplayer/dao" "videoplayer/dao"
"videoplayer/proto" "videoplayer/proto"
"videoplayer/worker"
) )
func RunSQL(req *proto.RunSQLRequest) (*proto.SQLResult, error) { func RunSQL(req *proto.RunSQLRequest) (*proto.SQLResult, error) {
@ -37,6 +38,16 @@ func RunSQL(req *proto.RunSQLRequest) (*proto.SQLResult, error) {
} }
func GetGORMDBObject(dbmInfo *proto.DBManage) (db_ *gorm.DB, err error) { func GetGORMDBObject(dbmInfo *proto.DBManage) (db_ *gorm.DB, err error) {
dao.DBMMapRWMutex.RLock()
defer dao.DBMMapRWMutex.RUnlock()
if dao.DBMMap != nil {
dbValue := dao.DBMMap[dbmInfo.ID]
if dbValue != nil {
dbValue.LastUserTime = worker.GetCurrentTimestamp()
return dbValue.Value, nil
}
}
switch dbmInfo.DB_Type { switch dbmInfo.DB_Type {
case proto.DB_TYPE_MYSQL: // MySQL case proto.DB_TYPE_MYSQL: // MySQL
dsn := dbmInfo.DB_User + ":" + dbmInfo.DB_Password + "@tcp(" + dbmInfo.DB_IP + ":" + strconv.Itoa(int(dbmInfo.DB_Port)) + ")/" + dbmInfo.DB_NAME + "?charset=utf8mb4&parseTime=True&loc=Local" dsn := dbmInfo.DB_User + ":" + dbmInfo.DB_Password + "@tcp(" + dbmInfo.DB_IP + ":" + strconv.Itoa(int(dbmInfo.DB_Port)) + ")/" + dbmInfo.DB_NAME + "?charset=utf8mb4&parseTime=True&loc=Local"
@ -53,6 +64,13 @@ func GetGORMDBObject(dbmInfo *proto.DBManage) (db_ *gorm.DB, err error) {
default: default:
err = errors.New("unsupported database type") err = errors.New("unsupported database type")
} }
dao.DBMMapRWMutex.Lock()
defer dao.DBMMapRWMutex.Unlock()
var dbValue *proto.DBValue
dbValue.Value = db_
dbValue.LastUserTime = worker.GetCurrentTimestamp()
dao.DBMMap[dbmInfo.ID] = dbValue
return db_, err return db_, err
} }
@ -218,3 +236,14 @@ func GetDBTableDesc(req *proto.GetDBTableDescReq, userId int) (*proto.SQLResult,
//} //}
return nil, nil return nil, nil
} }
func DelDBMMap() {
dao.DBMMapRWMutex.Lock()
defer dao.DBMMapRWMutex.Unlock()
cur := worker.GetCurrentTimestamp()
for k, v := range dao.DBMMap {
if cur-v.LastUserTime < proto.DBMMap_Max_Keep_Time {
delete(dao.DBMMap, k) //删除
}
}
}