使用redi设置唯一标识

场景

商城项目中的商品是安装类别区分的,在页面中也是按照分类展示的,为了是接口的反应速度更快,后端决定对产品进行缓存,考虑到redis的数据结构,决定采用有序列表和哈希,存储分组的有序列表以及分组的的哈希,以及每一个分组下产品的有序列表以及产品的哈希,举个例子

假如有十个分组,将这是个分组按照一定的顺序存进有序列表

并将每一个分组的具体字段存成hash

每一个分组下面有一百个商品, 根据分组id创建一个key 然后将分组内地产品id存成一个有序列表

并将产品的具体字段存成hash

使用

使用时,根据分组的有序列表获取分组的id, 再根据id 获取具体的分组内容

根据分组id获取商品的有序列表, 根据商品的id获取商品的具体内容

如果缓存不存在则去查数据表写进缓存,再次查缓存

本来以为一切都很完美,但是还是出了问题

bug

当分组中有产品时,有缓存查缓存,没有缓存查数据表,写入缓存,再次查缓存

但是,当没有产品时,没有缓存,查数据表,没有数据可以写入缓存,返回空

第二次查的时候还是 没有缓存,查数据表,没有数据可以写入缓存,返回空

所以就出现了一个问题,当某一分组下面没有产品时,每次都会重复操作缓存 数据表 缓存,如果产品的数据量比较大的时候,就会出现反应慢的情况

解决

既然找到了问题,解决就好了

在第一次查询数据时,不管数据是否查询到,都给这次查询或者说这个key存一个唯一标识,说明对于这个key我已经查询过数据表了,不用再查了就可以了,通俗的说就是不以查询缓存的结果是否为空来作为查询数据表的依据,而是以key的唯一标识是否存在

redis 里面有一个setnx方法可以使用,当然也可以自己存一个value


结束

有些东西(功能)第一次看的时候可能不明白,所以没有使用,当你真的遇到的时候就会发现,这代码bug真多,还好老板不懂技术

 

原文地址:https://www.cnblogs.com/baozi-tudou/p/12742900.html