众所周知,使用缓存的主要目的就是为了高并发情况下的高可用。
思考如下问题:
:
1: redis + mysql应怎么使用?
1:首先,判断用户所请求的数据是否存在redis中
2:如果数据存在redis中,直接返回
3:如果数据未命中,则需要去mysql中获取数据,返回数据并将数据缓存到redis中
4:如果mysql中也没有查询到用户所需要的数据,需要在redis中写个key,值为null。防止缓存穿透
2:数据应该怎么缓存才不会造成浪费?
这里涉及到一个概念:**原子性缓存**(即数据按最小粒度缓存,假如一个商品表,将每个商品都进行缓存)
然后想要什么数据自己进行组合。不然的话,一条数据可能会被缓存多次造成浪费,比如热门商品中已经有
一条数据了,而这个商品又是刚上线的最新商品,结果这条数据就被缓存了两次
3:分页数据如何缓存?
在要缓存的列表数据的key后面拼上页码,比如 user_list_1,user_list_2 作为key进行缓存
4:分页带条件的数据如何缓存?
同上题,不过要再拼上where条件,比如,user_list_1(页码)_$where,作为key进行缓存,
这里要注意一个问题: 要注意key的长度不能过长,所以这里要把key进行md5
5:经常发生改变的数据如何缓存?
想象这样一个情景:一个电商网站,商品在不断的更新换代,每天要更换好多商品,也许这一秒商品
还存在,下一秒就卖完下架了。
这种情况,要解决的话,可以通过版本号对数据进行区分:
1:redis中缓存一个版本号, 版本号默认为1
2:缓存数据时,在最后面拼上版本号。
3:redis更新数据时,版本号+1,生成新的key。
4:取数据时,先获取最新版本号,再根据key拼接版本号获取最新数据
5:如果有涉及到用户的数据,要记得拼上用户id, 比如缓存一个用户的订单数据:
(order_list_用户id_版本号) 作为key缓存数据