【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的连接池处理。
- 如何使用Cloudera Manager启用YARN的HA
- 如何使用java代码通过JDBC连接Hive(附github源码)
- 差异分析得到的结果注释一文就够
- 如何使用Cloudera Manager禁用HDFS HA
- 转录组表达数据分析的一些可视化
- 如何使用java代码通过JDBC连接Impala(附Github源码)
- 点击此文,无需转发,即可下载上千个免费R包
- 如何使用Cloudera Manager启用HDFS的HA
- 刷剧不忘学CNN:TF+Keras识别辛普森一家人物 | 教程+代码+数据集
- 深度学习中的基础线代知识-初学者指南
- 如何通过CM升级Kafka0.11及Spark2.2
- MyEtherWallet 手动添加币乎代币(KEY)
- 玩转TensorFlow深度学习
- 如何在CDH实现HDFS透明加密
- 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 数组属性和方法
- python *args,**kwargs参数
- (一)django创建
- PaddleHub提供的ERNIE进行文本分类
- (二)django--带APP的网站
- Spring Boot 自定義 HttpMessageConverter 解決 String 類型返回JSON對象問題
- spring之为级联集合属性进行赋值
- springmvc之HiddenHttpMethodFilter配置使用POST、GET、DELETE、PUT请求
- springmvc之使用@RequestParam绑定请求参数
- hadoop完全分布式之集群分发脚本
- 牛逼!9种方法让你访问Github提速到2MB/s!
- pyhton之如何将类的属性和方法设置成私有类型
- 【colab pytorch】查看gpu、cuda、cudnn信息
- 【colab pytorch】设置随机种子
- (三)django--带Template的网站
- spring之IOC(控制反转)和DI(依赖注入)