CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết blog CFSDN này là bài hướng dẫn cơ bản dễ hiểu về cấu trúc dữ liệu Redis (bắt đầu) được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.
Redis có 5 cấu trúc dữ liệu cơ bản là string, list, hash, set và zset. Chúng là những cấu trúc dữ liệu được sử dụng thường xuyên nhất trong quá trình phát triển hàng ngày. Nếu hiểu rõ về 5 cấu trúc dữ liệu này, bạn sẽ nắm vững được một nửa kiến thức về ứng dụng Redis.

sợi dây .

Đầu tiên hãy bắt đầu với chuỗi. Chuỗi đại diện cho một mảng byte có thể thay đổi. Chúng ta khởi tạo nội dung của chuỗi, lấy độ dài của chuỗi, lấy chuỗi con của chuỗi, ghi đè nội dung chuỗi con của chuỗi và nối thêm chuỗi con.

Chuỗi Redis là các chuỗi động có thể được sửa đổi. Cấu trúc bên trong tương tự như ArrayList của Java. Nó sử dụng không gian dự phòng được phân bổ trước để giảm việc phân bổ bộ nhớ thường xuyên. của một chuỗi thường cao hơn độ dài chuỗi thực tế len. Khi độ dài chuỗi nhỏ hơn 1M, việc mở rộng sẽ tăng gấp đôi không gian hiện có. Nếu vượt quá 1M, việc mở rộng sẽ chỉ mở rộng không gian thêm 1M mỗi lần. Cần lưu ý rằng độ dài tối đa của chuỗi là 512M.
Chuỗi khởi tạo cần cung cấp "tên biến" và "nội dung biến".
- > bộ ireader Bắc Kinh.chương nguyệt.thứ hai.ngốc nghếch.youxian.gongsi
- ĐƯỢC RỒI
Lấy nội dung của chuỗi được cung cấp "tên biến".
- > lấy máy đọc sách
- "beijing.zhangyue.keji.gufen.youxian.gongsi"
Lấy độ dài của chuỗi bằng cách cung cấp "tên biến".
- > strlen ireader
- (số nguyên) 42
Lấy chuỗi con bằng cách cung cấp "tên biến" và vị trí bắt đầu và kết thúc [bắt đầu, kết thúc].
- > ireader chật chội 28 34
- "youxian"
Chuỗi con ghi đè cung cấp "tên biến" cũng như vị trí bắt đầu và chuỗi con đích.
- > thiết lập phạm vi ireader 28 người woxian
- (số nguyên) 42 # Trả về độ dài
- > lấy máy đọc sách
- "beijing.zhangyue.keji.gufen.wooxian.gongsi"
Thêm trứng xiên.
- > thêm ireader .những thứ kia
- (số nguyên) 46 # Trả về độ dài
- > lấy máy đọc sách
- "beijing.zhangyue.keji.gufen.wooxian.gongsi.hao"
Thật không may, chuỗi không cung cấp phương thức chèn chuỗi và phương thức xóa chuỗi con.
Bộ đếm Nếu nội dung của chuỗi là số nguyên thì chuỗi đó cũng có thể được sử dụng làm bộ đếm.
- > bộ máy đọc sách 42
- ĐƯỢC RỒI
- > lấy máy đọc sách
- "42"
- > tăng lên bởi ireader 100
- (số nguyên) 142
- > lấy máy đọc sách
- "142"
- > decrby ireader 100
- (số nguyên) 42
- > lấy máy đọc sách
- "42"
- > tăng ireader # Tương đương với incby ireader 1
- (số nguyên) 43
- > giảm ireader # Tương đương với decrby ireader 1
- (số nguyên) 42
Bộ đếm có phạm vi, không thể vượt quá Long.Max và không thể thấp hơn Long.MIN.
- > bộ máy đọc sách 9223372036854775807
- ĐƯỢC RỒI
- > tăng ireader
- (lỗi) Tăng ERR hoặc giảm sẽ tràn
- > bộ máy đọc sách -9223372036854775808
- ĐƯỢC RỒI
- > giảm ireader
- (lỗi) Tăng ERR hoặc giảm sẽ tràn
Các chuỗi đã hết hạn và đã xóa có thể được xóa chủ động bằng lệnh del. Bạn có thể sử dụng lệnh hết hạn để đặt thời gian hết hạn. Khi đến thời gian hết hạn, chúng sẽ tự động bị xóa. Thời gian tồn tại của một chuỗi có thể đạt được bằng cách sử dụng lệnh ttl.
- > hết hạn ireader 60
- (số nguyên) 1 # 1 nghĩa là cài đặt thành công, 0 nghĩa là biến ireader không tồn tại
- > ttl máy đọc sách
- (số nguyên) 50 # Vẫn còn 50 giây thời gian. Trả về -2 nghĩa là biến không tồn tại và -1 nghĩa là thời gian hết hạn chưa được đặt.
- > của máy đọc sách
- (số nguyên) 1 #Trả về 1 nếu xóa thành công
- > lấy máy đọc sách
- (không) # Biến ireader không còn nữa
danh sách .

Redis đặt tên danh sách cấu trúc dữ liệu danh sách thay vì mảng vì cấu trúc lưu trữ của danh sách sử dụng danh sách liên kết thay vì mảng và danh sách liên kết cũng là danh sách liên kết đôi. Vì là danh sách liên kết nên hiệu suất định vị ngẫu nhiên yếu và hiệu suất chèn và xóa từ đầu đến cuối sẽ tốt hơn. Nếu độ dài danh sách rất dài, chúng ta phải chú ý đến độ phức tạp về thời gian của các thao tác liên quan đến danh sách liên kết khi sử dụng nó.
Vị trí của phần tử trong danh sách liên kết chỉ số âm được biểu thị bằng các số tự nhiên 0,1,2,...n-1. Nó cũng có thể được biểu thị bằng các số âm -1,-2,...-n -. 1 có nghĩa là "cuối cùng từ cuối" và -2 có nghĩa là ""Thứ hai đến cuối cùng", khi đó -n đại diện cho phần tử đầu tiên và chỉ số dưới tương ứng là 0.
Danh sách liên kết hàng đợi/ngăn xếp có thể thêm và xóa các phần tử khỏi đầu và cuối bảng bằng cách sử dụng kết hợp bốn lệnh rpush/rpop/lpush/lpop, danh sách liên kết có thể được sử dụng làm hàng đợi hoặc ngăn xếp và có thể được sử dụng. thực hiện từ trái sang phải.
- # Ngay vào, trái ra
- > rpush ireader đi
- (số nguyên) 1
- > rpush ireader java python
- (số nguyên) 3
- > lpop ireader
- "đi"
- > lpop ireader
- "java"
- > lpop ireader
- "trăn"
- #Trái vào và phải ra
- > lpush ireader đi java python
- (số nguyên) 3
- > rpop ireader
- "đi"
- ...
- # Vào và ra ngay
- > rpush ireader đi java python
- (số nguyên) 3
- > rpop ireader
- "trăn"
- ...
- #Bỏ vào, bỏ ra
- > lpush ireader đi java python
- (số nguyên) 3
- > lpop ireader
- "trăn"
- ...
Trong các ứng dụng hàng ngày, danh sách thường được sử dụng làm hàng đợi không đồng bộ.
Sử dụng lệnh llen để lấy độ dài của danh sách liên kết.
- > rpush ireader đi java python
- (số nguyên) 3
- > llen ireader
- (số nguyên) 3
Đọc ngẫu nhiên có thể sử dụng lệnh lindex để truy cập phần tử tại vị trí đã chỉ định, sử dụng lệnh lrange để lấy danh sách các phần tử con của danh sách liên kết và cung cấp các tham số chỉ số bắt đầu và kết thúc.
- > rpush ireader đi java python
- (số nguyên) 3
- > lindex ireader 1
- "java"
- > máy đọc sách ireader 0 2
- 1) "đi"
- 2) "java"
- 3) "trăn"
- > máy đọc sách ireader 0 -1 # -1 có nghĩa là cái cuối cùng
- 1) "đi"
- 2) "java"
- 3) "trăn"
Khi sử dụng lrange để lấy tất cả các phần tử, bạn cần cung cấp end_index. Nếu không có chỉ số dưới âm, trước tiên bạn cần lấy độ dài thông qua lệnh llen trước khi có thể nhận được giá trị của end_index. Với chỉ số dưới âm, hãy sử dụng -1 thay vì. end_index để đạt được kết quả tương tự.
Để sửa đổi một phần tử, sử dụng lệnh lset để sửa đổi phần tử tại một vị trí được chỉ định.
- > rpush ireader đi java python
- (số nguyên) 3
- > lset ireader 1 javascrip
- ĐƯỢC RỒI
- > máy đọc sách ireader 0 -1
- 1) "đi"
- 2) "javascript"
- 3) "trăn"
Để chèn các phần tử, hãy sử dụng lệnh linsert để chèn các phần tử vào giữa danh sách. Các lập trình viên có kinh nghiệm biết rằng khi chèn các phần tử, chúng ta thường không biết nên chèn chúng vào trước hay sau vị trí đã chỉ định, vì vậy antirez đã thêm một hướng tới lệnh Linsert Các tham số trước/sau được sử dụng để biểu thị trước và sau khi chèn. Tuy nhiên, điều bất ngờ là lệnh linsert không chèn bằng cách chỉ định vị trí mà bằng cách chỉ định một giá trị cụ thể. Điều này là do trong môi trường phân tán, các thành phần của danh sách luôn thay đổi thường xuyên, điều đó có nghĩa là chỉ số dưới của phần tử được tính ở thời điểm trước đó có thể không phải là chỉ số dưới mà bạn mong đợi ở thời điểm tiếp theo.
- > rpush ireader đi java python
- (số nguyên) 3
- > linsert ireader trước java ruby
- (số nguyên) 4
- > máy đọc sách ireader 0 -1
- 1) "đi"
- 2) "hồng ngọc"
- 3) "java"
- 4) "trăn"
Cho đến nay, tôi vẫn chưa tìm thấy bất kỳ kịch bản ứng dụng cụ thể nào để chèn vào các ứng dụng thực tế.
Thao tác xóa danh sách phần tử không xác định phần tử bằng cách chỉ định chỉ số dưới. Bạn cần chỉ định số lần xóa tối đa và giá trị của phần tử.
- > rpush ireader đi java python
- (số nguyên) 3
- > lrem ireader 1 java
- (số nguyên) 1
- > máy đọc sách ireader 0 -1
- 1) "đi"
- 2) "trăn"
Danh sách có độ dài cố định Trong các tình huống ứng dụng thực tế, đôi khi chúng ta gặp phải nhu cầu về "danh sách có độ dài cố định". Ví dụ: nếu bạn muốn hiển thị danh sách tên người dùng chiến thắng theo thời gian thực dưới dạng cửa quay, vì có quá nhiều người dùng chiến thắng nên số lượng có thể hiển thị thường không vượt quá 100, do đó, độ dài cố định danh sách sẽ được sử dụng ở đây. Hướng dẫn duy trì danh sách có độ dài cố định là ltrim. Cần phải cung cấp hai tham số, bắt đầu và kết thúc, cho biết rằng phạm vi chỉ số dưới của danh sách cần được giữ lại và tất cả các phần tử nằm ngoài phạm vi đó sẽ bị xóa.
- > rpush ireader go java python javascript ruby erlang rust cpp
- (số nguyên) 8
- > ltrim ireader -3 -1
- ĐƯỢC RỒI
- > máy đọc sách ireader 0 -1
- 1) "erlang"
- 2) "gỉ"
- 3) "cpp"
Nếu chỉ số thực tương ứng với phần cuối của tham số đã chỉ định nhỏ hơn phần bắt đầu, thì hiệu ứng tương đương với lệnh del, bởi vì tham số như vậy chỉ ra rằng phạm vi chỉ số dưới của thành phần danh sách cần được giữ trống.
Danh sách nhanh.

Nếu tìm hiểu sâu hơn một chút, bạn sẽ thấy rằng bộ lưu trữ cơ bản của Redis không phải là một danh sách liên kết đơn giản mà là một cấu trúc được gọi là danh sách liên kết nhanh. Đầu tiên, khi các thành phần của danh sách có kích thước nhỏ, bộ nhớ lưu trữ liên tục sẽ được sử dụng. Cấu trúc này là ziplist, là một danh sách nén. Nó lưu trữ tất cả các phần tử gần nhau và phân bổ một bộ nhớ liền kề. Khi lượng dữ liệu tương đối lớn sẽ được chuyển thành danh sách nhanh. Vì không gian con trỏ bổ sung mà danh sách liên kết thông thường yêu cầu quá lớn nên sẽ lãng phí không gian. Ví dụ: danh sách này chỉ lưu trữ dữ liệu kiểu int và cấu trúc yêu cầu hai con trỏ bổ sung, prev và next. Vì vậy Redis kết hợp danh sách liên kết và danh sách zip để tạo thành danh sách nhanh. Nghĩa là, nhiều danh sách zip được xâu chuỗi lại với nhau bằng con trỏ hai chiều. Điều này không chỉ đáp ứng hiệu suất chèn và xóa nhanh mà còn không gây dư thừa dung lượng quá nhiều.
băm 。

Hash tương đương với HashMap trong ngôn ngữ Java hoặc dict trong ngôn ngữ Python. Về cấu trúc triển khai, nó sử dụng cấu trúc hai chiều. Chiều thứ nhất là một mảng và chiều thứ hai là danh sách liên kết. được lưu trữ trong danh sách liên kết. Mảng được lưu trữ ở đây là con trỏ đầu của danh sách liên kết. Khi tìm kiếm các phần tử theo khóa, trước tiên hãy tính mã băm của khóa, sau đó sử dụng mã băm để điều chỉnh độ dài của mảng để xác định vị trí đầu của danh sách liên kết, sau đó duyệt qua danh sách liên kết để thu được giá trị tương ứng. danh sách liên kết là để tạo ra Các phần tử "xung đột băm" được xâu chuỗi lại với nhau. Các nhà phát triển ngôn ngữ Java sẽ cảm thấy rất quen thuộc, vì cấu trúc này không khác gì HashMap. Độ dài chiều thứ nhất của mảng băm cũng là 2^n.

Để thêm các phần tử, bạn có thể sử dụng hset để thêm một cặp khóa-giá trị cùng một lúc hoặc bạn có thể sử dụng hmset để thêm nhiều cặp khóa-giá trị cùng một lúc.
- > hset ireader chạy nhanh
- (số nguyên) 1
- > hmset ireader java nhanh python chậm
- ĐƯỢC RỒI
Để lấy các phần tử, bạn có thể sử dụng hget để xác định giá trị tương ứng với một khóa cụ thể. Bạn có thể sử dụng hmget để lấy giá trị tương ứng với nhiều khóa. Bạn có thể sử dụng hgetall để lấy tất cả các cặp khóa-giá trị. có được tất cả các danh sách khóa và danh sách giá trị tương ứng. Các thao tác này tương tự như giao diện Map của ngôn ngữ Java.
- > hmset ireader chạy nhanh java nhanh python chậm
- ĐƯỢC RỒI
- > hget ireader đi
- "nhanh"
- > hmget ireader đi python
- 1) "nhanh"
- 2) "chậm"
- > hgetall ireader
- 1) "đi"
- 2) "nhanh"
- 3) "java"
- 4) "nhanh"
- 5) "trăn"
- 6) "chậm"
- > phím hkey ireader
- 1) "đi"
- 2) "java"
- 3) "trăn"
- > máy đọc cá voi
- 1) "nhanh"
- 2) "nhanh"
- 3) "chậm"
Để xóa phần tử, bạn có thể sử dụng hdel để xóa key được chỉ định. hdel hỗ trợ xóa nhiều key cùng lúc.
- > hmset ireader chạy nhanh java nhanh python chậm
- ĐƯỢC RỒI
- > hdel ireader đi
- (số nguyên) 1
- > hdel ireader java python
- (số nguyên) 2
Để xác định xem một phần tử có tồn tại hay không, chúng ta thường sử dụng hget để biết liệu giá trị tương ứng với khóa có trống hay không cho đến khi phần tử tương ứng tồn tại. Tuy nhiên, nếu độ dài chuỗi của giá trị đặc biệt lớn thì sẽ hơi lãng phí khi xác định xem phần tử đó có tồn tại hay không. phần tử tồn tại theo cách này. Bạn có thể sử dụng lệnh hexists vào lúc này.
- > hmset ireader chạy nhanh java nhanh python chậm
- ĐƯỢC RỒI
- > hexists ireader đi
- (số nguyên) 1
Cấu trúc băm bộ đếm cũng có thể được sử dụng làm bộ đếm và mỗi khóa bên trong có thể được sử dụng làm bộ đếm độc lập. Nếu giá trị không phải là số nguyên, việc gọi lệnh hincrby sẽ gây ra lỗi.
- > hincrby ireader đi 1
- (số nguyên) 1
- > hincrby ireader python 4
- (số nguyên) 4
- > hincrby ireader java 4
- (số nguyên) 4
- > hgetall ireader
- 1) "đi"
- 2) "1"
- 3) "trăn"
- 4) "4"
- 5) "java"
- 6) "4"
- > hset ireader rust tốt
- (số nguyên) 1
- > hincrby ireader gỉ 1
- (lỗi) Giá trị băm ERR là không một số nguyên
Mở rộng Khi các phần tử bên trong hàm băm đông đúc (xung đột hàm băm thường xuyên xảy ra), cần phải mở rộng. Việc mở rộng yêu cầu áp dụng một mảng mới có kích thước gấp đôi, sau đó phân bổ lại tất cả các cặp khóa-giá trị vào danh sách được liên kết tương ứng với chỉ mục mảng mới (làm lại). Nếu cấu trúc băm lớn, chẳng hạn như hàng triệu cặp khóa-giá trị, thì quá trình băm lại hoàn chỉnh sẽ mất nhiều thời gian. Điều này hơi căng thẳng đối với Redis đơn luồng. Do đó, Redis áp dụng giải pháp làm lại lũy tiến. Nó sẽ giữ lại cả cấu trúc băm cũ và mới cùng một lúc, đồng thời di chuyển dần dần các phần tử của cấu trúc cũ sang cấu trúc mới trong các tác vụ được lên lịch tiếp theo và các hướng dẫn đọc và ghi cấu trúc băm. Điều này có thể tránh được tình trạng trễ luồng do mở rộng.
Thu hẹp cấu trúc băm của Redis không chỉ mở rộng mà còn thu nhỏ. Từ quan điểm này, nó mạnh hơn HashMap của Java, vốn chỉ mở rộng. Nguyên tắc thu gọn cũng giống như nguyên tắc mở rộng, ngoại trừ kích thước của mảng mới nhỏ hơn hai lần so với mảng cũ.
bộ .
Các lập trình viên Java đều biết rằng việc triển khai nội bộ của HashSet sử dụng HashMap, nhưng tất cả các giá trị đều trỏ đến cùng một đối tượng. Điều này cũng đúng với cấu trúc tập hợp của Redis. Nó cũng sử dụng cấu trúc băm bên trong và tất cả các giá trị đều trỏ đến cùng một giá trị bên trong.
Việc thêm phần tử cho phép bạn thêm nhiều phần tử cùng một lúc.
- > sadd ireader đi java python
- (số nguyên) 3
Để đọc các phần tử, hãy sử dụng smembers để liệt kê tất cả các phần tử, sử dụng Scard để lấy độ dài bộ sưu tập và sử dụng srandmember để lấy các phần tử đếm ngẫu nhiên. Nếu tham số count không được cung cấp thì mặc định là 1.
- > sadd ireader đi java python
- (số nguyên) 3
- > smembers ireader
- 1) "java"
- 2) "trăn"
- 3) "đi"
- > máy đọc sách điện tử
- (số nguyên) 3
- > thành viên srand ireader
- "java"
Để xóa các phần tử, sử dụng srem để xóa một hoặc nhiều phần tử và sử dụng spop để xóa một phần tử ngẫu nhiên.
- > sadd ireader đi java python rust erlang
- (số nguyên) 5
- > srem ireader đi java
- (số nguyên) 2
- > trình đọc nhạc pop
- "erlang"
Để xác định xem một phần tử có tồn tại hay không, hãy sử dụng lệnh sismember, lệnh này chỉ có thể nhận một phần tử duy nhất.
- > sadd ireader đi java python rust erlang
- (số nguyên) 5
- > sismember ireader gỉ sét
- (số nguyên) 1
- > sismember ireader javascript
- (số nguyên) 0
tập đã sắp xếp.

SortedSet (zset) là một cấu trúc dữ liệu rất đặc biệt do Redis cung cấp. Một mặt, nó tương đương với cấu trúc dữ liệu Map của Java. Mặt khác, nó có thể gán điểm trọng số cho từng giá trị phần tử. Tương tự như trong TreeSet, các phần tử bên trong sẽ được sắp xếp theo điểm trọng số. Bạn có thể lấy thứ hạng của từng phần tử và cũng có thể lấy danh sách các phần tử thông qua phạm vi điểm.
Việc triển khai cơ bản của zset sử dụng hai cấu trúc dữ liệu. Đầu tiên là hàm băm và thứ hai là danh sách nhảy. Chức năng của hàm băm là liên kết giá trị phần tử và điểm trọng số để đảm bảo tính duy nhất của giá trị phần tử. value có thể được tìm thấy thông qua phần tử value . Mục đích của danh sách nhảy là sắp xếp các giá trị phần tử và lấy danh sách phần tử theo phạm vi của điểm.
Để thêm các phần tử, bạn có thể thêm một hoặc nhiều cặp giá trị/điểm thông qua lệnh zadd, với điểm được đặt ở phía trước.
- > zadd ireader 4.0 trăn
- (số nguyên) 1
- > zadd ireader 4.0 java 1.0 đi
- (số nguyên) 2
Độ dài có thể được lấy bằng lệnh zcard. Có thể lấy được số phần tử của zset.
- > máy đọc thẻ zcard
- (số nguyên) 3
Xóa các phần tử Bạn có thể xóa các phần tử trong zset thông qua lệnh zrem và bạn có thể xóa nhiều phần tử cùng một lúc.
- > zrem ireader đi python
- (số nguyên) 2
Bộ đếm giống như cấu trúc băm và zset cũng có thể được sử dụng làm bộ đếm.
- > zadd ireader 4.0 trăn 4.0 java 1.0 đi
- (số nguyên) 3
- > zincrby ireader 1.0 trăn
- "5"
Lấy thứ hạng và điểm số Sử dụng lệnh zscore để lấy trọng số của phần tử đã chỉ định, sử dụng lệnh zrank để lấy thứ hạng chuyển tiếp của phần tử đã chỉ định và sử dụng lệnh zrevrank để lấy thứ hạng ngược [đầu tiên từ cuối] của phần tử đó. phần tử được chỉ định. Chiều dương từ nhỏ đến lớn, chiều âm từ lớn đến nhỏ.
- > zscore ireader python
- "5"
- > zrank ireader đi # Những người có điểm thấp sẽ có giá trị xếp hạng nhỏ trước khi làm bài thi.
- (số nguyên) 0
- > zrank ireader java
- (số nguyên) 1
- > zrank ireader python
- (số nguyên) 2
- > zrevrank ireader python
- (số nguyên) 0
Lấy danh sách phần tử dựa trên phạm vi xếp hạng. Chỉ định tham số phạm vi xếp hạng bằng lệnh zrange để lấy danh sách phần tử tương ứng. Bạn cũng có thể lấy trọng số của phần tử bằng cách mang tham số withscores. Lấy danh sách các phần tử theo thứ tự âm [đối ứng] thông qua lệnh zrevrange. Chiều dương từ nhỏ đến lớn, chiều âm từ lớn đến nhỏ.
- > ireader zrange 0 -1 # Lấy tất cả các phần tử
- 1) "đi"
- 2) "java"
- 3) "trăn"
- > ireader zrange 0 -1 với điểm số
- 1) "đi"
- 2) "1"
- 3) "java"
- 4) "4"
- 5) "trăn"
- 6) "5"
- > ireader tầm xa 0 -1 với điểm số
- 1) "trăn"
- 2) "5"
- 3) "java"
- 4) "4"
- 5) "đi"
- 6) "1"
Lấy danh sách dựa trên phạm vi điểm Chỉ định phạm vi điểm thông qua chỉ thị zrangebyscore để có được danh sách thành phần tương ứng. Lấy danh sách phần tử đảo ngược thông qua lệnh zrevrangebyscore. Chiều dương từ nhỏ đến lớn, chiều âm từ lớn đến nhỏ. Tham số -inf đại diện cho vô cực âm và +inf đại diện cho vô cực dương.
- > zrangebyscore ireader 0 5
- 1) "đi"
- 2) "java"
- 3) "trăn"
- > zrangebyscore ireader -thông tin +inf với điểm số
- 1) "đi"
- 2) "1"
- 3) "java"
- 4) "4"
- 5) "trăn"
- 6) "5"
- > zrevrangebyscore ireader +thông tin -inf với điểm số #Lưu ý dương và âm đảo ngược nhau
- 1) "trăn"
- 2) "5"
- 3) "java"
- 4) "4"
- 5) "đi"
- 6) "1"
Việc xóa danh sách các phần tử dựa trên phạm vi có thể được thực hiện thông qua phạm vi xếp hạng hoặc thông qua phạm vi điểm để xóa nhiều phần tử cùng một lúc.
- > zremrangebyrank ireader 0 1
- (số nguyên) 2 # 2 phần tử đã bị xóa
- > zadd ireader 4.0 java 1.0 đi
- (số nguyên) 2
- > zremrangebyscore ireader -thông tin 4
- (số nguyên) 2
- > ireader zrange 0 -1
- 1) "trăn"
Chức năng sắp xếp bên trong của danh sách nhảy zset được thực hiện thông qua cấu trúc dữ liệu "danh sách nhảy". Người đọc phải chuẩn bị tinh thần về chiều sâu nội dung trong phần này.
Vì zset cần hỗ trợ chèn và xóa ngẫu nhiên nên việc sử dụng một mảng để biểu diễn nó là không dễ dàng. Đầu tiên chúng ta hãy nhìn vào cấu trúc danh sách liên kết thông thường.

Chúng tôi cần danh sách liên kết này được sắp xếp theo giá trị điểm. Điều này có nghĩa là khi cần chèn một phần tử mới thì điểm chèn cần được đặt ở một vị trí cụ thể để danh sách liên kết có thể tiếp tục được sắp xếp. Thông thường chúng ta tìm điểm chèn thông qua tìm kiếm nhị phân, nhưng đối tượng của tìm kiếm nhị phân phải là mảng. Chỉ có mảng mới hỗ trợ định vị vị trí nhanh, còn danh sách liên kết thì không, vậy chúng ta phải làm sao?
Hãy nghĩ về một công ty khởi nghiệp. Ban đầu chỉ có một vài người trong nhóm đều bình đẳng và đều là người đồng sáng lập. Khi công ty phát triển và số lượng người tăng dần, chi phí giao tiếp trong nhóm cũng tăng lên. Lúc này hệ thống đội trưởng sẽ được đưa ra để phân chia đội. Mỗi đội sẽ có một đội trưởng. Các cuộc họp được tổ chức theo nhóm và nhiều trưởng nhóm sẽ có cách sắp xếp cuộc họp riêng. Khi công ty mở rộng hơn nữa, cần bổ sung thêm một cấp độ khác - mỗi phòng ban sẽ bầu một đại diện trong danh sách trưởng nhóm làm bộ trưởng. Các bộ trưởng cũng sẽ có cơ chế tổ chức các cuộc họp cấp cao riêng.
Danh sách nhảy tương tự như cấu trúc phân cấp này và tất cả các thành phần ở cấp dưới cùng sẽ được xâu chuỗi lại với nhau. Sau đó, chọn một đại diện cho mỗi phần tử, rồi xâu chuỗi các đại diện này lại với nhau bằng cách sử dụng một cấp độ con trỏ khác. Sau đó chọn các đại diện cấp hai từ những đại diện này và xâu chuỗi chúng lại với nhau. Cuối cùng một cấu trúc kim tự tháp đã được hình thành.
Hãy nghĩ về vị trí quê hương của bạn trên bản đồ thế giới: Châu Á->Trung Quốc->Tỉnh An Huy->Thành phố An Khánh->Quận Zongyang->Thị trấn Tanggou->Làng Tianjian->Không.

Lý do tại sao "danh sách nhảy" "nhảy" là do các phần tử bên trong có thể "đóng nhiều vai trò". Ví dụ: phần tử ở giữa hình trên nằm ở các lớp L0, L1 và L2 cùng một lúc, và có thể nhanh chóng "nhảy" giữa các cấp độ khác nhau".
Khi định vị điểm chèn, trước tiên hãy đặt điểm chèn ở cấp cao nhất, sau đó chuyển xuống cấp định vị tiếp theo, sau đó chuyển xuống cấp dưới cùng để tìm vị trí phù hợp và chèn phần tử mới. Bạn có thể hỏi làm thế nào các phần tử mới được chèn vào có cơ hội “đội nhiều mũ”?
Danh sách nhảy áp dụng chiến lược ngẫu nhiên để xác định phần tử mới có thể hoạt động bán thời gian ở lớp nào. Đầu tiên, lớp L0 phải là 100%, lớp L1 chỉ có xác suất 50%, lớp L2 chỉ có xác suất 25% , và lớp L3 chỉ có xác suất 12,5% Đi ngẫu nhiên lên lớp L31 trên cùng. Hầu hết các phần tử không vượt qua được một vài lớp và chỉ một số phần tử lọt sâu vào lớp trên cùng. Danh sách càng có nhiều yếu tố thì cấp độ càng sâu thì khả năng đạt đến cấp cao nhất càng cao.
Đến đây là kết thúc bài viết về hướng dẫn cơ bản về cấu trúc dữ liệu Redis dễ hiểu (bắt đầu). Để biết thêm các nội dung liên quan đến cấu trúc dữ liệu Redis, vui lòng tìm kiếm các bài viết trước của chúng tôi hoặc tiếp tục duyệt qua các bài viết liên quan bên dưới. tương lai tôi! .
Cuối cùng, bài viết về hướng dẫn cơ bản về cấu trúc dữ liệu Redis dễ hiểu (bắt đầu) kết thúc tại đây. Nếu bạn muốn biết thêm về hướng dẫn cơ bản về cấu trúc dữ liệu Redis dễ hiểu (bắt đầu), vui lòng tìm kiếm CFSDN. Hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!