>데이터 베이스 >Redis >Redis의 해시 데이터 유형과 이를 작동하는 방법에 대해 이야기해 볼까요?

Redis의 해시 데이터 유형과 이를 작동하는 방법에 대해 이야기해 볼까요?

青灯夜游
青灯夜游앞으로
2021-12-31 10:16:252563검색

이 기사는 Redis의 해시 데이터 유형을 안내하고 해시 유형 데이터의 기본 작업을 소개합니다.

Redis의 해시 데이터 유형과 이를 작동하는 방법에 대해 이야기해 볼까요?

1. 해시 유형 데이터 개요

이 예를 먼저 살펴보겠습니다.

이전 섹션에서 문자열 저장 유형에 대해 배웠습니다. 그러나 객체 데이터 저장에 빈번한 업데이트 요구 사항이 있는 경우 작업이 번거로워집니다. 예: user:id:100 -> {"id":100,"name":"봄 축제 갈라","fans":12355,"blogs":99,"focus:83} code>, 객체의 로컬 데이터를 업데이트해야 하는 경우 모든 데이터를 교체해야 하므로 [관련 권장사항: <a href="http://www.php.cn/course/%20list/54.html." target="_blank">Redis 동영상 튜토리얼</a>]<code>user:id:100 -> {"id":100,"name":"春晚","fans":12355,"blogs":99,"focus:83},如果需要更新一个对象中的局部数据,就需要替换掉所有数据,于是有了以下的需求。【相关推荐:Redis视频教程

新的需求:对一系列存储的数据进行编组,方便管理,比如存储一个对象的信息需要的存储结构:一个存储空间保存多个键值对数据

如下图:

Redis의 해시 데이터 유형과 이를 작동하는 방법에 대해 이야기해 볼까요?

为了解决这个问题,我们引入新的数据类型:hash

    새로운 요구 사항
  • : 객체에 대한 정보 저장과 같은 관리를 용이하게 하기 위해 일련의 저장된 데이터를 그룹화합니다.
  • 필요한 저장 구조
  • : 저장소 공간은 아래와 같이 여러 키-값 쌍 데이터를
저장합니다.

Redis의 해시 데이터 유형과 이를 작동하는 방법에 대해 이야기해 볼까요?
  • 이 문제를 해결하기 위해 우리는 새로운 데이터 유형인 hash를 도입했습니다. 동시에 해시 저장 구조는 다음과 같습니다. 도 다음과 같이 최적화되었습니다
    필드 수가 적으면 저장 구조는 배열형 구조로 최적화됩니다
  • 필드 수가 많으면 저장 구조는 HashMap 구조를 사용합니다
  • 2. 해시 유형 데이터의 기본 작업
    데이터 수정/추가
  • hset key field value
    단일 필드 쿼리/모든 필드 쿼리
  • # 查询单个字段数据
    hget key field
    # 查询所有数据
    hgetall key
    삭제 작업
  • hdel key field1 [field2]
    여러 데이터 수정/추가
  • hmset key field1 value1 field2 value2

Re 켜다 해시 테이블에 있는 하나 이상의 지정된 필드 값

    hmget key field1 field2
  • 해시 테이블의 필드 수 가져오기
    hlen key
  • 지정된 필드가 해시 테이블에 있는지 여부 가져오기

hexists key field

3. 데이터형
  • 해시 테이블의 모든 필드 이름 또는 필드 값을 가져옵니다

  • hkey key
    hvals key
  • 지정된 문자 필드의 값을 설정합니다. 데이터는 지정된 범위의 값을 증가시킵니다

  • hincrby key field increment
    hincrbyfloat key field increment
  • 해시형 데이터 연산 주의사항

  • 해시 유형 값은 문자열만 저장할 수 있으며, 다른 데이터 유형은 허용되지 않으며, 데이터를 얻지 못한 경우 해당 결과는

각 해시에 2개까지 저장할 수 있습니다. 32승 빼기 1 키-값 쌍

해시 유형은 객체의 데이터 저장 형태에 매우 가깝고 객체 속성을 유연하게 추가 및 삭제할 수 있지만 해시 설계의 원래 의도는 큰 데이터를 저장하는 것이 아닙니다. 객체 수. 해시를 객체 목록으로 사용하는 것은 물론이고, 내부 필드가 너무 많으면 전체 데이터를 탐색하는 것이 매우 비효율적입니다. 낮으면 데이터 액세스 병목 현상이 발생할 수 있습니다.

4. 해시 적용 사례

4.1. 해시를 사용하여 장바구니 구현

Overview

여기에서는 장바구니와 데이터베이스 간의 지속적인 동기화에 대해 논의하지 않습니다. 로그인하지 않은 사용자의 장바구니 정보 저장은 무시하고 장바구니와 주문 관계를 무시합니다. 우리는 Redis 저장소 모델을 사용하여
    장바구니에 있는 항목을 추가, 찾아보기, 수량 변경, 삭제 및 지우기
  • 구현 계획
  • 고객 ID를 키로 사용하여 각 사용자가 해시 저장소를 생성합니다. 해당 장바구니 정보 구조
  • 제품 번호를 필드로 저장하고 구매 수량을 값으로 저장
  • 제품 추가: 새 필드 및 값 추가
  • 제품 찾아보기: 해시 트래버스

수량 변경: 자동 증가/자동 감소, 값 설정

상품 삭제: 삭제 필드삭제: 삭제 키

샘플 코드는 다음과 같습니다.

# 001 用户购买 ID为101商品 100件,ID为102的商品 200件
hmset 001 101 100 102 200
# 002 用户购买 ID为102商品 1件,ID为104的商品 7件
hmset 002 102 1 104 7

    상품 정보 가속
현재는 redis에 수량만 저장하고 있어 효과를 가속화하지는 않습니다. 제품 정보는 여전히 데이터베이스를 쿼리해야 합니다. 다음 솔루션을 사용할 수 있습니다.

각 장바구니의 제품 정보 기록은 두 개의 필드로 저장됩니다.
  • field1은 수량을 저장하는 데 특별히 사용됩니다.

이름 형식: 제품 ID: nums 데이터 저장: 값

field2는 텍스트 설명, 이미지 주소, 판매자 정보 등을 포함하여 장바구니에 표시된 제품 정보를 저장하는 데 특별히 사용됩니다. 101:info 对应的值中,字符串包含了空格,所以用双引号引用起来,达到转义的目的。

商品信息独立保存

由于 field2 可能在多条商品记录中存在,因此 field2 里的数据可保存到独立的 hash。此时,如果每添加一条购物车记录,就保存一次 hash 数据,显然是不合理的,可以通过hsetnx

이름 형식: 제품 ID:info 데이터 저장: json

샘플 코드는 다음과 같습니다.

# 001 用户 购买 ID为101的商品 2件,商品的信息为:{"name":"good name"} 
hmset 001 101:num 2  101:info "{\"name\":\"goods name\"}"
# 002 用户 购买 ID为101的商品 1件,商品的信息为:{"name":"good name"} 
hmset 002 101:num 1  101:info "{\"name\":\"goods name\"}"
🎜위의 101:info에 해당하는 값에서 문자열에 공백이 포함되어 있으므로 의 목적을 달성하기 위해 큰따옴표로 묶었습니다. 탈출. 🎜🎜🎜상품 정보는 독립적으로 저장됩니다🎜🎜🎜field2는 여러 상품 레코드에 존재할 수 있으므로 field2의 데이터는 독립적인 해시에 저장될 수 있습니다. 이때 장바구니 기록이 추가될 때마다 해시 데이터를 저장하는 것은 당연히 무리입니다. hsetnx 작업을 통해 데이터를 저장할 수 있습니다. 수행. 🎜🎜명령 형식은 다음과 같습니다🎜
hsetnx key field value
🎜코드 예제는 다음과 같습니다🎜
# 将id为101 的商品独立存起来
hsetnx info 101 "{\"name\":\"goods name\"}"

4.1. 用hash实现抢购

案例:双 11 活动日,销售手机充值卡的商家对移动、联通、电信的 30 元、50 元、100 元商品推出抢购活动,每种商品的抢购上限为 100。

解决方案

  • 以商家 id 作为 key
  • 将参与抢购的商品作为 field
  • 将参与抢购的商品数量作为对应的 value
  • 抢购时使用降值的方式控制产品数量
  • 实际业务中还有超卖等实际问题,这里不做讨论

实现过程

商品初始信息

# p01商家下,c30充值券1000张,c50充值券1000张,c100充值券1000张
hmset p01 c30 1000 c50 1000 c100 1000

当 c30 售出1件时,值减 1; 当 c100 售出 20 件时,值减 20,如下代码

# p01商家,商品c30售出1件
hincrby p01 c30 -1
# p01商家,商品c100售出20件
hincrby p01 c100 -20

5. string 存对象对比 hash 存对象

  • string 存储 json 字符串:读取方便,在更新的时候会整体进行更新

  • hash 存对象具体的字段:更新灵活

引入 hash 数据类型之后,我们就解决了 string 存储对象,更新对象时需要整体更新的问题。

更多编程相关知识,请访问:编程入门!!

위 내용은 Redis의 해시 데이터 유형과 이를 작동하는 방법에 대해 이야기해 볼까요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제