[C#] 用ServiceStack读写redis的性能问题

ServiceStack.Redis有个方法叫 AddRangeToList,这个方法是有性能问题的。这个方法的实现代码如下:

public void AddRangeToList(string listId, List<string> values)
{
	var uListId = listId.ToUtf8Bytes();

	var pipeline = CreatePipelineCommand();
	foreach (var value in values)
	{
		pipeline.WriteCommand(Commands.RPush, uListId, value.ToUtf8Bytes());
	}
	pipeline.Flush();

	//the number of items after
	var intResults = pipeline.ReadAllAsInts();
}

这样实际上是把N条数据转换成了N条命令。redis那边要一条一条命令的解析执行,性能会下降很多。

正确的做法是使用批量RPUSH。参见:http://redis.readthedocs.org/en/latest/list/rpush.html

改用批量RPUSH之后,AddRangeToList的性能可以提高一两个数量级。

时间: 2024-10-15 13:21:31

[C#] 用ServiceStack读写redis的性能问题的相关文章

redis在.net架构中的应用(1)--使用servicestack连接redis(转)

引言:作为少有的.net架构下的大型网站,stackoverflow曾发表了一篇文章,介绍了其技术体系,原文链接http://highscalability.com/blog/2011/3/3/stack-overflow-architecture-update-now-at-95-million-page-vi.html.从文中可以看到,该网站运用了redis作为其缓存层.而新浪微博早就已经大量使用redis.作为一个新兴的nosql数据库,redis既解决了memcached持久化的问题,又

Redis 的性能幻想与残酷现实(转)

2011 年,当初选择 Redis 作为主要的内存数据存储,主要吸引我的是它提供多样的基础数据结构可以很方便的实现业务需求.另一方面又比较担心它的性能是否足以支撑,毕竟当时 Redis 还属于比较新的开源产品.但 Redis 官网宣称其是提供多数据结构的高性能存储,我们对其还是抱有幻想的. 幻想 要了解 Redis 的性能,我们先看看官方的基准性能测试数据,心里有个底. 测试前提 Redis version 2.4.2 Using the TCP loopback Payload size =

Java WebService 实现读写Redis数据库

一.准备工作 1.MyEclipse10 2.JDK 1.7.0 3.apache-tomcat-6.0.13 二.创建服务端 1.创建[Web Service Project],命名为[TheService]. 2.创建[Class]类,命名为[ServiceHello],位于[com.wty.service]包下. 3.编写供客户端调用的方法,即编译方法代码. package com.wty.service; import javax.jws.WebService;//包别引用错了 impo

Redis 的性能幻想与残酷现实

Redis 的性能幻想与残酷现实 2011 年,当初选择 Redis 作为主要的内存数据存储,主要吸引我的是它提供多样的基础数据结构可以很方便的实现业务需求.另一方面又比较担心它的性能是否足以支撑,毕竟当时 Redis 还属于比较新的开源产品.但 Redis 官网宣称其是提供多数据结构的高性能存储,我们对其还是抱有幻想的. 幻想 要了解 Redis 的性能,我们先看看官方的基准性能测试数据,心里有个底. 测试前提 Redis version 2.4.2 Using the TCP loopbac

Redis大幅性能提升之Batch批量读写

提示:本文针对的是StackExchange.Redis 一.问题呈现 前段时间在开发的时候,遇到了redis批量读的问题,由于在StackExchange.Redis里面我确实没有找到PipeLine命令,找到的是Batch命令,因此对其用法进行了探究一下. 下面的代码是我之前写的: 1 public List<StudentEntity> Get(List<int> ids) 2 { 3 List<StudentEntity> result = new List&l

redis常见性能问题和解决方案?

Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照. Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度. Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象. 下面是我的一个实际

servicestack操作redis

tatic void Main(string[] args) { var Redis = new RedisClient("127.0.0.1", 6379);//redis服务IP和端口 #region =insert= var storeMembers = new List<string> { "jj", "lihui", "cc" }; storeMembers.ForEach(x => Redis.A

【转】Redis学习---阿里云Redis多线程性能增强版详解

[原文]https://www.toutiao.com/i6594620107123589635/ 摘要 Redis做为高性能的K-V数据库,由于其高性能,丰富的数据结构支持,易用等特性,而得到广泛的应用.但是由于redis单进程单线程的模型限制,单Redis Server QPS最高只能达到10万级别.本文试图通过对Redis做多线程的优化,来达到增强性能的目的. 二.背景 众所周知redis是单进程单线程模型(不完全是单进程单线程,还有若干后端线程主要做刷脏数据,关闭文件描述符等后台清理工作

redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

前段时间在做用户画像的时候,遇到了这样的一个问题,记录某一个商品的用户购买群,刚好这种需求就可以用到Redis中的Set,key作为productID,value 就是具体的customerid集合,后续的话,我就可以通过productid来查看该customerid是否买了此商品,如果购买了,就可以有相关的关联推荐,当然这只是系统中 的一个小业务条件,这时候我就可以用到SADD操作方法,代码如下: static void Main(string[] args) { ConnectionMult