使用redis缓存的实践总结
2013-04-20 11:46
169 查看
使用场景一:高频率使用但不频繁更新的业务数据。由于不频繁更新,所以可以在系统启动时,从数据库中加载,放入redis。如果更新,需重启服务,当然这比较笨。更好的做法下面会列出。
使用场景二:高频率使用更新还算频繁的业务数据。由于有一定频率的更新,所以可以在用户访问时,查询缓存,如果没有值,则从数据库中加载入redis,并设置过期时间。这样,过期时间内的访问就都走缓存了。这种策略也有问题,就是大并发访问时,容易造成数据库瞬间高并发读,如果程序再写的烂点,查询语句再复杂点,那可能造成数据库死锁。更好的办法,下面列出。
使用场景三:高频率使用高频率更新的业务数据。这种数据就需要在写入数据库的同时放入缓存,不设置过期时间,这样用户每次访问都走缓存。为了保证数据的一致,还有数据对内存的占用,还需要有一些额外的策略。
对于场景一:更好的做法是在系统启动的同时,利用redis的pub/sub功能,启动一个监听通道。当数据发生更新时,往通道publish一个消息,系统接收到消息后,重新从数据库中加载数据,放入缓存。这样系统实现了无中断的更新缓存。
对于场景二:更好的做法是单独启动一个定时任务,把定时任务看做是一个用户,他每隔一段时间从数据库中读取数据,然后放入缓存。而前台用户访问的始终是缓存数据,不会触发数据库的相关操作。这个策略也可以用在场景一中。
当然,使用memcached也可以实现类似的功能,但是我更喜欢用redis,基于他强大的性能和数据结构,可以实现多种复杂的业务需求。
使用场景二:高频率使用更新还算频繁的业务数据。由于有一定频率的更新,所以可以在用户访问时,查询缓存,如果没有值,则从数据库中加载入redis,并设置过期时间。这样,过期时间内的访问就都走缓存了。这种策略也有问题,就是大并发访问时,容易造成数据库瞬间高并发读,如果程序再写的烂点,查询语句再复杂点,那可能造成数据库死锁。更好的办法,下面列出。
使用场景三:高频率使用高频率更新的业务数据。这种数据就需要在写入数据库的同时放入缓存,不设置过期时间,这样用户每次访问都走缓存。为了保证数据的一致,还有数据对内存的占用,还需要有一些额外的策略。
对于场景一:更好的做法是在系统启动的同时,利用redis的pub/sub功能,启动一个监听通道。当数据发生更新时,往通道publish一个消息,系统接收到消息后,重新从数据库中加载数据,放入缓存。这样系统实现了无中断的更新缓存。
对于场景二:更好的做法是单独启动一个定时任务,把定时任务看做是一个用户,他每隔一段时间从数据库中读取数据,然后放入缓存。而前台用户访问的始终是缓存数据,不会触发数据库的相关操作。这个策略也可以用在场景一中。
当然,使用memcached也可以实现类似的功能,但是我更喜欢用redis,基于他强大的性能和数据结构,可以实现多种复杂的业务需求。
相关文章推荐
- 使用redis缓存的实践总结
- 在C#中使用ASV封装编程实践中遇到的问题总结
- shell中date使用总结-基于自动定期备份mysql实践
- Atitit. 异常的使用总结最佳实践java .net php Vo8f
- 实践总结ajax各种使用方式(中)
- 关于java使用javacomm20-win32实践总结
- 使用 gulp 搭建前端环境之 ionic 项目实践总结
- Atitit. 异常的使用总结最佳实践java .net php Vo8f
- 使用LVS+keepalived实现mysql负载均衡的实践和总结
- 关于java使用javacomm20-win32实践总结
- 从工作流状态机实践中总结状态模式使用心得(转载)
- 一个高度使用百度地图的App开发实践总结
- Atitit.angular.js 使用最佳实践 原理与常见问题解决与列表显示案例 attilax总结
- dubbo 应用实践 使用总结
- 总结在使用VB 6.0和C#编写ActiveX控件的实践 (一)
- HTML---经常使用标签总结与实践
- 使用Node.js完成的第一个项目的实践总结
- 使用LVS+keepalived实现mysql负载均衡的实践和总结
- redis缓存的使用总结
- git 常用命令使用实践总结-wish