zoukankan      html  css  js  c++  java
  • [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;
    }
    




  • 相关阅读:
    XSD限定/Facets
    XSD元素替换(Element Substitution)
    XSD指示器
    乔布斯29年前的预言
    三年程序员生涯的感悟、总结和憧憬
    用Jetty快速开发J2EE应用
    Cygwin安装
    Maven依赖继承的写法
    Struts2自定义日期转换器
    Struts2三种数据转移方式
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330322.html
Copyright © 2011-2022 走看看