1. 程式人生 > >Redis場景用法一、列表類(訂單列表)

Redis場景用法一、列表類(訂單列表)

  • 一、使用場景介紹

    有些場景,使用者會頻繁請求 自己的列表類資訊,可以將此類資訊放到Redis裡,以訂單列表為例。

  • 二、功能原理分析
  1. 訂單詳情用hash結構儲存。Redis 裡的 hash 是key--value(Map)形式,這中形式可以充當二維表結構。以hash的方式儲存物件資料,相對於String的key-value資料可以更加集約的利用記憶體結構。讀取的時候,可以通過訂單ID直接得到Map,解析封裝成物件。

    如圖所示:

     

  2. 訂單列表用List結構儲存。Redis裡的List結構是以key-value(ArrayList)形式,這種佇列方式,可以靈活的PUSH和POP,根據業務靈活的掌握,先進先出,還是先進後出。舉個列子 比如說:訂單以時間順序排序(時間由近及遠),那麼就訂單生成後 可以用LPUSH的方式將訂單插入LIST。呼叫列表的時候, 直接從左到右(LRANGE,0,-1)排序調出所有列表。

    如圖所示:

     

  • 三、demo例項

    

/**
 * @Auther: DBG_zxx
 * @Date: 2019/1/2 18:34
 * @Desc: Redis訂單列表的DEMO
 */
public class OrderList {

    final static String KEY_ORDER_ID = "orderId_";
    final static String KEY_ORDER_LIST = "order_list";

    final static JedisUtils jedis = new JedisUtils(Basic.ip, Basic.port, Basic.auth);

    
// 批量插入 訂單 public static void batchAddOrderDetails(List<Map<String,String>> orders) { orders.forEach(order ->{ if (StringUtils.isNotBlank(order + "")){ if (StringUtils.isNotBlank(order.get("orderId") + "")){ String redisOrderId
= KEY_ORDER_ID + order.get("orderId").toString(); jedis.hmset(redisOrderId ,order); if ("OK".equals(jedis.hmset(redisOrderId ,order))){ System.out.println("插入訂單ID為 : " +redisOrderId + "成功"); } lpushOrderId(redisOrderId); } } }); System.out.println("-----------------------------------------------------"); } public static Long lpushOrderId(String order){ return jedis.lpush(KEY_ORDER_LIST , order); } public static void orderList(String orderListKey){ List<String> orderList = jedis.lrange(orderListKey , 0 , -1); System.out.println("訂單列表為:"); orderList.forEach(orderId -> { System.out.println(orderId); }); System.out.println("-----------------------------------------------------"); } public static void orderDetails(String orderId){ Map<String ,String > orderDetails = jedis.hgetall(orderId); System.out.println("訂單詳情:"); orderDetails.forEach((k,v) ->System.out.println(k+" : "+v)); } public static void main(String[] args) { List<Map<String ,String >> orderList = new ArrayList<>(); orderList.add(obj2Map(new Order("1", "36.6" , "2018-01-01"))); orderList.add(obj2Map(new Order("2", "38.6" , "2018-01-01"))); orderList.add(obj2Map(new Order("3", "39.6" , "2018-01-01"))); // 批量插入訂單 batchAddOrderDetails(orderList); // 查詢訂單列表 orderList(KEY_ORDER_LIST); // 根據訂單Id查詢訂單詳情 orderDetails(KEY_ORDER_ID+1); } public static Map<String ,String > obj2Map(Order order){ Map<String ,String > map = new HashMap<>(); map.put("orderId",order.getOrderId()); map.put("money",order.getMoney()); map.put("money",order.getTime()); return map; } static class Order{ private String orderId; private String money; private String time; public Order(String orderId, String money, String time) { this.orderId = orderId; this.money = money; this.time = time; } public String getOrderId() { return orderId; } public void setOrderId(String orderId) { this.orderId = orderId; } public String getMoney() { return money; } public void setMoney(String money) { this.money = money; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } @Override public String toString() { return "Order{" + "orderId='" + orderId + '\'' + ", money='" + money + '\'' + ", time='" + time + '\'' + '}'; } } }