项目中的缓存是怎么用到的,为什么用?
回想一下自己的项目中用到缓存的地方:购物车模块,cc直播模块,首页的课程分类列表等。至于为什么用,主要考虑到的是:
1高性能,缓存查询速度比较快,有一些复杂查询比较耗时,将聚合的结果进行缓存。
2.有些数据经常要查询,但是又是不需要怎么改变的(首页的课程分类列表)
3.有一些数据只是暂时存在,不需要保存到数据库中
4.高并发?还没有试过
redis的单线程模型:
redis里面有一个文件事件处理器是单线程的,采用的是非阻塞的IO多路复用的机制(将请求压到队列中),基于内存的操作。
redis的缓存类型:
string,set(去重),hash(对象),list,sorted set(排序)
redis的过期策略:
1.定时清除,设置过期时间。问题redis设置定时清除采用的是惰性删除,过期了并没有删除,要等到用户再次请求后才删除
2.内存淘汰:内存过多的时候,可以自动删除一些数据可以自己定制自己的策略(最近查询比较少的数据allkeys-lru)
redis高并发:
1.集群
2.可以将读写分离
redis高可用:
1.第一个想法就是搞集群 http://www.redis.cn/topics/cluster-tutorial.html
2.单机(主从架构,有一台master主机接收用户的写操作,由主机再将数据同步到从机上)
redis持久化机制:
RDB和AOF:RDB是快照,全量保存(save(同步)和bgsave(触发条件异步)机制);AOF:增量保存,可以设置每次操作保存,也可以设置每秒保存。
缓存的问题:
1.怎么解决缓存数据和数据库的数据一致
基本的数据库写和改操作后,进行缓存的更新
2.缓存雪崩问题。(缓存挂了,请求走数据库了,就导致雪崩了)
保证redis集群高可用(主从机制),也可以再搞一个本地缓存escache,配好降级操作(Hystrix)防止数据库卡导致全部系统雪崩。必须做好持久化,方便快速恢复。
3.缓存穿透。(有人用缓存不存在的数据请求,数据和缓存都没有)
如果数据没有数据就写一个空值(或者unknow)到缓存中