使用管道和批量操作redis性能增强的详细解决方案

使用管道和批量操作redis性能增强的详细解决方案
前一段时间,当用户画像,遇到这样的问题,一个商品采购组的记录,只是这种需求可以使用redis,集,重点为ProductID,价值的CustomerID的收集,跟进,我可以为是否购买CustomerID这个产品,如果购买,可以有相关的协会的推荐,当然这只是一个小企业,然后我可以用操作竞赛方法,代码如下:
static void main(String { } args)
{
connectionmultiplexer redis = connectionmultiplexer。连接(192.168.23.151:6379 );

var db = redis.getdatabase();

VaR ProductID =字符串格式(productid_ { 0 }

对于(int = i 0;i < 10;i + +)
{
VaR CustomerID =我;

Db.SetAdd(ID,ID);
}
}
第一:问题

但是很明显,上面的代码有一个大问题。redis本身是一个请求/响应的基于TCP协议的方式。如果你不相信,你可以使用Wireshark监测。
从图中可以看出,很多时候192.168.23.1 = > 192.168.23.151之间的数据传输,从返回的内容,或许还可以看到一个叫productid_xxx前缀,

如果有数百万个局域网的往返,预计将被推迟,它肯定不会达到我们预期的高性能

二:解决方案{批}

正是基于我们现有的业务,我可以将定期批量ProductID和ID,然后插入到一个特定的产品组批,然后我可以把上面的代码变成这样。
static void main(String { } args)
{
connectionmultiplexer redis = connectionmultiplexer。连接(…:);

var db = redis.getdatabase();

VaR ProductID =字符串格式(productid_ {} );

var列表=新列表();
对于(int i;;i;<;+ +)
{
列表(添加);
}

Db.SetAdd(ProductID、列表。选择(我=(redisvalue)(我)。toArray));
}

截图、请求和响应可以看出,这次我们以单一的方式提交了过去,大大减少了网络传输带来的尴尬。

三:再次提出问题。

产品尺寸图我们可以解决的,但我们仍CustomerID维度,也就是说我需要保持的关键CustomerID集合,对CustomerID,平均值为值,总交易数的汇总信息,在这样的总交易金额,然后…Push-over CustomerID的大头,也就是说你需要保持一个SIP设定的定时设置,在这种情况下,一组间歇操作不定…原代码如下:
static void main(String { } args)
{
connectionmultiplexer redis = connectionmultiplexer。连接(…:);

var db = redis.getdatabase();
/ /批量数据customeridlist,ordertotalprice,具体的业务逻辑略
无功ordertotalprice =;

无功customeridlist =新的列表();

对于(int i;;i;<;+ +)
{
customeridlist添加(我);
}

/ /每集每集更新Redis
foreach(在customeridlist var item)
{
VaR CustomerID =字符串格式(customerid_ {}

Db.SetAdd(CustomerID,ordertotalprice);
}
}
四:解决方案{管道}

当然,生产上述代码=是不可行的,但为了解决这个问题,使用已经提出了相关的解决方案,即管道机制,原理是一样的,命令集在一起在过去通过发送一个请求的请求,通过使用假客户做批处理执行的操作。以下代码:
static void main(String { } args)
{
connectionmultiplexer redis = connectionmultiplexer。连接(…:);

var db = redis.getdatabase();
/ /批量数据customeridlist,ordertotalprice,具体的业务逻辑略
无功ordertotalprice =;

无功customeridlist =新的列表();

对于(int i;;i;<;+ +)
{
customeridlist添加(我);
}

VaR批量= db.createbatch();

foreach(在customeridlist var item)
{
VaR CustomerID =字符串格式(customerid_ {}

Batch.SetAddAsync(CustomerID,ordertotalprice);
}

批处理执行();
}
接下来,让我们看一看下面的wireshark截图。我们可以看到,有许多小的命令如萨德,这意味着许多命令一起传递,大大提高了性能。
最后,你可以再看看redis,数据也有,是不是很酷~ ~ ~
192.168.23.151:6379 > *键
1)customerid_0
2)customerid_9
3)customerid_1
4)customerid_3
5)customerid_8
6)customerid_2
7)customerid_7
8)customerid_5
9)customerid_6
10)customerid_4
以上是本文的全部内容,希望能对您有所帮助,希望大家多多支持
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部