我正在开发一个使用 NCache 的现有系统。它是一个具有大量缓存需求的分布式系统,所以毫无疑问,缓存是正确的答案,但是......
出于某种原因,在现有代码中,所有缓存键在存储到缓存之前都经过哈希处理。
我的论点是我们不应该散列密钥,因为缓存库可能有一些超级优化的方式来存储它的字典和散列所有内容意味着如果我们这样做实际上可能会减慢查找速度。
最初编写代码的人已经离开了,密钥为什么被缓存的知识也丢失了。
任何人都可以建议散列是否是正确的做法,还是应该将其删除。
您是否应该或不应该散列密钥取决于您的系统要求。
NCache 通过它的键来识别对象,并认为具有相同键的对象是相等的。下面是来自维基百科的哈希函数的定义:
散列函数是可用于将任意大小的数据映射到固定大小的数据的任何函数。
如果您停止哈希键,则缓存的行为可能会有所不同。例如,一些 NCache 认为相等的对象,现在 NCache 可能认为不相等。而不是一个缓存条目,您将获得两个。
NCache 不需要您对键进行哈希处理。NCache 键只是每个对象唯一的字符串。NCache 4.6 Programmer's Guide 的相关摘录:
NCache 对对象使用“键”和“值”结构。每个对象都必须有一个与之关联的唯一字符串键。每个键在缓存中都有一个原子出现,无论它是本地的还是集群的。缓存键本质上是区分大小写的,如果您尝试添加另一个具有相同值的键,缓存会抛出 OperationFailedException。
好的,所以你的问题是
好吧,缓存 API 可以strings
作为keys
. 在后台,NCache 会根据这些键自动生成哈希,这有助于识别对象应该存储在哪里。我的意思是在哪个节点。
当您说您的应用程序在将其交给 NCahe 之前对密钥进行哈希处理时,这很简单,是一个不必要的步骤。NCache API 旨在让您摆脱这种头痛。
但是,如果这些哈希是由于您的应用程序中的某些内部逻辑而生成的,那么这是另一种情况。请仔细检查。
不用说,如果您一次又一次地做某事,那么它肯定会降低性能。您提供的哈希字符串将再次用于生成另一个哈希值 (int)。