优化内存缓存;精简非必要字段
This commit is contained in:
parent
b743521695
commit
e3250bf686
14
feed.go
Normal file
14
feed.go
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
type feed struct {
|
||||||
|
Title string `json:"title,omitempty"`
|
||||||
|
Link string `json:"link"`
|
||||||
|
Custom map[string]string `json:"custom,omitempty"`
|
||||||
|
Items []item `json:"items,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type item struct {
|
||||||
|
Title string `json:"title"`
|
||||||
|
Link string `json:"link"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
}
|
||||||
58
main.go
58
main.go
@ -20,9 +20,10 @@ type Config struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
dbMap sync.Map
|
dbMap map[string]feed
|
||||||
rssUrls Config
|
rssUrls Config
|
||||||
upgrader = websocket.Upgrader{}
|
upgrader = websocket.Upgrader{}
|
||||||
|
lock sync.RWMutex
|
||||||
|
|
||||||
//go:embed static
|
//go:embed static
|
||||||
dirStatic embed.FS
|
dirStatic embed.FS
|
||||||
@ -48,6 +49,8 @@ func init() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dbMap = make(map[string]feed)
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -73,15 +76,24 @@ func wsHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
log.Printf("Upgrade failed: %v", err)
|
log.Printf("Upgrade failed: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
for {
|
for {
|
||||||
for _, url := range rssUrls.Values {
|
for _, url := range rssUrls.Values {
|
||||||
feedJSON, ok := dbMap.Load(url)
|
lock.RLock()
|
||||||
|
cache, ok := dbMap[url]
|
||||||
|
lock.RUnlock()
|
||||||
if !ok {
|
if !ok {
|
||||||
log.Printf("Error getting feed from db is null %v", url)
|
log.Printf("Error getting feed from db is null %v", url)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
err = conn.WriteMessage(websocket.TextMessage, []byte(feedJSON.(string)))
|
data, err := json.Marshal(cache)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("json marshal failure: %s", err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
err = conn.WriteMessage(websocket.TextMessage, data)
|
||||||
//错误直接关闭更新
|
//错误直接关闭更新
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error sending message or Connection closed: %v", err)
|
log.Printf("Error sending message or Connection closed: %v", err)
|
||||||
@ -111,39 +123,41 @@ func updateFeeds() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func updateFeed(fp *gofeed.Parser, url, formattedTime string) {
|
func updateFeed(fp *gofeed.Parser, url, formattedTime string) {
|
||||||
feed, err := fp.ParseURL(url)
|
result, err := fp.ParseURL(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error fetching feed: %v | %v", url, err)
|
log.Printf("Error fetching feed: %v | %v", url, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
customFeed := feed{
|
||||||
feed.Custom = map[string]string{"lastupdate": formattedTime}
|
Title: result.Title,
|
||||||
|
Link: result.Link,
|
||||||
feedJSON, err := json.Marshal(feed)
|
Custom: map[string]string{"lastupdate": formattedTime},
|
||||||
if err != nil {
|
Items: make([]item, 0, len(result.Items)),
|
||||||
log.Printf("Error marshaling feed: %v", err)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
dbMap.Store(url, string(feedJSON))
|
for _, v := range result.Items {
|
||||||
|
customFeed.Items = append(customFeed.Items, item{
|
||||||
|
Link: v.Link,
|
||||||
|
Title: v.Title,
|
||||||
|
Description: v.Description,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
lock.Lock()
|
||||||
|
defer lock.Unlock()
|
||||||
|
dbMap[url] = customFeed
|
||||||
}
|
}
|
||||||
|
|
||||||
func getFeedsHandler(w http.ResponseWriter, r *http.Request) {
|
func getFeedsHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
feeds := make([]feed, 0, len(rssUrls.Values))
|
||||||
feeds := make([]gofeed.Feed, 0, len(rssUrls.Values))
|
|
||||||
for _, url := range rssUrls.Values {
|
for _, url := range rssUrls.Values {
|
||||||
feedJSON, ok := dbMap.Load(url)
|
lock.RLock()
|
||||||
|
cache, ok := dbMap[url]
|
||||||
|
lock.RUnlock()
|
||||||
if !ok {
|
if !ok {
|
||||||
log.Printf("Error getting feed from db is null %v", url)
|
log.Printf("Error getting feed from db is null %v", url)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
var feed gofeed.Feed
|
feeds = append(feeds, cache)
|
||||||
if err := json.Unmarshal([]byte(feedJSON.(string)), &feed); err != nil {
|
|
||||||
log.Printf("Error unmarshaling feed: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
feeds = append(feeds, feed)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user