添加对Gorm写入的操作锁繁殖
This commit is contained in:
parent
3ae1f0a625
commit
eeec5453ae
|
@ -1,38 +0,0 @@
|
|||
package async
|
||||
|
||||
import (
|
||||
"blog/internal/consts"
|
||||
"blog/internal/model/blog"
|
||||
"blog/third_party/database"
|
||||
"context"
|
||||
"log"
|
||||
"math"
|
||||
"time"
|
||||
|
||||
"github.com/redis/go-redis/v9"
|
||||
)
|
||||
|
||||
var articleChannel chan string
|
||||
|
||||
func init() {
|
||||
f := math.Pow(2, 5)
|
||||
articleChannel = make(chan string, int(f))
|
||||
|
||||
go func() {
|
||||
ctx := context.Background()
|
||||
for id := range articleChannel {
|
||||
log.Println(id)
|
||||
time := time.Now().UnixMilli()
|
||||
|
||||
var article *blog.BlogArticle
|
||||
database.GormTemplate.Table("blog_articles").Where("id = ?", id).UpdateColumn("publish_time", time)
|
||||
database.GormTemplate.Table("blog_articles").Where("id = ?", id).First(article)
|
||||
|
||||
database.RedisTemplate.ZAdd(ctx, consts.REDIS_BLOG_ARTICLE_LATEST, redis.Z{Score: float64(article.PublishTime), Member: article})
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func PublishArticle(id string) {
|
||||
articleChannel <- id
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
package async
|
||||
|
||||
import (
|
||||
"blog/internal/consts"
|
||||
"blog/internal/model/blog"
|
||||
"blog/third_party/database"
|
||||
"context"
|
||||
"math"
|
||||
|
||||
"github.com/redis/go-redis/v9"
|
||||
)
|
||||
|
||||
var diaryChannel chan string
|
||||
|
||||
func init() {
|
||||
f := math.Pow(2, 5)
|
||||
diaryChannel = make(chan string, int(f))
|
||||
|
||||
go func() {
|
||||
ctx := context.Background()
|
||||
for id := range diaryChannel {
|
||||
// log.Println(id)
|
||||
|
||||
var diary blog.BlogDiary
|
||||
database.GormTemplate.Table("blog_diaries").Where("id = ?", id).First(&diary)
|
||||
database.RedisTemplate.ZAdd(ctx, consts.REDIS_BLOG_DIARY_LATEST, redis.Z{Score: float64(diary.PublishTime), Member: diary})
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func PublishDiary(id string) {
|
||||
diaryChannel <- id
|
||||
}
|
|
@ -8,6 +8,7 @@ import (
|
|||
"math"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
var viewRecordChannel chan ViewRecord
|
||||
|
@ -25,14 +26,20 @@ func init() {
|
|||
viewRecordChannel = make(chan ViewRecord, int(f))
|
||||
go func() {
|
||||
|
||||
ctx := context.Background()
|
||||
for record := range viewRecordChannel {
|
||||
log.Println("IP:", record.IpAddr, "点击了:", record.Title)
|
||||
relId := record.RelId
|
||||
record.Id = uuid.NewString()
|
||||
database.GormTemplate.Table("blog_view_record").Create(&record)
|
||||
ctx := context.Background()
|
||||
database.RedisTemplate.HIncrBy(ctx, consts.REDIS_BLOG_VIEW_RECORD, relId, 1)
|
||||
|
||||
database.WGorm().Transaction(func(tx *gorm.DB) error {
|
||||
err := tx.Table("blog_view_record").Create(&record).Error
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err2 := database.RedisTemplate.HIncrBy(ctx, consts.REDIS_BLOG_VIEW_RECORD, relId, 1).Err()
|
||||
return err2
|
||||
})
|
||||
database.WGormUnlock()
|
||||
}
|
||||
|
||||
}()
|
||||
|
|
|
@ -1,18 +1,20 @@
|
|||
package admin
|
||||
|
||||
import (
|
||||
"blog/internal/async"
|
||||
"blog/internal/consts"
|
||||
"blog/internal/model/AjaxResult"
|
||||
"blog/internal/model/admin"
|
||||
"blog/internal/model/vo"
|
||||
"blog/third_party/SessionUtil"
|
||||
"blog/third_party/database"
|
||||
"context"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/kataras/iris/v12"
|
||||
"github.com/kataras/iris/v12/sessions"
|
||||
"github.com/mitchellh/mapstructure"
|
||||
"github.com/redis/go-redis/v9"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
@ -29,18 +31,16 @@ func (ctrl *DiaryController) Get() {
|
|||
}
|
||||
|
||||
func (ctrl *DiaryController) PostSubmit() {
|
||||
session := sessions.Get(ctrl.Ctx)
|
||||
var userMap map[string]string
|
||||
session.Decode("user", &userMap)
|
||||
var user admin.SysUser
|
||||
mapstructure.Decode(userMap, &user)
|
||||
user := SessionUtil.GetUser(ctrl.Session)
|
||||
userId := user.Id
|
||||
|
||||
content := ctrl.Ctx.FormValue("content")
|
||||
var err error
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
diaryId := uuid.NewString()
|
||||
database.GormTemplate.Transaction(func(tx *gorm.DB) error {
|
||||
database.WGorm().Transaction(func(tx *gorm.DB) error {
|
||||
now := time.Now().UnixMilli()
|
||||
diary := admin.AdminDiary{Id: diaryId, PublishTime: now, Del: 0, CreateTime: now, CreateBy: userId}
|
||||
ctn := vo.CommonContent{Id: uuid.NewString(), RelId: diaryId, Content: content}
|
||||
|
@ -80,11 +80,18 @@ func (ctrl *DiaryController) PostSubmit() {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
// database.GormTemplate.Table("blog_diaries").Where("id = ?", id).First(&diary)
|
||||
err = database.RedisTemplate.ZAdd(ctx, consts.REDIS_BLOG_DIARY_LATEST, redis.Z{Score: float64(diary.PublishTime), Member: &diary}).Err()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = database.RedisTemplate.Set(ctx, consts.REDIS_BLOG_CONTENT+diaryId, content, time.Duration(0)).Err()
|
||||
return err
|
||||
})
|
||||
defer database.WGormUnlock()
|
||||
|
||||
if err != nil {
|
||||
async.PublishDiary(diaryId)
|
||||
ctrl.Ctx.JSON(AjaxResult.OkMsg("发布成功", nil))
|
||||
return
|
||||
}
|
||||
|
|
|
@ -67,12 +67,13 @@ func (ctrl *FileController) PostUpload() {
|
|||
Data: bytes, State: "1",
|
||||
Del: 0,
|
||||
}
|
||||
err = database.GormTemplate.Transaction(func(tx *gorm.DB) error {
|
||||
err = database.WGorm().Transaction(func(tx *gorm.DB) error {
|
||||
err2 := tx.Table("common_files").Create(sysFile).Error
|
||||
return err2
|
||||
// log.Println(sysFile)
|
||||
// return nil
|
||||
})
|
||||
defer database.WGormUnlock()
|
||||
if err != nil {
|
||||
// {
|
||||
// success : 0 | 1, // 0 表示上传失败,1 表示上传成功
|
||||
|
@ -98,7 +99,7 @@ func (ctrl *FileController) DelFile() {
|
|||
return
|
||||
}
|
||||
ctx := context.Background()
|
||||
err := database.GormTemplate.Transaction(func(tx *gorm.DB) error {
|
||||
err := database.WGorm().Transaction(func(tx *gorm.DB) error {
|
||||
txErr := tx.Table("common_files").Delete(&vo.CommonFiles{Id: id}).Error
|
||||
if txErr != nil {
|
||||
return txErr
|
||||
|
@ -107,6 +108,7 @@ func (ctrl *FileController) DelFile() {
|
|||
|
||||
return txErr
|
||||
})
|
||||
defer database.WGormUnlock()
|
||||
|
||||
if err != nil {
|
||||
ctrl.Ctx.JSON(AjaxResult.Error("删除失败"))
|
||||
|
|
|
@ -96,7 +96,7 @@ func (*articleService) CreateArticle(articel *admin.AdminArticle) (string, error
|
|||
articel.Del = 0
|
||||
articel.State = consts.ARTICLE_STATE_DRAFT
|
||||
|
||||
err := database.GormTemplate.Transaction(func(tx *gorm.DB) error {
|
||||
err := database.WGorm().Transaction(func(tx *gorm.DB) error {
|
||||
contentId := uuid.NewString()
|
||||
content := articel.Content
|
||||
commonContent := vo.CommonContent{Id: contentId, RelId: articleId, Content: content, State: "down"}
|
||||
|
@ -108,6 +108,7 @@ func (*articleService) CreateArticle(articel *admin.AdminArticle) (string, error
|
|||
err = tx.Table("blog_articles").Create(*articel).Error
|
||||
return err
|
||||
})
|
||||
defer database.WGormUnlock()
|
||||
return articleId, err
|
||||
}
|
||||
|
||||
|
@ -115,7 +116,7 @@ func (*articleService) UpdateArticle(articel *admin.AdminArticle) (string, error
|
|||
time := time.Now().UnixMilli()
|
||||
articleId := articel.Id
|
||||
articel.UpdateTime = time
|
||||
err := database.GormTemplate.Transaction(func(tx *gorm.DB) error {
|
||||
err := database.WGorm().Transaction(func(tx *gorm.DB) error {
|
||||
//更新Article
|
||||
tx.Table("blog_articles").Updates(articel)
|
||||
|
||||
|
@ -123,6 +124,7 @@ func (*articleService) UpdateArticle(articel *admin.AdminArticle) (string, error
|
|||
err := tx.Table("common_contents").Where("rel_id", articleId).UpdateColumn("content", articel.Content).Error
|
||||
return err
|
||||
})
|
||||
defer database.WGormUnlock()
|
||||
return articleId, err
|
||||
}
|
||||
|
||||
|
@ -142,12 +144,13 @@ func (*articleService) PublishArticle(id string) error {
|
|||
article.PublishTime = now
|
||||
article.State = consts.ARTICLE_STATE_PUBLISH
|
||||
|
||||
err = database.GormTemplate.Transaction(func(tx *gorm.DB) error {
|
||||
err = database.WGorm().Transaction(func(tx *gorm.DB) error {
|
||||
var txErr error = tx.Table("blog_articles").Updates(&article).Error
|
||||
if txErr != nil {
|
||||
return errors.New("文章更新错误")
|
||||
}
|
||||
txErr = ContentService.UpdataState(id, consts.CONTENT_STATE_PUBLISH)
|
||||
// txErr = ContentService.UpdataState(id, consts.CONTENT_STATE_PUBLISH)
|
||||
txErr = tx.Table("common_contents").Where("rel_id = ?", id).UpdateColumn("state", consts.CONTENT_STATE_PUBLISH).Error
|
||||
if txErr != nil {
|
||||
return errors.New("文本状态更新错误")
|
||||
}
|
||||
|
@ -165,7 +168,7 @@ func (*articleService) PublishArticle(id string) error {
|
|||
|
||||
return txErr
|
||||
})
|
||||
|
||||
defer database.WGormUnlock()
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -180,7 +183,7 @@ func (*articleService) UnPublishArticle(id string) error {
|
|||
return errors.New("撤下失败,文章状态不是已发布状态,无法撤下")
|
||||
}
|
||||
|
||||
err = database.GormTemplate.Transaction(func(tx *gorm.DB) error {
|
||||
err = database.WGorm().Transaction(func(tx *gorm.DB) error {
|
||||
var txErr error
|
||||
ctx := context.Background()
|
||||
txErr = database.RedisTemplate.ZRemRangeByScore(ctx, consts.REDIS_BLOG_ARTICLE_LATEST,
|
||||
|
@ -203,10 +206,12 @@ func (*articleService) UnPublishArticle(id string) error {
|
|||
if txErr != nil {
|
||||
return errors.New("文章状态更新错误")
|
||||
}
|
||||
txErr = ContentService.UpdataState(id, consts.CONTENT_STATE_DOWN)
|
||||
// txErr = ContentService.UpdataState(id, consts.CONTENT_STATE_DOWN)
|
||||
txErr = tx.Table("common_contents").Where("rel_id = ?", id).UpdateColumn("state", consts.CONTENT_STATE_DOWN).Error
|
||||
|
||||
return txErr
|
||||
})
|
||||
defer database.WGormUnlock()
|
||||
|
||||
return err
|
||||
}
|
||||
|
@ -214,10 +219,11 @@ func (*articleService) UnPublishArticle(id string) error {
|
|||
func (*articleService) DelArticle(id string) error {
|
||||
// articel := ArticleService.GetAdminArticle(id)
|
||||
// err := database.GormTemplate.Table("blog_articles").Where("id = ?", id).First(&article).Error
|
||||
err := database.GormTemplate.Transaction(func(tx *gorm.DB) error {
|
||||
err := database.WGorm().Transaction(func(tx *gorm.DB) error {
|
||||
txErr := tx.Table("blog_articles").Where("id = ?", id).UpdateColumn("del", 1).Error
|
||||
return txErr
|
||||
})
|
||||
defer database.WGormUnlock()
|
||||
|
||||
return err
|
||||
}
|
||||
|
|
7
main.go
7
main.go
|
@ -18,13 +18,6 @@ import (
|
|||
"github.com/kataras/iris/v12/sessions/sessiondb/redis"
|
||||
)
|
||||
|
||||
// func main() {
|
||||
// i := time.Now().UnixMilli()
|
||||
// log.Println(i)
|
||||
// b, _ := bcrypt.GenerateFromPassword([]byte("123456"), bcrypt.DefaultCost)
|
||||
// log.Println(string(b))
|
||||
// }
|
||||
|
||||
func main() {
|
||||
profile := os.Getenv("profile")
|
||||
log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Ltime | log.Llongfile)
|
||||
|
|
|
@ -3,12 +3,14 @@ package database
|
|||
import (
|
||||
"log"
|
||||
"os"
|
||||
"sync"
|
||||
|
||||
"github.com/glebarez/sqlite"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
var GormTemplate *gorm.DB
|
||||
var rwMutex sync.RWMutex
|
||||
|
||||
func init() {
|
||||
path := "./sqlite.db"
|
||||
|
@ -24,3 +26,13 @@ func init() {
|
|||
log.Println("SQLite连接成功,Gorm初始化完成")
|
||||
// db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{})
|
||||
}
|
||||
|
||||
// sqlite无法同时多个线程写入,需要上锁保护,读操作无需考虑
|
||||
func WGorm() *gorm.DB {
|
||||
rwMutex.Lock()
|
||||
return GormTemplate
|
||||
}
|
||||
|
||||
func WGormUnlock() {
|
||||
rwMutex.Unlock()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue