gpt4 book ai didi

redis - 我应该如何将 Booksleeve 与 protobuf-net 一起使用?

转载 作者:IT王子 更新时间:2023-10-29 06:00:25 25 4
gpt4 key购买 nike

我使用 RedisConnection Set 方法设置字节数组,但如何获取数据? get 返回一个包装的字节数组?

链接:

这行得通,但感觉不对:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BookSleeve;
using ProtoBuf;
using System.IO;
namespace RedisTest001
{
[ProtoContract, Serializable]
public class Price
{
private string _ticker;
private double _value;

public Price()
{
}

public Price(string ticker, double value)
{
_ticker = ticker;
_value = value;
}


[ProtoMember(1)]
public string Ticker
{
get { return _ticker; }
set { _ticker = value; }
}

[ProtoMember(2)]
public double Value
{
get { return _value; }
set { _value = value; }
}


}

class Program
{
static void Main(string[] args)
{
using (var conn = new RedisConnection("localhost"))
{
Price p = new Price("IBM", 101.55);

byte[] raw;
using (MemoryStream ms = new MemoryStream())
{
Serializer.Serialize<Price>(ms,p);
raw = ms.ToArray();
}

conn.Open();
conn.Set(1, p.Ticker, raw);


var tb = conn.Get(1,"IBM");

var str = conn.Wait(tb);

Price p2 = Serializer.Deserialize<Price>(new MemoryStream(str));

}
}
}
}

更多信息:

public static class pex
{
public static byte[] ToBArray<T>(this T o)
{
using (MemoryStream ms = new MemoryStream())
{
Serializer.Serialize<T>(ms, o);
return ms.ToArray();
}
}
}

class Program
{
static void Main(string[] args)
{
Random RandomClass = new Random();

using (var conn = new RedisConnection("localhost"))
{

conn.Open();

for (int i = 0; i < 500000; i++)
{
Price p = new Price("IBM", RandomClass.Next(0, 1000));
conn.AddToSet(2, "PRICE.IBM", p.ToBArray());
}

最佳答案

完全正确。 “获取”(BookSleeve) 返回延迟的 byte[]。您已正确使用 Wait 来获取实际的 byte[],然后在此 byte[] 上使用 MemoryStream 来调用 Deserialize 通过 protobuf-net。

一切顺利。

如果你把你觉得丑陋的任何步骤说清楚,我可能会更具体,但是:

  • BookSleeve 通过 Task 完全异步,因此需要 WaitContinueWith 来访问 byte[]
  • protobuf-net 完全基于流,因此需要 MemoryStream 位于 byte[]
  • 之上

当然,如果你添加一个通用的实用方法(也许是一个扩展方法)你只需要写一次。

加上一个包装器类(用于某些跟踪/滑动过期)和一个 L1 缓存(Redis 作为 L2),这与我们在 stackoverflow 中使用它的方式非常精确。

请注意:该连接是线程安全的,旨在大规模共享;不要对每个操作都进行连接。

关于redis - 我应该如何将 Booksleeve 与 protobuf-net 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6477623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com