如何给给公司建立网站,如何设计好酒店网站模板,成全视频免费观看在线看第6季高清,网站建设销售开场白前段时间在做用户画像的时候#xff0c;遇到了这样的一个问题#xff0c;记录某一个商品的用户购买群#xff0c;刚好这种需求就可以用到Redis中的Set#xff0c;key作为productID#xff0c;value就是具体的customerid集合#xff0c;后续的话#xff0c;我就可以通过p… 前段时间在做用户画像的时候遇到了这样的一个问题记录某一个商品的用户购买群刚好这种需求就可以用到Redis中的Setkey作为productIDvalue就是具体的customerid集合后续的话我就可以通过productid来查看该customerid是否买了此商品如果购买了就可以有相关的关联推荐当然这只是系统中的一个小业务条件这时候我就可以用到SADD操作方法代码如下static void Main(string[] args){ConnectionMultiplexer redis ConnectionMultiplexer.Connect(192.168.23.151:6379);var db redis.GetDatabase();var productID string.Format(productID_{0}, 1);for (int i 0; i 10; i){var customerID i;db.SetAdd(productID, customerID);}}
一问题但是上面的这段代码很明显存在一个大问题Redis本身就是基于tcp的一个Request/Response protocol模式不信的话可以用wireshark监视一下从图中可以看到有很多次的192.168.23.1 192.168.23.151 之间的数据往返从传输内容中大概也可以看到有一个叫做productid_xxx的前缀那如果有百万次局域网这样的round trip那这个延迟性可想而知肯定达不到我们预想的高性能。二解决方案【Batch】刚好基于我们现有的业务我可以定时的将批量的productid和customerid进行分组整合然后用batch的形式插入到某一个具体的product的set中去接下来我可以把上面的代码改成类似下面这样static void Main(string[] args){ConnectionMultiplexer redis ConnectionMultiplexer.Connect(192.168.23.151:6379);var db redis.GetDatabase();var productID string.Format(productID_{0}, 1);var list new Listint();for (int i 0; i 10; i){list.Add(i);}db.SetAdd(productID, list.Select(i (RedisValue)i).ToArray());}
从截图中传输的request,response可以看到这次我们一次性提交过去极大的较少了在网络传输方面带来的尴尬性。。三再次提出问题product维度的画像我们可以解决了但是我们还有一个customerid的维度也就是说我需要维护一个customerid为key的set集合其中value的值为该customerid的各种平均值比如说“总交易次数”“总交易金额”。。。等等这样的聚合信息然后推送过来的是批量的customerid也就是说你需要定时维护一小嘬set集合在这种情况下某一个set的批量操作就搞不定了。。。原始代码如下static void Main(string[] args){ConnectionMultiplexer redis ConnectionMultiplexer.Connect(192.168.23.151:6379);var db redis.GetDatabase();//批量过来的数据customeridlist ordertotalprice具体业务逻辑省略var orderTotalPrice 100;var customerIDList new Listint();for (int i 0; i 10; i){customerIDList.Add(i);}//foreach更新每个redis 的set集合foreach (var item in customerIDList){var customerID string.Format(customerid_{0}, item);db.SetAdd(customerID, orderTotalPrice);}}
四解决方案【PipeLine】上面这种代码在生产上当然是行不通的不过针对这种问题redis早已经提出了相关的解决方案那就是pipeline机制原理还是一样将命令集整合起来通过一条request请求一起送过去由redis内部fake出一个client做批量执行操作代码如下static void Main(string[] args){ConnectionMultiplexer redis ConnectionMultiplexer.Connect(192.168.23.151:6379);var db redis.GetDatabase();//批量过来的数据customeridlist ordertotalprice具体业务逻辑省略var orderTotalPrice 100;var customerIDList new Listint();for (int i 0; i 10; i){customerIDList.Add(i);}var batch db.CreateBatch();foreach (var item in customerIDList){var customerID string.Format(customerid_{0}, item);batch.SetAddAsync(customerID, orderTotalPrice);}batch.Execute();}
然后我们再看下面的wireshark截图可以看到有很多的SADD这样的小命令这就说明有很多命令是一起过去的大大的提升了性能。最后可以再看一下redis数据也是有的是不是很爽~~~
192.168.23.151:6379 keys *1) customerid_02) customerid_93) customerid_14) customerid_35) customerid_86) customerid_27) customerid_78) customerid_59) customerid_6
10) customerid_4
好了先就说到这里了希望本篇对你有帮助。