博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
更高效地提高redis client多线程操作的并发吞吐设计
阅读量:5889 次
发布时间:2019-06-19

本文共 1505 字,大约阅读时间需要 5 分钟。

Redis是一个非常高效的基于内存的NOSQL数据库,它提供非常高效的数据读写效能.在实际应用中往往是带宽和CLIENT库读写损耗过高导致无法更好地发挥出Redis更出色的能力.下面结合一些redis本身的特性和一些client操作上的改变来提高整个redis操作的交通.

        上图是反映平常操作redis的情况,每个线程都独立的发起相应连接对redis的网络读写.虽然我们可以通过批操作的方式来把当前多个操作合并成一个,但这种方式只能针对当单线程,而多线程相互合并则设计上很少关注.从redis的协议来说其实并没有限制,只是在client库的设计一般没有考虑进去.

        如果在多线程操作REDIS的同时如果能够合并网络操作,那意味着可以降低操作网络读写的情况把处理能力提升到最大化.这样Client总体的性能都会有所提升,而REDIS也因表层的网络读取减少而达到更好的利用率.

        以上是设计图,原理并不复杂,其实就是把每个请求的操作放到一个队列中,后面开启一个线程来把前面的指令进行一个合并操操作.一个线程在高并发下可以无法更快速地合并起来,可以根据需要进行合理的操作线程应用.

        这种设计的效果是否真的比较理想呢,以一上是一个简单的测试

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public 
void 
AnycSet()
{
 
    
CodeTimer.Time(
"beetle.redis asynset"
, () =>
    
{
        
Parallel.For(0, Count, x =>
        
{
            
ProtobufKey key = x.ToString();
            
key.AsynSet(
new 
User() { UserId = x, NickName =
"sdffffffffffffffffffffffffffffffffffffffffsdffffffffffffffffffffffffffffffffffffffffbeetlesdffffffffffffffffffffffffffffffffffffffffsdffffffffffffffffffffffffffffffffffffffff" 
+ x });
 
        
});
    
});
}
public 
void 
Set()
{
 
    
CodeTimer.Time(
"beetle.redis set"
, () =>
    
{
        
Parallel.For(0, Count, x =>
        
{
            
ProtobufKey key = x.ToString();
            
key.Set(
new 
User() { UserId = x, NickName =
"sdffffffffffffffffffffffffffffffffffffffffsdffffffffffffffffffffffffffffffffffffffffbeetlesdffffffffffffffffffffffffffffffffffffffffsdffffffffffffffffffffffffffffffffffffffff" 
+ x });
 
        
});
    
});
}

 

 

        测试结果如下

        

        以上是10W次的操作测试结果,由于redis在本机所以交互非常可观.

        虽然在多线程高并发下这样的设计可以把吞吐能力和效能有一个非常不错的效果,但其也存在缺陷因为每次操作都经过不同线程的调处理,如果并发线程不多操作密集度不高.那效果并不理想;因为网络操作密集度不高,可得到并合的数量不多,这方面的损耗有可能低于操作跨线程调度所带来的损耗.

转载地址:http://fkwsx.baihongyu.com/

你可能感兴趣的文章
AD提高动态的方法(附SNR计算)
查看>>
[转]轻松实现可伸缩性,容错性,和负载平衡的大规模多人在线系统
查看>>
五 数组
查看>>
也谈跨域数据交互解决方案
查看>>
EntityFramework中使用Include可能带来的问题
查看>>
面试题28:字符串的排列
查看>>
css important
查看>>
WPF 实现窗体拖动
查看>>
NULL不是数值
查看>>
css绘制几何图形
查看>>
结合kmp算法的匹配动画浅析其基本思想
查看>>
Android网络编程11之源码解析Retrofit
查看>>
安全预警:全球13.5亿的ARRIS有线调制解调器可被远程攻击
查看>>
麦子学院与阿里云战略合作 在线教育领军者技术实力被认可
查看>>
正确看待大数据
查看>>
Facebook通过10亿单词构建有效的神经网络语言模型
查看>>
发展大数据不能抛弃“小数据”
查看>>
中了WannaCry病毒的电脑几乎都是Win 7
查看>>
学生机房虚拟化(九)系统操作设计思路
查看>>
nginx报错pread() returned only 0 bytes instead of 4091的分析
查看>>