2024年,电商真正跨入了新时代。
在这个新时代,工具、方法、体系……都在升级,堪称一日千里。
商家如何更好地顺应时代的变化?2024年,我给大家的建议总结为两句话。
第一句是借平台的红利;
第二句是建立自己的体系。
如何利用电商API数据采集接口,完成自己的主流电商数据采集?
前言
如果项目业务处于起步阶段,流量非常小,那无论是读请求还是写请求,直接操作数据库即可,这时架构模型是这样的:
但随着业务量的增长,项目业务请求量越来越大,这时如果每次都从数据库中读数据,那肯定会有性能问题。这个阶段通常的做法是,引入环城缓存来提高读性能,架构模型就变成了这样:
一、谈谈一致性
首先,我们先来看看有哪几种一致性的情况呢?
- 强一致性:如果你的项目对缓存的要求是强一致性的,那么请不要使用缓存。这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大。读请求和写请求会串行化,串到一个内存队列里去,这样会大大增加系统的处理效率,吞吐量也会大大降低。
- 弱一致性:这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态。
- 最终一致性:最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。这里之所以将最终一致性单独提出来,是因为它是弱一致性中非常推崇的一种一致性模型,也是业界在大型分布式系统的数据一致性上比较推崇的模型。一般情况下,高可用只确保最终一致性,不确保强一致性。
二、 情景分析
针对读场景
请求查询数据,如果命中缓存,那么直接取缓存数据返回即可。如果请求中不存在,数据库中存在,那么直接取数据库数据返回,然后将数据同步到Redis中。不会存在数据不一致的情况。
针对写场景
- 如果该数据在缓存中不存在,那么直接修改数据库中的数据即可,不会存在数据不一致的情况。
- 当更新数据时,如更新某商品的库存,当前商品的库存是100,现在要更新为99,先更新数据库更改成99,然后删除缓存,发现删除缓存失败了,这意味着数据库存的是99,而缓存是100,这导致数据库和缓存不一致。
- 在高并发的情况下,如果当删除完缓存的时候,这时去更新数据库,但还没有更新完,另外一个请求来查询数据,发现缓存里没有,就去数据库里查,还是以上面商品库存为例,如果数据库中产品的库存是100,那么查询到的库存是100,然后插入缓存,插入完缓存后,原来那个更新数据库的线程把数据库更新为了99,导致数据库与缓存不一致的情况。
三、同步策略
想要保证缓存与数据库的双写一致,一共有4种方式,即4种同步策略:
先更新数据库,后删除缓存
public void deleteRedisData(UserInfo userInfo){ // 删除Redis中的缓存数据 jedis.del(userInfo); // 更新MySQL数据库数据 userInfoDao.update(userInfo); try { TimeUnit.SECONDS.sleep(2); } catch(Exception exp){ exp.printStackTrace(); } // 删除Redis中的缓存数据 jedis.del(userInfo); }
五、结语
对于并发几率很小的数据(如个人维度的订单数据、用户数据等),这种几乎不用考虑这个问题,很少会发生缓存不一致,可以给缓存数据加上过期时间,每隔一段时间触发读的主动更新即可。就算并发很高,如果业务上能容忍短时间的缓存数据不一致(如商品名称,商品分类菜单等),缓存加上过期时间依然可以解决大部分业务对于缓存的要求。
把今天最好的表现当作明天最新的起点......
标签:缓存,数据库,更新,API,一致性,缓存数据,电商,数据 From: https://www.cnblogs.com/xdedm-Lisa/p/18303280