首页 新闻 会员 周边

c# 程序 关于redis 缓存的问题, 那位大神给个思路;

0
悬赏园豆:10 [已解决问题] 解决于 2016-05-27 08:52

现在网站 有一个资讯的信息页面,数据库查询显示速度比较慢,

现在想把数据存到redis中 从redis中读取数据

 

现在要做的是 怎么定时从数据库更新redis缓存,

比如说没过5分钟更新一次缓存数据,

还有一个问题就是如果我正在从数据库更新redis 还没有更新完,  这个时候从redis中读取数据获取的数据就不全,这个问题该怎么解决呢   那位大神来帮帮我 ???

问题补充:

 我想问的关键点是在,不用windows服务之类的东西 ,在c# 程序中,实现定时更新redis缓存有什么方法吗 ??

haifeng_0712的主页 haifeng_0712 | 初学一级 | 园豆:109
提问于:2016-05-12 09:17
< >
分享
最佳答案
0

Google cache C#,Cache 缓存策略+适当的代码,可以实现你要求的所有需求。

收获园豆:10
爱编程的大叔 | 高人七级 |园豆:30839 | 2016-05-12 09:24

这边要求 要用redis来做,因为 这边 代码发布到两个服务上面  做的分布式  

haifeng_0712 | 园豆:109 (初学一级) | 2016-05-12 09:27

@haifeng_0712: 说实话,解决网页慢的方法,静态页,Cache等等都是一些好方法。访问网站的人哪里知道这是5分钟前的数据还是10分钟前的数据呢。

爱编程的大叔 | 园豆:30839 (高人七级) | 2016-05-12 09:35

谢谢你啊  可能我太菜了 问题问题有点不太合理 , 我的第二个问题是这样的  比如说我数据库中有1万条记录,我从数据库读取出来向redis中写入,一条一条的写入比如说写到5千条的时候 这个时候我访问redis 就只能取到5000条数据 剩下的数据是不是就取不到了啊

haifeng_0712 | 园豆:109 (初学一级) | 2016-05-12 09:38

@haifeng_0712: 取不到就取不到好了,总有一天能更新完的。

爱编程的大叔 | 园豆:30839 (高人七级) | 2016-05-12 09:39

哦  好吧  

haifeng_0712 | 园豆:109 (初学一级) | 2016-05-12 09:40

@爱编程的大叔:  有没有什么方法   让访问等待更新完成  再读取呢 ??

haifeng_0712 | 园豆:109 (初学一级) | 2016-05-12 09:42

@haifeng_0712: 我知道有方法是双备份数据缓存,存在两份缓存数据,一份更新完全后,删除旧的那份。

下次更新还是更新一个新的,明白我的意思?

在新的没有100%更新前,访问旧的。

爱编程的大叔 | 园豆:30839 (高人七级) | 2016-05-12 10:33

@爱编程的大叔: 明白  十分感谢 !!!

haifeng_0712 | 园豆:109 (初学一级) | 2016-05-12 10:34
其他回答(2)
0

更新数据你可以采用主动式,也就是在db更新时附带更新redis,redis的key的ttl设的时长略长于你设定的周期,但不需要保证更新redis一定成功,如果更新失败或者redis中数据失效则转而请求db同时再写入redis。

第二个,你既然用了cache就没办法保证数据的实时性,所以你所谓的这个问题根本就不存在。

Daniel Cai | 园豆:10424 (专家六级) | 2016-05-12 09:28

是的,我也一直不明白为啥很多人又要Cache,又要保证数据的实时性,这个根本就是扯淡的...

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2016-05-12 09:31

 我的第二个问题是这样的  比如说我数据库中有1万条记录,我从数据库读取出来向redis中写入,一条一条的写入比如说写到5千条的时候 这个时候我访问redis 就只能取到5000条数据 剩下的数据是不是就取不到了啊

支持(0) 反对(0) haifeng_0712 | 园豆:109 (初学一级) | 2016-05-12 09:36

@haifeng_0712: cache肯定不知道你需要多少数据,你当然读取不到。你这种问题需要权衡,是放弃性能还是放弃实时性,你总要选一个的。

如果你对数据那么看重,但又感觉性能有可能有问题,你可以考虑下将数据分片保存。

如果你对性能那么看重,但又希望数据的实时性,那么可以考虑其他db类型,比如mongo。或者说想办法减小更新异步写入redis的时间消耗。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-05-12 09:54

@Daniel Cai: 哦   谢谢 

支持(0) 反对(0) haifeng_0712 | 园豆:109 (初学一级) | 2016-05-12 09:56
0

 

轮询:

每隔一定时间去Redis服务器取数据,定义一个次数(每次有个间隔时间),取到数据,或者超过这个次数,返回空,或者直接去数据库取(然后存到Redis或者返回给前台)。

 public delegate string AsyncDelegate(string xaid, int callDuration, out int threadid);
    class AsyncMessage
    {
        static string redisHost = "192.168.103.52";
        public static RedisClient Redis = new RedisClient(redisHost, 6379);
        public string GetMessageFromRedis(string xaid, int callDuration, out int threadid)
        {
            string message = string.Empty;
            while (true)
            {
                message = Redis.Get<string>(xaid);
                Console.WriteLine(message);
                Thread.Sleep(callDuration);
                threadid = AppDomain.GetCurrentThreadId();
                if (message == "111")
                {
                    break;
                }

            }
            return message;
        }
    }
    class Program
    {
        static string redisHost = "192.168.103.52";
        public static RedisClient Redis = new RedisClient(redisHost, 6379);
        static void Main(string[] args)
        {
            int threadID;
            AsyncMessage asyncMessage = new AsyncMessage();
            AsyncDelegate andl = new AsyncDelegate(asyncMessage.GetMessageFromRedis);
            string xaid = Guid.NewGuid().ToString("N");
            Redis.Set(xaid, "1111");
            IAsyncResult asyncResult = andl.BeginInvoke(xaid, 200, out threadID, null, null);
            Thread.Sleep(10);
            Console.WriteLine("Main Thread {0} Does Some Work", AppDomain.GetCurrentThreadId());
            Console.WriteLine("其实很简单");
            string ret = andl.EndInvoke(out threadID, asyncResult);
            Console.WriteLine("The call executed on thread {0},with return value : {1}",
                threadID, ret);
            Console.ReadLine();
        }
    }

 

大志若愚 | 园豆:2138 (老鸟四级) | 2016-05-12 18:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册