最近接手一个公司的论坛主题数量大概有W回复数有W在线人数左右之前设计论坛的GG采用静态集合来缓存每个版块的主题列表但论坛偶尔会冒出个缓存的bug其中解决了些问题但时不时又会有新的bugms有点野火烧不尽春风吹又生的感觉
所以我也想着手改善一下想了想决定重写个原型出来暂放cnblogs希望大虾们能指点一下迷津
我之前的想法是论坛启动时往Memcached服务器填上大量数据然后Web服务器直接找Cache服务器增删改查 操作再调个Task跑作业来更新数据库但因为种种原因再加种种其它原因所以没有用上Memcached所以只能凑合利用上Web服务器的内存来改善一下数据库的紧张请求
现在没有Cache服务器就用Web服务器的内存吧目前大体思路是这样:
[]论坛初始化获取所有版块ID循环为每个版块装载一定数量的主题到静态的DictionaryList里(这个DL集合是我要实现的东西)
[]实现一个线程池线程池定义了一些参数能定时定量的更新数据库
[]当用户发布一个新主题时将新的主题Id和内容插入到静态DL集合的顶部同时删除DL集合的尾部结点同时将该主题实体插入线程池
[]DL集合需要实现功能如下
获取分页列表
根据主题ID获取主题实体(如果静态缓存找不到则从数据库里找)
发布一个新主题时该主题能插入到DL集合顶端(论坛贴子都是顶上去的)
DL集合需要保持一定数量数据以根据用户操作和实际情况来修改缓存主题数量
未知
DL集合实现
using System;
using SystemCollectionsGeneric;
using SystemText;
namespace PhantaciTest
{
///
/// 原因:
/// List集合有根据索引查找的功能但不支持 keyValue 形式的集合
/// Dictionary支持这种集合但又不支持索引查找所以两者关联起来一起用
///
/// 需求:
/// 我需要一个集合类即能根据集合的索引段来获取实体列表同时又要根据某个实体ID来获取这个实体
/// 当我往集合里插入更新编辑实体时当前操作的实体需要置于集合的顶部同时为了保持实体总数(EntityDictionaryCount)需去除尾部实体
///
/// 应用:
/// 论坛版块列表缓存当用户进入某版块时则从DictionaryList获取一个分页列表
当发表主题时则把新主题置于DictionaryList顶部
/// 同时删除尾部最后一个节以保持最新的固定的实体数量主要作用是缓存版块前几十页频繁更新的列表
///
///
public class DictionaryList<T>
{
///
/// 用于存放所有实体列表集合类 TopicIdEntity
///
private Dictionary<int T> _entityDictionary = new Dictionary<int T>();
//private Object _objLock = new Object();
///
/// 索引主题集合类 用于存放TopicId 与 _entityDictionary关联
///
private List<int> _indexList = new List<int