高并发之config

news/2024/6/15 13:04:50 标签: 数据库

对于config的读取,再熟悉不过了,通常的写法如下:

//1. read from cache
string configvalue = GetFromCache(configKey);
if(!configValue.IsNullOrEmpty()){
    return configValue;
}

//2. read from db
configValue = GetFromDb(configKey);
if(configValue.IsNullOrEmpty()){
    // set to cache 30s
    retrun config;
}

 

这种写法在普通的场景下,完全是可行的 先从cache中读,再从db中读取,设置30s缓存时间

但当遇到高并发的场景下: 即如果瞬时有10000个或更多的请求,来读取这个config,恰巧碰到,30s过期的临界值。此时全部的请求压力就会转向db,缓存就会miss。

这里有个概念:

滑动过期 :即config 从本地内存中读取,同时开启一个定时器,定时从cache中同步config到本地内存中

public class ConfigFacade
    {
        private const int FRESHEN_INTERVAL = 30 * 1000;
        private static readonly ConcurrentDictionary<string, string> localCache = new ConcurrentDictionary<string, string>();
        private static Timer _timer;
        static ConfigFacade()
        {
            Console.WriteLine("timer start ...");
            _timer = new Timer(state => LoadConfig(), null, FRESHEN_INTERVAL, FRESHEN_INTERVAL);
        }

        private static void LoadConfig()
        {
            //sync configvalue to localcache
            foreach (var key in localCache.Keys)
            {
                var configValue = GetConfigFromClient(key);
                var tryUpdateValue = localCache.TryUpdate(key, configValue, localCache[key]);
                Console.WriteLine("now : {0}", DateTime.Now);
                Console.WriteLine("update key :{0} , {1}", key, tryUpdateValue);
            }
        }

        public static string GetConfig(string key)
        {
            string value;
            if (localCache != null && localCache.Count > 0 && localCache.ContainsKey(key))
            {
                var tryGetValue = localCache.TryGetValue(key, out value);
                if (tryGetValue)
                {
                    return value;
                }
            }

            value = GetConfigFromClient(key);
            localCache.TryAdd(key, value);
            return value;
        }

        private static string GetConfigFromClient(string key)
        {
            // 1. from redis 
            // 2. from db 
            Console.WriteLine("key => {0} ,get value form client", key);
            return string.Format("{0}_value", key);
        }
    }

 

优点

  1. 每次并发的读取都能保证是读取本地内存,定时器会定时的去同步缓存到本地内存
  2. 这种处理问题的思路 类似于将config 放到一个池子里,永远保证这个池子里有值

转载于:https://www.cnblogs.com/hdtechnology/p/8732671.html


http://www.niftyadmin.cn/n/1805572.html

相关文章

web容器、中间件以及web服务器的区别

一、web容器 1.web容器的介绍 web容器是一种服务程序&#xff0c;在服务器一个端口就有一个提供相应服务的程序&#xff0c;而这个程序就是处理从客户端发出的请求。实际上&#xff0c;Web容器是一种服务程序&#xff0c;给处于其中的应用程序组件提供环境&#xff0c;使其直接…

渗透测试技术----常见web漏洞--命令执行原理及防御

一、命令执行漏洞介绍 1.命令执行漏洞简介 命令执行漏洞时指服务器没有对执行的命令进行过滤&#xff0c;用户可以随意执行系统命令&#xff0c;命令执行漏洞属于高危漏洞之一&#xff0c;也属于代码执行的范围内。 2.命令执行漏洞的原理 应用程序有时需要调用一些执行系统命令…

渗透测试技术----常见web漏洞--暴力破解原理及防御

一、暴力破解漏洞介绍 1.暴力破解简介 暴力破解的产生原因是因为服务器端没有做限制&#xff0c;导致攻击者可以通过暴力破解的手段破解用户所需要的信息&#xff0c;如用户名、密码、验证码等。暴力破解需要有庞大的字典&#xff0c;暴力破解的关键在于字典的大小。 2.暴力破解…

Spring AOP的基石--Java动态代理

一、代理模式简介以及静态代理动态代理区别 1. 关系图 静态代理&#xff1a;可以看出有一接口Sourceable&#xff0c;两个实现类Source&#xff0c;Proxy&#xff0c;Client调用的Proxy。理解一下就是Client通过Proxy来调用这个method&#xff0c;而不是直接通过Source来调用。…

渗透测试技术----常见web漏洞--跨站脚本攻击原理及防御

一、跨站脚本攻击介绍 1.跨站脚本攻击简介 跨站脚本攻击(Cross-Site Scripting)简称为XSS(本来为CSS,但是与前端语言CSS容易产生歧义&#xff0c;故取名为XSS)&#xff0c;XSS是一种针对于网站应用程序(Web客户端)的安全漏洞攻击技术&#xff0c;是代码注入的一种&#xff0c;它…

Linux命令之mkdir

mkdir [选项] 目录 若指定目录不存在则创建目录 (1).常用选项 -m&#xff0c;--mode模式 设置权限模式&#xff08;类似chmod&#xff09;&#xff0c;而不是rwxrwxrwx减umask -p&#xff0c;--parents 需要时创建目标目录的上层目录&#xff0c;但即使这些目录已存在也不当作…

渗透测试技术----常见web漏洞--跨站请求伪造攻击原理及防御

一、跨站请求伪造攻击介绍 1.跨站请求伪造攻击简介 跨站请求伪造(Cross-site request forgery)简称为CSRF&#xff0c;这是一种对网站的恶意利用。CSRF实际上就是攻击者通过各种方法伪装成目标用户的身份&#xff0c;欺骗服务器&#xff0c;进行一些非法操作&#xff0c;但是这…

性能测试需要完成什么

自动货构建更新系统、测试、收集分析数据、发送报告 需要进行三类测试&#xff1a;并发测试、压力测试、负载测试 需要得到指标&#xff1a;请求成功比例、tps、交易成功率、响应时间的均值和异常值比例、服务器的CPU、内存使用率转载于:https://www.cnblogs.com/caojuansh/p/8…