现在网站 有一个资讯的信息页面,数据库查询显示速度比较慢,
现在想把数据存到redis中 从redis中读取数据
现在要做的是 怎么定时从数据库更新redis缓存,
比如说没过5分钟更新一次缓存数据,
还有一个问题就是如果我正在从数据库更新redis 还没有更新完, 这个时候从redis中读取数据获取的数据就不全,这个问题该怎么解决呢 那位大神来帮帮我 ???
Google cache C#,Cache 缓存策略+适当的代码,可以实现你要求的所有需求。
这边要求 要用redis来做,因为 这边 代码发布到两个服务上面 做的分布式
@haifeng_0712: 说实话,解决网页慢的方法,静态页,Cache等等都是一些好方法。访问网站的人哪里知道这是5分钟前的数据还是10分钟前的数据呢。
谢谢你啊 可能我太菜了 问题问题有点不太合理 , 我的第二个问题是这样的 比如说我数据库中有1万条记录,我从数据库读取出来向redis中写入,一条一条的写入比如说写到5千条的时候 这个时候我访问redis 就只能取到5000条数据 剩下的数据是不是就取不到了啊
@haifeng_0712: 取不到就取不到好了,总有一天能更新完的。
哦 好吧
@爱编程的大叔: 有没有什么方法 让访问等待更新完成 再读取呢 ??
@haifeng_0712: 我知道有方法是双备份数据缓存,存在两份缓存数据,一份更新完全后,删除旧的那份。
下次更新还是更新一个新的,明白我的意思?
在新的没有100%更新前,访问旧的。
@爱编程的大叔: 明白 十分感谢 !!!
更新数据你可以采用主动式,也就是在db更新时附带更新redis,redis的key的ttl设的时长略长于你设定的周期,但不需要保证更新redis一定成功,如果更新失败或者redis中数据失效则转而请求db同时再写入redis。
第二个,你既然用了cache就没办法保证数据的实时性,所以你所谓的这个问题根本就不存在。
是的,我也一直不明白为啥很多人又要Cache,又要保证数据的实时性,这个根本就是扯淡的...
我的第二个问题是这样的 比如说我数据库中有1万条记录,我从数据库读取出来向redis中写入,一条一条的写入比如说写到5千条的时候 这个时候我访问redis 就只能取到5000条数据 剩下的数据是不是就取不到了啊
@haifeng_0712: cache肯定不知道你需要多少数据,你当然读取不到。你这种问题需要权衡,是放弃性能还是放弃实时性,你总要选一个的。
如果你对数据那么看重,但又感觉性能有可能有问题,你可以考虑下将数据分片保存。
如果你对性能那么看重,但又希望数据的实时性,那么可以考虑其他db类型,比如mongo。或者说想办法减小更新异步写入redis的时间消耗。
@Daniel Cai: 哦 谢谢
轮询:
每隔一定时间去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();
}
}