国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Redis從頭學(xué)-6】Redis中的Hash數(shù)據(jù)類型實(shí)戰(zhàn)場(chǎng)景之購(gòu)物車

這篇具有很好參考價(jià)值的文章主要介紹了【Redis從頭學(xué)-6】Redis中的Hash數(shù)據(jù)類型實(shí)戰(zhàn)場(chǎng)景之購(gòu)物車。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

?????作者名稱:DaenCode
??作者簡(jiǎn)介:啥技術(shù)都喜歡搗鼓搗鼓,喜歡分享技術(shù)、經(jīng)驗(yàn)、生活。
??人生感悟:嘗盡人生百味,方知世間冷暖。
??所屬專欄:Redis從頭學(xué)


【Redis從頭學(xué)-6】Redis中的Hash數(shù)據(jù)類型實(shí)戰(zhàn)場(chǎng)景之購(gòu)物車,Redis從頭學(xué),redis,哈希算法,數(shù)據(jù)庫(kù)


??前言

之前的篇章對(duì)Redis的String、List數(shù)據(jù)類型已經(jīng)做出了具體分析,并舉例說(shuō)明了其具體的實(shí)戰(zhàn)場(chǎng)景。本文就結(jié)合Hash數(shù)據(jù)類型結(jié)構(gòu)的特性,一起探討其實(shí)戰(zhàn)中的應(yīng)用場(chǎng)景,并以購(gòu)物車實(shí)戰(zhàn)為例。

??Hash數(shù)據(jù)類型分析

Redis中的Hash數(shù)據(jù)類型是一種存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),其中鍵是唯一的,可以是字符串,整數(shù)或浮點(diǎn)數(shù)。以下是對(duì)其結(jié)構(gòu)的分析:

  • 使用類似字典的方式來(lái)存儲(chǔ)數(shù)據(jù),可以高效的進(jìn)行插入、更新、刪除和查找操作。
  • 內(nèi)部實(shí)現(xiàn)上采用哈希表作為底層數(shù)據(jù)結(jié)構(gòu)。通過(guò)hash函數(shù)將鍵映射到哈希表的槽位,每個(gè)槽位存儲(chǔ)一個(gè)或者多個(gè)鍵值對(duì)。
    【Redis從頭學(xué)-6】Redis中的Hash數(shù)據(jù)類型實(shí)戰(zhàn)場(chǎng)景之購(gòu)物車,Redis從頭學(xué),redis,哈希算法,數(shù)據(jù)庫(kù)

??Hash類型實(shí)戰(zhàn)應(yīng)用場(chǎng)景

通過(guò)上述對(duì)Hash類型的分析,可以結(jié)合實(shí)際需求選擇適合Hash類型結(jié)構(gòu)的場(chǎng)景。本文主要演示購(gòu)物車功能的演示代碼。

  • 緩存:Hash數(shù)據(jù)類型非常適合用于緩存數(shù)據(jù),例如存儲(chǔ)用戶信息、配置信息等??梢允褂肏ash的字段作為鍵,字段對(duì)應(yīng)的值存儲(chǔ)具體的數(shù)據(jù)。這樣可以減少對(duì)數(shù)據(jù)庫(kù)或其他數(shù)據(jù)源的頻繁查詢,提高系統(tǒng)性能。
  • 對(duì)象存儲(chǔ):如果需要將一個(gè)對(duì)象存儲(chǔ)在Redis中,可以使用Hash數(shù)據(jù)類型。對(duì)象的各個(gè)屬性可以作為Hash的字段,屬性值作為Hash字段對(duì)應(yīng)的值,這樣可以方便地獲取、更新對(duì)象的某個(gè)屬性,而不需要加載整個(gè)對(duì)象。
  • 數(shù)據(jù)分片:如果需要將大量數(shù)據(jù)分散存儲(chǔ)在多個(gè)Redis實(shí)例中,可以使用Hash數(shù)據(jù)類型進(jìn)行數(shù)據(jù)分片??梢愿鶕?jù)某個(gè)字段的哈希值來(lái)確定數(shù)據(jù)應(yīng)該存儲(chǔ)在哪個(gè)實(shí)例中,以實(shí)現(xiàn)分布式存儲(chǔ)。

購(gòu)物車功能

生活中的例子

可以參照淘寶中的購(gòu)物車來(lái)實(shí)現(xiàn)其功能。紅色標(biāo)注部分為購(gòu)物車,藍(lán)色標(biāo)注部分為購(gòu)物項(xiàng)。購(gòu)物車內(nèi)包含很多個(gè)購(gòu)物項(xiàng)
【Redis從頭學(xué)-6】Redis中的Hash數(shù)據(jù)類型實(shí)戰(zhàn)場(chǎng)景之購(gòu)物車,Redis從頭學(xué),redis,哈希算法,數(shù)據(jù)庫(kù)

存儲(chǔ)分析

根據(jù)上述例子結(jié)合購(gòu)物車以及購(gòu)物項(xiàng)的關(guān)系,數(shù)據(jù)在redis中存儲(chǔ)的樣子,大概如下圖所示:
【Redis從頭學(xué)-6】Redis中的Hash數(shù)據(jù)類型實(shí)戰(zhàn)場(chǎng)景之購(gòu)物車,Redis從頭學(xué),redis,哈希算法,數(shù)據(jù)庫(kù)

實(shí)現(xiàn)步驟

  • 創(chuàng)建一個(gè)購(gòu)物車實(shí)體類Cart。字段內(nèi)容包含字段包含id、title、以及List<CartItem>購(gòu)物項(xiàng)的list集合、totalAmmount總價(jià)。
  • 創(chuàng)建購(gòu)物項(xiàng)實(shí)體類。字段內(nèi)容包含goodId、goodTitle、goodImg、price、totalPrice購(gòu)物項(xiàng)總價(jià)、buyNums購(gòu)買數(shù)量。
  • 編寫獲取購(gòu)物車信息以及在購(gòu)物車中添加商品信息的接口。

購(gòu)物車Cart類

要注意計(jì)算購(gòu)物車的總價(jià)格=購(gòu)物項(xiàng)價(jià)格之和。
return cartItemList.stream().mapToInt(CartItem::getTotalPrice).sum();

public class Cart {
    private Integer id;
    private String title;
    private List<CartItem> cartItemList;
    private Integer totalAmmount;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public List<CartItem> getCartItemList() {
        return cartItemList;
    }

    public void setCartItemList(List<CartItem> cartItemList) {
        this.cartItemList = cartItemList;
    }

    public Integer getTotalAmmount() {
        //計(jì)算購(gòu)物車的總價(jià)格
        return cartItemList.stream().mapToInt(CartItem::getTotalPrice).sum();
    }

    public void setTotalAmmount(Integer totalAmmount) {
        this.totalAmmount = totalAmmount;
    }
}

CartItem購(gòu)物項(xiàng)類

其中的goodId-商品ID、goodTitle-商品名稱、goodImag-商品封面、price-商品單價(jià)、totalPrice-商品總價(jià)、buyNums-購(gòu)買數(shù)量。

public class CartItem {
    private Integer goodId;
    private String goodTitle;
    private String goodImag;
    private Integer price;
    private Integer totalPrice;
    private int buyNums;
    //省略getter、setter
}

獲取個(gè)人購(gòu)物車

解析:

  1. 從Redis中獲取當(dāng)前用戶的key所對(duì)應(yīng)的購(gòu)物車數(shù)據(jù)。
  2. 獲取購(gòu)物車數(shù)據(jù)中的購(gòu)物項(xiàng)。
  3. 對(duì)購(gòu)物項(xiàng)數(shù)據(jù)進(jìn)行解析并以此遍歷轉(zhuǎn)為對(duì)象,放到購(gòu)物項(xiàng)列表中。
  4. 將購(gòu)物項(xiàng)列表添加到購(gòu)物車中。

流程圖如下:

public JsonData getPersonalCart(int userId) throws IOException {
        //購(gòu)物項(xiàng)列表
        List<CartItem> cartItemList=new ArrayList<>();
        //購(gòu)物車
        Cart cart=new Cart();
        //從redis中獲取購(gòu)物車。
        BoundHashOperations<String,Object,Object> personalCart=getCarts(userId);
        //對(duì)personalCart的數(shù)據(jù)進(jìn)行解析,轉(zhuǎn)為json格式。
        //1.獲取購(gòu)物車數(shù)據(jù)中的購(gòu)物項(xiàng)。
        List<Object> items=personalCart.values();
        //2.對(duì)購(gòu)物項(xiàng)進(jìn)行遍歷,并轉(zhuǎn)為對(duì)象類型
        for(Object item:items){
            ObjectMapper objectMapper=new ObjectMapper();
            //3.轉(zhuǎn)為對(duì)象格式
            CartItem cartItem=objectMapper.readValue((String) item,CartItem.class);
            //4.存儲(chǔ)到購(gòu)物項(xiàng)列表中
            cartItemList.add(cartItem);
        }
        //5.購(gòu)物項(xiàng)列表放入購(gòu)物車
        cart.setCartItemList(cartItemList);
        return JsonData.buildSuccess(cart);
    }
    //從redis獲取購(gòu)物車數(shù)據(jù)
    public BoundHashOperations<String,Object,Object> getCarts(int userId){
        String key="shopping:"+userId;
        return redisTemplate.boundHashOps(key);
    }

添加購(gòu)物車

首先,我們需要理解這個(gè)流程。這個(gè)流程主要包括以下幾個(gè)步驟:

  1. 獲取個(gè)人購(gòu)物車
  2. 根據(jù)當(dāng)前商品id提取個(gè)人購(gòu)物車數(shù)據(jù)
  3. 如果個(gè)人購(gòu)物車數(shù)據(jù)存在當(dāng)前商品id,則進(jìn)行數(shù)量的增減并存入redis數(shù)據(jù)庫(kù);若不存在,則獲取當(dāng)前商品信息,并將商品信息存入到redis的hash中。

接下來(lái),我們將這個(gè)流程整理成mermaid流程圖的形式:

public JsonData addCart(int userId,int goodId,int buyNums){
        //添加購(gòu)物車之前,需要先獲取個(gè)人購(gòu)物車
        BoundHashOperations<String,Object,Object> myCart=getCarts(userId);
        //判斷購(gòu)物車是否有這個(gè)商品,有商品則增加其數(shù)量,無(wú)商品增加其信息
        //獲取當(dāng)前商品信息,
        Object cacheGood=myCart.get(goodId+"");
        if (cacheGood==null){
            //redis中添加商品信息
            //首先獲取商品詳情信息
            XxxGood xxxGood=xxxService.findDetailById(goodId);
            //購(gòu)物項(xiàng)中添加商品信息
            CartItem cartItem=new CartItem();
            cartItem.setGoodId(goodId);
            cartItem.setPrice(xxxGood.getPrice());
            //....其他信息
            //將購(gòu)物項(xiàng)添加到redis中
            myCart.put(goodId+"",cartItem);
        }else {
            //增加購(gòu)買數(shù)量,需要將當(dāng)前商品轉(zhuǎn)為對(duì)象格式
            CartItem cartItem=(CartItem)cacheGood;
            cartItem.setBuyNums(cartItem.getBuyNums()+buyNums);
            //存入到購(gòu)物車中
            myCart.put(goodId,cartItem);
        }
        return JsonData.buildSuccess();
    }

清空購(gòu)物車

 public JsonData clearMyCart(int userId){
        String key="shopping:"+userId;
        redisTemplate.delete(key);
        return JsonData.buildSuccess();
    }

??寫在最后

有關(guān)于Redis中的Hash數(shù)據(jù)類型實(shí)戰(zhàn)應(yīng)用場(chǎng)景到此就結(jié)束了。功能演示代碼的邏輯簡(jiǎn)單,目的是理解Hash數(shù)據(jù)類型的應(yīng)用,實(shí)際場(chǎng)景的邏輯根據(jù)具體需求而定。感謝大家的閱讀,希望大家在評(píng)論區(qū)對(duì)此部分內(nèi)容散發(fā)討論,便于學(xué)到更多的知識(shí)。


【Redis從頭學(xué)-6】Redis中的Hash數(shù)據(jù)類型實(shí)戰(zhàn)場(chǎng)景之購(gòu)物車,Redis從頭學(xué),redis,哈希算法,數(shù)據(jù)庫(kù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-665231.html

到了這里,關(guān)于【Redis從頭學(xué)-6】Redis中的Hash數(shù)據(jù)類型實(shí)戰(zhàn)場(chǎng)景之購(gòu)物車的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Redis數(shù)據(jù)結(jié)構(gòu):Hash類型全面解析

    Redis,作為一個(gè)開(kāi)源的、內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)系統(tǒng),以其出色的性能和靈活的數(shù)據(jù)類型,廣泛應(yīng)用于緩存、消息隊(duì)列、發(fā)布訂閱系統(tǒng)等多種場(chǎng)景。在 Redis 的五種基本數(shù)據(jù)類型中,Hash 類型是一種非常重要的數(shù)據(jù)類型。它可以存儲(chǔ)鍵值對(duì)的集合,且能夠用小于1毫秒的時(shí)間復(fù)雜

    2024年02月10日
    瀏覽(22)
  • Redis Redis的數(shù)據(jù)結(jié)構(gòu) - 通用命令 - String類型命令 - Hash類型命令

    Redis Redis的數(shù)據(jù)結(jié)構(gòu) - 通用命令 - String類型命令 - Hash類型命令

    目錄 Redis的數(shù)據(jù)結(jié)構(gòu): Redis命令: 通用命令:(通用指令是部分?jǐn)?shù)據(jù)類型的,都可以使用的指令) KEYS查詢命令: DEL刪除命令: EXISTS判斷命令: EXPIPE有效期設(shè)置命令: TTL查看剩余期限命令: String類型: String的3種類型: String類型的常見(jiàn)命令: SET插入數(shù)據(jù)命令: MSET多重插

    2024年02月09日
    瀏覽(51)
  • Redis 中如何設(shè)置 Hash 數(shù)據(jù)類型的過(guò)期時(shí)間?

    在 Redis 中可以通過(guò) setex 或 expire 方式來(lái)設(shè)置 key 的過(guò)期時(shí)間。但是對(duì)于 Hash 數(shù)據(jù)類型 Redis 是不支持的,所以我們需要使用“曲線救國(guó)”的方式去實(shí)現(xiàn) Hash 數(shù)據(jù)類型的過(guò)期時(shí)間。 即,先對(duì) Hash 數(shù)據(jù)類型賦值,然后再對(duì) Hash 數(shù)據(jù)類型的 key 設(shè)置一個(gè)過(guò)期時(shí)間,這樣就間接的實(shí)現(xiàn)了

    2024年02月12日
    瀏覽(14)
  • Redis關(guān)于Hash類型數(shù)據(jù)的操作,使用redisTemplate

    因?yàn)樵趓edis的Hash數(shù)據(jù)類型里,有內(nèi)層外層兩個(gè)key,而且有內(nèi)層外層兩個(gè)map集合,所以暫時(shí)先稱外層key為大key,內(nèi)層key為小key,外層map為大map,內(nèi)層map為小map,內(nèi)層value值為value。 1.根據(jù)大key和小key還有value的值,設(shè)置一個(gè)value: 2.根據(jù)大key和小key獲取到value值: 3.根據(jù)大key獲取小

    2024年02月11日
    瀏覽(25)
  • 【Redis】1、學(xué)習(xí) Redis 的五大基本數(shù)據(jù)類型【String、Hash、List、Set、SortedSet】

    【Redis】1、學(xué)習(xí) Redis 的五大基本數(shù)據(jù)類型【String、Hash、List、Set、SortedSet】

    ?? Redis 誕生于2009年,全稱是 Re mote D ictionary S erver,遠(yuǎn)程字典服務(wù)器,是一個(gè)基于 內(nèi)存的鍵值型 NoSQL 數(shù)據(jù)庫(kù) ?? 鍵值(key-value)型,value 支持多種不同數(shù)據(jù)結(jié)構(gòu),功能豐富 ?? 單線程,每個(gè)命令具備 原子性 ?? 低延遲,速度快(基于內(nèi)存、IO 多路復(fù)用、良好的編碼) ??支

    2024年02月11日
    瀏覽(23)
  • Redis的五種數(shù)據(jù)類型(string、hash 、list、set、zset)

    Redis的五種數(shù)據(jù)類型(string、hash 、list、set、zset)

    ???????? ????????Redis 提供了豐富的數(shù)據(jù)類型,常見(jiàn)的有五種: String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合) 。 ????????String 是最基本的 key-value 結(jié)構(gòu),key 是唯一標(biāo)識(shí),value 是具體的值,value其實(shí)不僅是字符串, 也可以是數(shù)字(整

    2024年01月25日
    瀏覽(26)
  • Redis之?dāng)?shù)據(jù)類型String、List、Hash、Set、Sorted Set(詳細(xì))

    Redis之?dāng)?shù)據(jù)類型String、List、Hash、Set、Sorted Set(詳細(xì))

    一、String數(shù)據(jù)類型 1、SET/GET/APPEND/STRLEN (1)?APPEND (2)?SET/STRLEN 2、?INCR/ DECR/INCRBY/DECRBY (1)INCR/ DECR (2)?INCRBY/DECRBY INCRBY key increment:key值增加指定的整數(shù)DECRBY key decrement:key值減少指定的整數(shù) ?3、GETSET 4、?SETEX ?5、SETNX 6、MSET/MGET/MSETNX ?二、List數(shù)據(jù)類型 1、LPUSH/LPUSHX/

    2024年02月11日
    瀏覽(20)
  • Redis 數(shù)據(jù)類型及其常用命令一(string、list、set、zset、hash)

    Redis 數(shù)據(jù)類型及其常用命令一(string、list、set、zset、hash)

    1、簡(jiǎn)介 ? ? ? ? Redis 的常用數(shù)據(jù)類型有十種,分別為:string、list、set、zset、hash、geo、hyperloglog、bitmap、bitfield、stream。熟練使用各種數(shù)據(jù)類型,能夠快速結(jié)合場(chǎng)景進(jìn)行使用。 注:我們所說(shuō)的數(shù)據(jù)類型是指 value 的數(shù)據(jù)類型,key 都是字符串。 所有類型的命令查看:help @數(shù)據(jù)類

    2024年03月13日
    瀏覽(29)
  • Redis常用數(shù)據(jù)類型和使用場(chǎng)景

    Redis常用數(shù)據(jù)類型和使用場(chǎng)景

    Redis目前支持5種數(shù)據(jù)類型,分別是: ? ? String(字符串) List(列表) Hash(字典) Set(集合) Sorted Set(有序集合) 下面就分別介紹這五種數(shù)據(jù)類型及其相應(yīng)的操作命令。 ? 1. String(字符串) String是簡(jiǎn)單的 key-value 鍵值對(duì),value 不僅可以是 String,也可以是數(shù)字。String在r

    2024年02月16日
    瀏覽(29)
  • Redis數(shù)據(jù)類型詳解與應(yīng)用場(chǎng)景

    目錄 1. 字符串(String) 1.1 使用場(chǎng)景 1.2 代碼示例 2. 列表(List) 2.1 使用場(chǎng)景 2.2 代碼示例 3. 集合(Set) 3.1 使用場(chǎng)景 3.2 代碼示例 4. 散列(Hash) 4.1 使用場(chǎng)景 4.2 代碼示例 5. 有序集合(Sorted Set) 5.1 使用場(chǎng)景 5.2 代碼示例 6. 二進(jìn)制位圖(Bitmap) 6.1 使用場(chǎng)景 6.2 代碼示例 7.

    2024年01月22日
    瀏覽(15)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包