作为开发人员,您一定在某个时候努力加速客户端和服务器之间的通信。 网络开销、延迟和延迟一直是主要问题,而这一切都归结为一个问题—— 我们如何加快请求速度? 随着时间的推移,我们找到了大量的解决方案,但我们在这里关注的答案是压缩和紧凑序列化。 算你走运, NCache 提供有效的压缩和动态紧凑序列化技术(仅供参考,它们是不同的东西)。 在此博客中,我们将看到两者的需求以及如何使用它们。
动态压缩序列化
NCache 提供对本机 .NET 序列化格式的支持,但是,它还提供了自己的序列化框架,称为 紧凑序列化. 紧凑序列化也是二进制序列化,但 NCache 这个序列化框架提供了更多的灵活性。 紧凑序列化不会减少整个数据的大小,它只会减少通过网络传输的数据的大小。 它可以帮助您实现更好的功能,因为网络旅行更快并且成本降低。
现在让我们看看动态紧凑序列化的好处以及它如何比原生 .NET 序列化更灵活:
紧凑的数据大小
In NCache, 二进制序列化数据大小紧凑。 序列化后,这些对象有时会比其实际数据大小小十倍。 尺寸越小,数据在网络上传输的速度越快,从而提高性能。 此外,当数据更紧凑时,它在缓存服务器上占用的空间更少,从而也提高了内存效率。
无需更改代码
为了使您的数据紧凑序列化,不需要更改代码。 您所要做的就是使用管理工具选择可序列化的数据(NCache 网页管理器或 NCache PowerShell 工具)。 NCache 在内部处理数据的所有序列化,因此不需要更改代码。
选择性序列化
选择性序列化意味着用户可以完全控制哪些数据需要序列化,哪些数据需要标记为非序列化。 在一个类中,您可以选择要序列化的属性,例如,假设您希望将数据库连接对象保持为非序列化。 您可以简单地序列化其他属性并使所需的数据保持非序列化。
为了对要序列化的数据进行细粒度控制,实现了 ICompactSerializable 接口。 这使您可以对数据和选择性序列化进行主要控制。 自定义类需要由调用的序列化/反序列化方法 NCache 序列化/反序列化对象。 查看下面的代码示例,了解 ICompactSerializable 接口是如何实现的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public class Customers : ICompactSerializable { private string _name; private int _id; private string _company; public Customers() { } public Customers(string customerName, int customerID, string companyName) { _name = customerName; _id = customerID; _company = companyName; } #region ICompactSerializable Members public void Deserialize(CompactReader reader) { _name = reader.ReadObject() as string; _id = reader.ReadInt32(); _company = reader.ReadObject() as string; } public void Serialize(CompactWriter writer){ writer.WriteObject(_name); writer.Write(_id); writer.Write(_company); } #endregion } |
NCache 还允许注册通用类以进行紧凑序列化。 有两种注册泛型类的方法,即通过 NCache Web Manager 或通过 IGenericTypeProvider 接口。
步骤1: 通过 NCache 网络管理员
您可以使用注册泛型类 NCache 网页管理器如下图:
第 2 步:通过 IGenericTypeProvider
要实现这一点,用户需要实现 GetGenericTypes 方法并将所需的泛型类型作为数组返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class CustomerPurchaseDetails<T, K, V> { // implement logic } public class CustomerPurchaseImpl : IGenericTypeProvider { Type[] types = new Type[6]; Type[] IGenericTypeProvider.GetGenericTypes() { types[0] = typeof(Dictionary<string, Customer>); types[1] = typeof(List); types[2] = typeof(CustomerPurchaseDetails<Order, Product, Customer>); types[3] = typeof(CustomerPurchaseDetails<Order, Product, int>); types[4] = typeof(CustomerPurchaseDetails<Order, string, byte>); types[5] = typeof(CustomerPurchaseDetails<string, Customer, bool>); return types; } public bool CheckIfSerializable(Type type, FieldInfo fieldInfo) { // implement logic } } |
在此之后,将此类程序集部署到 NCache 网络管理器。 NCache Web Manager 将注册类型数组中填充的所有类型。
压缩
另一种有效的技术由 NCache is 数据压缩 其中压缩形式的数据被添加到缓存中。 最大的优势是压缩后的数据比未压缩的数据占用的空间更小,为你节省了大量的内存。 它降低了读/写操作的网络成本。 因此,您只需使用压缩即可有效节省网络成本、时间和内存。
NCache 使用 GZip 压缩来压缩数据。 您决定某个阈值,对于启用的压缩,所有超过阈值的项目都会被压缩。 我们比较了压缩和未压缩的数据以及各自的内存使用情况。 您可以在下图中看到结果。 蓝线显示压缩数据的内存消耗,橙色线显示未压缩数据的缓存大小:
压缩通常发生在客户端和服务器端,前提是启用了压缩 都 服务器端和客户端。
- 客户端压缩 应用于客户端从服务器请求的所有项目。 服务器压缩数据并将其发送给客户端,客户端在接收到压缩数据时对其进行解压缩。 同样,对于客户端发送到远程服务器的超过阈值的项目,数据以压缩形式发送。
- 服务器端压缩 所有超过阈值的项目都会发生,并由缓存启动加载器等服务器端功能从数据源加载。 然后将这些项目压缩为 NCache 服务器从数据源接收到它们后。
为了使用压缩,您所要做的就是启用压缩,有两种有效的方法可以做到这一点。
方法一:使用 NCahe Web Manager
下面的 gif 向您展示了如何使用 NCache 网站管理员:
方法二:使用配置
一个配置文件安装在 NCache 安装目录,命名为 配置文件 包含一个为您启用和禁用压缩的标签。 让我来告诉你怎么做:
1 |
<compression enabled="true" threshold="500kb"/> |
启用标签设置为 true 以启用压缩,如果您想禁用压缩,则设置为 false。 它还为您提供阈值标签,并且仅压缩高于所提供值的数据。
结论
总之,压缩和紧凑序列化是提高应用程序性能的非常有效的技术。 使用这些功能也很容易启用 NCache 管理工具。 NCache 无需更改代码即可帮助您实现所有这些。 请参阅 NCache 查看其他酷炫的文档 NCache 功能。