[C#] ServiceStack.Redis如何批量的pop数据?

要安全的批量pop数据,有两个办法:

1、用事务(不用事务的话可能导致重复读。ServiceStack的pipeline是没有自带事务的。)

2、执行lua脚本

我这里提供用事务的实现方法:

public static string ReadLine(RedisNativeClient cln)
{
	MethodInfo mi = cln.GetType().GetMethod("ReadLine", BindingFlags.NonPublic | BindingFlags.Instance);
	string ret = (string)mi.Invoke(cln, new object[] { });
	return ret;
}

public static List<string> BatchDequeue(RedisNativeClient cln, string listID, int max_count)
{
	List<string> ret = new List<string>();

	var uListId = Encoding.UTF8.GetBytes(listID);
	var pipeline = cln.CreatePipelineCommand();
	pipeline.WriteCommand(Commands.Multi);
	pipeline.WriteCommand(Commands.LRange, uListId, Encoding.UTF8.GetBytes("0"), Encoding.UTF8.GetBytes((max_count - 1).ToString()));
	pipeline.WriteCommand(Commands.LTrim, uListId, Encoding.UTF8.GetBytes(max_count.ToString()), Encoding.UTF8.GetBytes("-1"));
	pipeline.WriteCommand(Commands.Exec);
	pipeline.Flush();

	var a1 = ReadLine(cln);		//忽略Multi的OK
	var a2 = ReadLine(cln);		//忽略LRANGE的QUEUED
	var a3 = ReadLine(cln);		//忽略LTRIM的QUEUED
	var a4 = ReadLine(cln);		//忽略*2
	var b = cln.ReceiveMessages();
	foreach (var item in b)
	{
		string ss = Encoding.UTF8.GetString(item);
		ret.Add(ss);
	}
	ReadLine(cln);		//忽略EXEC的OK

	return ret;
}
时间: 2024-10-14 11:38:19

[C#] ServiceStack.Redis如何批量的pop数据?的相关文章

StackExchange.Redis 管道 批量 高性能插入数据

现在用redis来做数据缓存的越来越多了,很多项目都有初始化redis数据的过程,由于初始化的数据比较大,那么该过程越快越好.这里我们以HashSet方法为例, 这里我们推荐用HashEntry[] hashFields方法传入多个fields,应为它发送的HMSET指令即批量插入数据,另一个方法发送的HSET指令. 在阅读StackExchange.Redis里面我确实没有找到pipe指令,后来发现该指令的实现是:通过CreateBatch方法实现的.源码的单元测试例子是: using Sys

redis pipe 批量导入数据

redis pipe 批量导入数据 速度非常快, 文本需要支持redis的协议, 使用Python生成文件 代码如下 delimiter = "\r\n" data = "*3" + delimiter + "$3" + delimiter + "set" + delimiter + "$" + str(len(row[0])) + delimiter + row[0] + delimiter + &quo

ServiceStack.Redis 数据操作

简单的字符串类型数据写. Poco在redis中会被序列化成Json字符串. 1 using (var redis = new RedisClient(connString)) 2 { 3 if (redis.Db != 7) 4 ((RedisClient)redis).ChangeDb(7); 5 6 var client = redis.As<Poco>(); 7 var list = new List<Poco>(); 8 9 foreach(var key in keys

用C#封装的ServiceStack.redis操作类

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ServiceStack.Redis; namespace TestRedis { class RedisHelper:IDisposable { /*[email protected] All Rights Reserved * Author:Mars

ServiceStack.Redis之IRedisClient&lt;第三篇&gt;

事实上,IRedisClient里面的很多方法,其实就是Redis的命令名.只要对Redis的命令熟悉一点就能够非常快速地理解和掌握这些方法,趁着现在对Redis不是特别了解,我也对着命令来了解一下这些方法. 一.属性 IRedisClient的属性如下: 属性 说明 ConnectTimeout  连接超时 Db 当前数据库的ID或下标 DbSize  当前数据库的 key 的数量 HadExceptions    Hashes  存储复杂对象,一个value中有几个field  Host 

ServiceStack.Redis 请求次数6000次异常

Redis是一个非常NB的内存级的数据库,我们可以把很多”热数据“(即读写非常多的数据)放入其中来操作,这样就减少了和关系型数据库(如SqlServer/My Sql等)之间的交互,程序的响应速度也大大提升. C#利用ServiceStack.Redis来操作Redis,它是Redis官方推荐的C#客户端,性能非常优越,使用也很方便. ServiceStack.LicenseException: The free-quota limit on '6000 Redis requests per h

.Net使用Redis详解之ServiceStack.Redis

序言 本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现,其中会对list的阻塞功能和事务的运用做二个案例,进行记录学习. Redis官方推荐的.NET驱动类库为Service.Stack.Redis.然而网上对这个类库的中文文档不是很全面与合理,这篇文章主要就对这个类库做注释展现.不足遗漏之处还望见谅,海涵. .Net使用Redis是非常方便与快捷与简单的,下面就让我展示下吧. 这里有必要说一下,如果你对Redis 中的基本对

ServiceStack.Redis 使用过程中碰到的两个问题

Redis是一个非常NB的内存级的数据库,我们可以把很多"热数据"(即读写非常多的数据)放入其中来操作,这样就减少了和关系型数据库(如SqlServer/My Sql等)之间的交互,程序的响应速度也大大提升. C#利用ServiceStack.Redis来操作Redis,它是Redis官方推荐的C#客户端,性能非常优越,使用也很方便,但是我最近在使用这个工具的时候碰到两个问题: 1.每小时只能访问Redis 6000次 2.用  GetById  方法获取不到对象. 第一个问题一开始本

基于ServiceStack.Redis上对REDIS访问的再次封装

概述 RedisOpLib.dll 是基于ServiceStack.Redis上对Redis操作的再一次封装,引用此类之后对REDIS操作变的很简单 2.组成 a. RedisOpLib.dll 封装的主文件 b. Redis.config   默认的配置文件,还可以随意增加如 RedisA.config,RedisB.config,此配置文件结构如下: <configuration>  <AutoStart>YES</AutoStart>  <IdleTimeO