Tujuan utama pengurangan inventori Redis adalah untuk mengurangkan akses kepada pangkalan data Pengurangan inventori sebelumnya secara langsung mengakses pangkalan data dan membaca inventori Apabila permintaan serentak yang tinggi datang, sejumlah besar data bacaan boleh menyebabkan pangkalan data runtuh.
Apabila sistem dimulakan, inventori produk dimuatkan ke dalam cache Redis dan disimpan.
Apabila menerima permintaan, mula-mula dapatkan nilai inventori produk dalam Redis dan pra-kurangkan inventori Jika inventori tidak mencukupi selepas pengurangan, Pengecualian logik akan dikembalikan secara langsung tanpa akses. Pangkalan data kemudiannya akan mengurangkan inventori Jika nilai inventori adalah betul, teruskan ke langkah seterusnya.
Enqueen permintaan dan segera kembalikan nilai ke hujung hadapan, menunjukkan bahawa ia sedang dalam baris gilir, dan kemudian lakukan logik bunuh denyar Barisan belakang melakukan logik bunuh denyar, dan bahagian hadapan mengundi permintaan yang dihantar oleh hujung belakang , jika kilat membunuh berjaya, kembalikan kilat membunuh, kejayaan, jika tidak, ia akan mengembalikan kegagalan.
/** * 秒杀接口优化之--- 第一步: 系统初始化后就将所有商品库存放入 缓存 */ @Override public void afterPropertiesSet() throws Exception { List<GoodsVo> goods = goodsService.getGoodsList(); if (goods == null) { return; } for (GoodsVo goodsVo : goods) { redisService.set(GoodsKey.getId(), goodsVo.getStockCount()); isOverMap.put(goodsVo.getId(), false);//先初始化 每个商品都是false 就是还有 } }
Logik keseluruhan adalah seperti berikut:
1 Mula-mula baca semua data, mulakan ia ke dalam cache, dan simpan dalam Redis dalam bentuk stok + goodid.
2. Semasa jualan kilat, mula-mula lakukan pengesanan inventori pra-pengurangan, gunakan decr untuk menolak inventori produk yang sepadan. Jika inventori kurang daripada 0, ini bermakna inventori tidak mencukupi pada masa ini, dan tidak perlu mengakses pangkalan data. Hanya buang pengecualian secara langsung.
Kami juga menggunakan isOverMap di atas, yang merupakan tanda ingatan.
Disebabkan pengoptimuman antara muka, banyak operasi cache berasaskan Redis juga akan membawa beban yang besar kepada pelayan Redis apabila konkurensinya tinggi Jika impak pada pelayan Redis boleh dikurangkan, Akses juga boleh mencapai kesan pengoptimuman.
Jadi, anda boleh menambah peta memori untuk menandakan sama ada inventori produk yang sepadan masih ada. Sebelum mengakses Redis, anda boleh mendapatkan tanda inventori produk yang sepadan dalam peta, dan anda boleh menilai tanpa mengakses Redis kehabisan stok.
1 Jana peta, dan semasa pemulaan, gunakan id semua produk sebagai kunci dan tanda palsu untuk menyimpannya dalam peta.
/**秒杀接口优化之 ----第二步: 预减库存 从缓存中减库存 * 利用 redis 中的方法,减去库存,返回值为 减去1 之后的值 * */ long stock = redisService.decr(GoodsKey.getGoodsStock, "" + goodsId); /*这里判断不能小于等于,因为减去之后等于 说明还有是正常范围*/ if (stock < 0) { isOverMap.put(goodsId, true);//没有库存就设置 对应id 商品的map 为true return Result.error(CodeMsg.MIAO_SHA_NO_STOCK); }
private Map<Long, Boolean> isOverMap = new HashMap<Long, Boolean>(); /** * 秒杀接口优化之--- 第一步: 系统初始化后就将所有商品库存放入 缓存 */ @Override public void afterPropertiesSet() throws Exception { List<GoodsVo> goods = goodsService.getGoodsList(); if (goods == null) { return; } for (GoodsVo goodsVo : goods) { redisService.set(GoodsKey.getGoodsStock, "" + goodsVo.getId(), goodsVo.getStockCount()); isOverMap.put(goodsVo.getId(), false);//先初始化 每个商品都是false 就是还有 } }
2. Sebelum mengurangkan inventori, dapatkan tanda daripada peta Jika tanda itu palsu, ini bermakna inventori
Apabila inventori tidak mencukupi, kurangkan inventori produk terlebih dahulu. dan tandakannya sebagai benar. Semua permintaan di bawah akan dipintas, dan tidak perlu mengakses redis untuk pengurangan pra-stok.
Jadi idea keseluruhan menggunakan cache adalah seperti berikut:
Muatkan data inventori produk ke dalam memori, dan mulakan tag memori pada masa yang sama, iaitu, simpan id setiap produk dalam peta, yang dimulakan kepada false , sebelum setiap logik jualan kilat perlu dilaksanakan, nilai diperoleh dalam tanda memori Jika masih ada stok, iaitu nilai pulangan dalam peta adalah palsu, logik jualan kilat akan dilaksanakan, jika tidak pengecualian akan dilemparkan terus.
Apabila menolak inventori pada masa yang sama, anda perlu menentukan sama ada kuantiti inventori dalam cache masih lebih besar daripada 0. Jika kurang daripada atau sama dengan 0, ubah suai tanda memori.
Atas ialah kandungan terperinci Bagaimana untuk merealisasikan senario jualan kilat pengurangan inventori melalui redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!