如何保持缓存的一致性

一:系统中对谁进行了缓存

在当前的系统中,在全部的 控制器 中,涉及到了用户,会存在一个 User2.GetCurrentSession() 方法,如下:

public static User2 GetCurrentSession()
{
    User2 user = RepRegistory
        .Session[CookieWrapper.GetCookie(YHBJ.Model.MagicNumbers.SystemValues.CookieName, "Id")]
        as User2;
    if (user == null)
    {
        user = new User2()
        {
            // 从 cookie 构筑用户
        };

if (!string.IsNullOrEmpty(user.Id))
        {
            RepRegistory.Session[user.Id] = user;
        }
    }

return user;
}

可以看到,以用户为最小单位,进行了缓存,同时,用户涉及到的全部信息也被缓存了,如,用户的专业。这样,问题就来了,比如:

系统中专业进行了修改,就需要同步更新所有用户的专业;

那么,实际上,为了简便期间,目前,就是把该用户的缓存整个进行清楚就可以了。重新构建缓存,在该用户登录的时候,会自动创建。

二:保持缓存的一致性具体做法

1:首先,从控制器入手,查看控制器方法中,涉及到修改、添加、删除的方法,如果是系统级别的数据,进行如上操作后,需要调用 User2.ClearSessionAll() 方法。

2:如果是对单个用户数据的修改、添加和删除,则需要分为两个情况来处理,

2.1 非 User2 入手的方法(即重构前的方法),需要调用 User2.ClearSession(userId) 来清除缓存;

2.2 如果控制调用的是 User2 的方法,则不需要进行任何处理,因为 User2 类型已经保证了内存和数据库中的数据是一致的;

三:什么时候该集中构建缓存

1:评审考试前

2:考试前

以上两者,在监考模块,添加功能,构建缓存,一旦构建缓存,得到该考试的全部人员,然后将人员的缓存建立起来。

如何保持缓存的一致性,布布扣,bubuko.com

时间: 2024-12-26 09:17:55

如何保持缓存的一致性的相关文章

分布式缓存的一致性hash算法

基本场景 比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到 N 个 cache : 常规取余的hash算法 hash(key) % N 对于N台缓存服务器构成的集群缓存,依次编号为0 - (N-1)先对要存储的key进行hash取值,然后用hash值对N取余,得到一个在缓存服务器编号区间的一个数字,则将当前key存到这台服务器

缓存与一致性哈希

1.系统演化 Step 1.应用程序.数据库.文件等所有资源都在一台服务器上 图1: 网站最开始没有太多人访问,只需要一台服务器绰绰有余,如图1,这时应用程序.数据库.文件等所有的资源都在一台服务器上.通常是Linux+Apache+MySQL+PHP架构. Step 2.应用服务和数据服务分离 图2: 随着网站业务的发展,一台服务器逐渐不能满足需求:越来越多的用户访问导致性能越来越差,越来越多的数据导致存储空间不足.这是就需要将应用和数据分离.应用和数据分离后整个网站使用三台服务器:应用服务器

分布式缓存数据库一致性问题

缓存和数据库一致性问题,有很多解决方案,没有最完美的方案,只有适合自身业务的尽可能完美的方案. 缓存由于其高并发和高性能的特征,已经在项目中被广泛应用. 查询时一般先查询缓存,如果缓存命中的话,那么直接将数据返回. 如果缓存中没有数据(如失效,或者根本没设置数据),那么,应用程序先从数据库中查询数据,如果不为空,则将数据放在缓存中. 那么更新时,怎么处理缓存和数据库呢?先更新数据库后更新缓存?先更新数据库后更新缓存?或者先淘汰缓存后更新数据库? 为什么没有先更新缓存后更新数据库? 1):如果更新

实现缓存最终一致性的两种方案

一.重客户端 写入缓存: 应用同时更新数据库和缓存 如果数据库更新成功,则开始更新缓存,否则如果数据库更新失败,则整个更新过程失败. 判断更新缓存是否成功,如果成功则返回 如果缓存没有更新成功,则将数据发到MQ中 应用监控MQ通道,收到消息后继续更新Redis. 问题点:如果更新Redis失败,同时在将数据发到MQ之前的时间,应用重启了,这时候MQ就没有需要更新的数据,如果Redis对所有数据没有设置过期时间,同时在读多写少的场景下,只能通过人工介入来更新缓存. 读缓存: 如何来解决这个问题?那

缓存与数据库一致性保证

本文主要讨论这么几个问题: (1)啥时候数据库和缓存中的数据会不一致 (2)不一致优化思路 (3)如何保证数据库与缓存的一致性 一.需求缘起 上一篇<缓存架构设计细节二三事>引起了广泛的讨论,其中有一个结论:当数据发生变化时,"先淘汰缓存,再修改数据库"这个点是大家讨论的最多的. 上篇文章得出这个结论的依据是,由于操作缓存与操作数据库不是原子的,非常有可能出现执行失败. 假设先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓存失败,则会出现DB中是新数据,Cach

数据库和缓存一致性的问题

[云时代的技术博客][http://cloudate.net/?p=379] 2015/01/13  |  DB,Memcache,并发和多线程 |  罗伯特 有一个key/value存储在数据库中,但是缓存在memcache中,对这个key/value有高并发的查询和更新操作,怎么保证数据库和缓存的一致性呢? 方案1 – 更新数据库时失效缓存 when updateDb(key) invalideCache(key) when query(key) updateCache(key) 问题: 查

缓存与数据库一致性保证(转)

本文主要讨论这么几个问题: (1)啥时候数据库和缓存中的数据会不一致 (2)不一致优化思路 (3)如何保证数据库与缓存的一致性 一.需求缘起 上一篇<缓存架构设计细节二三事>(点击查看)引起了广泛的讨论,其中有一个结论:当数据发生变化时,"先淘汰缓存,再修改数据库"这个点是大家讨论的最多的. 上篇文章得出这个结论的依据是,由于操作缓存与操作数据库不是原子的,非常有可能出现执行失败. 假设先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓存失败,则会出现DB中是新数

zt:缓存一致性(Cache Coherency)入门 cach coherency

http://www.infoq.com/cn/articles/cache-coherency-primer http://www.cnblogs.com/xybaby/p/6641928.html 本文是RAD Game Tools程序员Fabian “ryg” Giesen在其博客上发表的<Cache coherency primer>一文的翻译,经作者许可分享至InfoQ中文站.该系列共有两篇,本文系第一篇. 我计划写一些关于多核场景下数据组织的文章.写了第一篇,但我很快意识到有大量的

分布式理论(4):Leases 一种解决分布式缓存一致性的高效容错机制(转)

作者:Cary G.Gray and David R. Cheriton 1989 译者:[email protected] 2011-5-7 出处:http://duanple.blog.163.com/blog/static/70971767201141111440789/ [ 序:所谓租约(leases),其实就是一个合同,即服务端给予客户端在一定期限内可以控制修改操作的权力.如果服务端要修改数据,首先要征求拥有这块数据的租约的客户端的同意,之后才可以修改.客户端从服务端读取数据时往往就同