【Go 语言社区】单点redis 持久化在高并发下存在延迟情况
时间:2022-05-04
本文章向大家介绍【Go 语言社区】单点redis 持久化在高并发下存在延迟情况,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
最近的服务器设计中,我本来打算利用redis的持久化来作为内存的配置数据源,简单的说就是不利用内存儿利用redis 提供的API来作为数据的读和写。代码如下:
// 数据的存储
bytetmp, _ := json.Marshal(stPaiHangBang)
_, error := GRedis_Client.Zadd(G_PaiHangKey, float64(iPaiMing), bytetmp)
if error != nil {
Log_Eio.Fmt("GRedis_Client.Zadd: Set data ", error)
Log_Eio.Log("GRedis_Client.Zadd: Set data ", error.Error())
return false
}
return true
以上的只是在redis里面写入数据,在go 频繁的消息调用的情况写入数据并没有出现问题。但是在读取的时候,代码如下:
MapOpenId = make(map[string]*Global_Define.StPaiHangBang)
// 获取内存数据库的数据
Log_Eio.Fmt("GRedis_Client 是否为空:", GRedis_Client)
// 重新链接存储结构
if GRedis_Client == nil {
Redis_ConnFun()
}
// bytesMap, _ := GRedis_Client.Zrevrange(keys, 0, -1)
bytesMap, _ := GRedis_Client.Zrevrange(G_PaiHangKey, 0, -1)
Log_Eio.Fmt("GRedis_Client.Zrevrange return:", bytesMap)
// 1 循环取到数据。
var vcount = 0
//
var CommentInfotmp *Global_Define.StPaiHangBang
for _, score := range bytesMap {
// 如果时间戳大于或者等于member
CommentInfotmp = new(Global_Define.StPaiHangBang)
// 如果时间戳大于或者等于member
if 1 == 1 {
// 临时的 转换
json.Unmarshal(score, CommentInfotmp) // score转换结构体
// 判断数据与自己有关不
vcount++
Log_Eio.Fmt("GRedis_Client.Zrevrange string(score)", string(score))
//test
//json转map
var r Requestbody
r.req = string(score)
if req2map, err := r.Json2map(); err == nil {
// s := fmt.Sprintf("a %s", "string")
// fmt.Println(s)
OpenID := fmt.Sprintf("%s", req2map["OpenID"])
// PaiHang := fmt.Sprintf("%s", req2map["PaiHang"])
// YaoCiShu := fmt.Sprintf("%s", req2map["YaoCiShu"])
// 转换的
CommentInfotmp.OpenID = OpenID
// CommentInfotmp.PaiHang = PaiHang
// CommentInfotmp.YaoCiShu = YaoCiShu
Log_Eio.Fmt("------------------------------------------------")
Log_Eio.Fmt("OpenID", CommentInfotmp.OpenID)
Log_Eio.Fmt("------------------------------------------------")
Log_Eio.Fmt("GRedis_Client.Zrevrange MapOpenId:", CommentInfotmp)
} else {
Log_Eio.Fmt("GRedis_Client.Zrevrange MapOpenId[vcount]:error")
}
// 保存数据
MapOpenId[strconv.Itoa(vcount)] = CommentInfotmp
Log_Eio.Fmt("GRedis_Client.Zrevrange MapOpenId[vcount]:", MapOpenId[strconv.Itoa(vcount)])
}
// return MapOpenId
}
return MapOpenId
以上代码是读取,没有加锁的情况数据出现读取延迟的问题,造成功能设计上的缺陷;但是加了读写锁,消息队列的延迟会出现丢包的的情况。
现在暂时只有更换新的数据结构,采用内存操作,功能一切正常。
总结:单点redis持久化不如内存操作数据流读写的速度快,后期在项目中redis操作在操作不是很频繁的情况可以使用,如果高并发的大数据读写上,尽量选择多点redis的连接池处理。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Libra:一种Python工具,可以用几行代码自动实现机器学习过程
- 国内首个“新基建”安全大赛启动了!
- Kubernetes 中 Informer 的使用
- 嵌入式开发中常见3个的C语言技巧
- 恕我直言,我也是才知道ElasticSearch条件更新是这么玩的
- 有了MinIO,你还会用FastDFS么?
- STP 实验
- 算法集锦(6) |基于GPU框架的tensorflow数据增强算法
- 交换机端口安全实验
- 算法集锦(7)| 实用代码 | Google Colab使用及配置技巧
- 浏览器标签页分屏_不同浏览器同一个tab里面怎么实现分屏?#技能get#
- 微信小程序开发实战(16):交互组件
- Linux常用命令
- 一日一技:使用异或寻找两个孤独的数
- Chrome 85的Referrer-Policy调整对网站分析工具的影响