使用场景一:高频率使用但不频繁更新的业务数据。由于不频繁更新,所以可以在系统启动时,从数据库中加载,放入redis。如果更新,需重启服务,当然这比较笨。更好的做法下面会列出。
使用场景二:高频率使用更新还算频繁的业务数据。由于有一定频率的更新,所以可以在用户访问时,查询缓存,如果没有值,则从数据库中加载入redis,并设置过期时间。这样,过期时间内的访问就都走缓存了。这种策略也有问题,就是大并发访问时,容易造成数据库瞬间高并发读,如果程序再写的烂点,查询语句再复杂点,那可能造成数据库死锁。更好的办法,下面列出。
使用场景三:高频率使用高频率更新的业务数据。这种数据就需要在写入数据库的同时放入缓存,不设置过期时间,这样用户每次访问都走缓存。为了保证数据的一致,还有数据对内存的占用,还需要有一些额外的策略。
对于场景一:更好的做法是在系统启动的同时,利用redis的pub/sub功能,启动一个监听通道。当数据发生更新时,往通道publish一个消息,系统接收到消息后,重新从数据库中加载数据,放入缓存。这样系统实现了无中断的更新缓存。
对于场景二:更好的做法是单独启动一个定时任务,把定时任务看做是一个用户,他每隔一段时间从数据库中读取数据,然后放入缓存。而前台用户访问的始终是缓存数据,不会触发数据库的相关操作。这个策略也可以用在场景一中。
当然,使用memcached也可以实现类似的功能,但是我更喜欢用redis,基于他强大的性能和数据结构,可以实现多种复杂的业务需求。