使用读写锁来保证数据安全

本文介绍了一个名为RLMap的结构,它利用Go的sync.RWMutex实现读写锁来保证数据的安全。RLMap包含一个字符串到时间的映射,并提供了Set、Get和Delete方法来操作数据。Heartbeat函数接收请求并根据ID更新状态,当状态改变时,通过 Dingding 和 Email 发送通知。SeriousError 函数用于记录错误信息并发送通知。






package initialization


import (


   "time"
   "github.com/gin-gonic/gin"
   "monitor/server/dingding"
   "monitor/server/email"
   "sync"
)


type  RLMap struct{
   Data map[string]time.Time
   sync.RWMutex
}


func (s *RLMap) Set(k string, v time.Time){
   s.Lock()
   s.Data[k] = v
   s.Unlock()
}
func (s *RLMap) Get(k string)(v time.Time, ok bool){
   s.RLock()
   defer s.RUnlock()
   v,ok = s.Data[k]
   return v, ok
}
func (s *RLMap)del(k string)  {
   s.Lock()
   delete(s.Data,k)
   s.Unlock()
}


var    Listenmap = new(RLMap)
var Problemlist = new(RLMap)


//func random() (res string){
// str := "0123456789"
// bytes := []byte(str)
// result := []byte{}
// r := rand.New(rand.NewSource(time.Now().UnixNano()))
// for i := 0; i < 10; i++ {
//    result = append(result, bytes[r.Intn(len(bytes))])
// }
// res = string(result)
// return res
//}


func Heartbeat(c *gin.Context){
   //fmt.Println(c.Request.Header)//map[User-Agent:[Go-http-client/1.1] Accept-Encoding:[gzip]]
   //fmt.Println(c.Request.URL.Path)// /
   //fmt.Println(c.Request.RemoteAddr)//127.0.0.1:50757
   //fmt.Println(c.Request.RequestURI)///?ID=1
   //fmt.Println(c.Request.Host)//127.0.0.1:8888
   //fmt.Println(c.Request.Body)//{}


   ID := c.Query("ID")
   Listenmap.Set(ID, time.Now())
    _,ok := Problemlist.Get(ID)


   if ok {
      Problemlist.del(ID)
      dingding.Dingding(ID + "服务已恢复")
      email.Email(ID + "服务已恢复")
   }


}




func SeriousError(c *gin.Context){
   ID := c.PostForm("ID")
   msg := c.PostForm("msg")
   dingding.Dingding(ID + msg)
   email.Email(ID + msg)
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值