关于千万甚至亿万数量级别的缓存方面研究!高手请进!!!!
假如我有数千万甚至是上亿的用户数据,我想把用户自增ID和用户名UserName放到缓存里。
我的需求是,当要查询用户的信息时,我想先从缓存里根据用户名UserName获取到用户的ID,
然后再通过ID在数据库里查询用户的信息。
我想当一个用户表达到上亿的数量级别时,用自增ID来查询肯定比用UserName来查询快好多倍,即使UserName做了簇级索引。
我现在的疑问是:
1.做这样的缓存需要什么样配置的服务器,ID为自增ID,UserName最大长度为20.上亿数量级的数据,
一个内存为4G的服务器能支持的了吗?
2.应该怎么样来实现缓存,数据几乎不会变化,但是要频繁的新增数据到缓存里,应该怎么样才能既容易写入缓存又容易从缓存里查询数据,并且这些操作不能耗太大的性能。
我能想到的缓存方案有:
方案1.objCache.Insert(CacheKey, objObject);CacheKey对应的是用户名UserName,objObject对应的是自增ID,通过Cache[UserName]方式来获取自增ID。这样的好处是新增缓存容易,读取缓存数据也很容易。但是问题是,这样新增上亿数量级的缓存性能是否有问题?
方案2.定义一个Hashtable(哈希表)来存放用户名UserName(key)和自增ID(value),然后把Hashtable存到缓存里,当要查询或者新增数据时把Hashtable从缓存里读取出来,然后再对Hashtable进行查询或者新增数据。但是问题是,这样的Hashtable将是一个非常庞大的对象,频繁的从缓存里写入读取,会不会也很好性能呢?况且上亿数量级别的哈希表Hashtable[key]这样读取数据会快吗?
高手们,你们是怎么处理这个问题的呢?一起来探讨一下吧!
[解决办法]
那个还叫做缓存?
相对于上千亿数据,缓存只是几十个数据为单元的一个一个小集合。
假设一个缓存单元里有100个数据,如果其中只有一个数据的后台对应数据改变了,那么你必须尽快销毁这个缓存单元或者必须确保同步到缓存里,否则所谓缓存就在制造肮脏的数据给业务系统。但是在这种最基本的业务前提下,那种所谓缓存还成立吗?可能是成事不足败事有余的缓存了。
[解决办法]
另外,许多时候我们只需要缓存20分钟,即使这些数据的后台对应数据从来不变化,但是只要前台并不需要读取,为什么要让它们占用内存呢?你知道内存空间比硬盘空间贵多少倍吗?
许多时候我们在数据有20分钟没有被反复读取的时候就必须清除缓存单元,并且缓存系统自己应该有多种内部的机制在物理内存达到一定限度时就将一部分最不频繁使用的数据自动的释放掉,然后释放申请的物理内存空间,直到空出足够多的空间为止。System.Web.Caching.Cache就是这样的可以自动释放缓存数据,并且提供现成的多种CacheDependency同时你也可以自定义CacheDependency的框架。
[解决办法]
[解决办法]
个人觉得,大家看问题都有一种教条性: 只有小数据量的,经常用的,就放在缓存中
难道大量的就不能放在所谓的缓存中?如果 有足够的,富余的内存用,且用起来行之有效,何乐而不为?
首先楼主说的只是把 用户名及对应的ID放到内存中,并不是把数据库中用户的全部信息放到内存中.
当用户输入用户名时,首先找到对应的 ID,然后用 select * from tb where id=@id
在数据库中,主键ID唯一性索引/自增ID,查询起来肯定是比 查询起来,效能肯定比查询name来得快得多.
如果楼主服务器有8G内存,如果我能花500M或1G甚至2G空间把这个方案搞成,那有何不行?