Redisのハッシュキー(データ構造の論文)

ハッシュ(ハッシュ)

しきい値対を複数記憶します。
複数のフィールド(フィールド値のペア)組成、及びハッシュ値フィールドのハッシュ値は、文字、整数、浮動小数点、またはバイナリデータであってもよいです。一意である必要がありハッシュ各ドメインは、互いに異なって、このフィールドの値は、換言すれば、異なるドメインの値を複製することができ、必要とされません。コマンドは、ユーザがハッシュの閾値を設定することができる他の操作があるかどうか、ドメインを獲得するために、ドメインチェックを実行し、また、ドメインハッシュRedisのリターンのすべては、すべての値またはすべてのドメイン値のペアを含むことができます。
ここに画像を挿入説明

基本操作

値関連付けられたフィールド値、ドメインは、フィールド値の数を取得し、存在しているかどうかをチェックする、というように、ドメインを得ます。

関連性値

HSETキーフィールド値
与えられた値フィールドおよび値に関連付けられたキーフィールドにハッシュ・キーです。
何のドメインフィールドの前に値が関連付けられている場合、コマンドは1を返しますが、
ドメインは、フィールド値を関連付けられている場合、このコマンドは新しい値を返す0で古い値を上書きしません。複雑さはO(1)です。

redis> HSET message "id" 10086
(integer) 1
redis> HSET message "sender" "peter"
(integer) 1
redis> HSET message "receiver" "jack"
(integer) 1

ここに画像を挿入説明

ドメインに関連付けられている値を取得します。

HGETキーフィールドは
、キー値のハッシュキー、関連するドメインフィールドを返します。ドメインは、フィールド値を関連付けられていない場合は、nilを返します。複雑さはO(1)です。

redis> HGET message "id"
"10086"
redis> HGET message "sender"
"peter"
redis> HGET message "content"
"Good morning, jack!"
redis> HGET message "NotExistsField"
(nil)

ここに画像を挿入説明

唯一のドメインが存在しない場合、関連するフィールド値

HSETNXキーフィールド値
キーにハッシュキーは、ドメインフィールドが存在しない場合(すなわち、まだ関連付けられた値)が、所定の閾値フィールド値の関連。
ドメインフィールドはすでにそれに関連付けられた値を持っている場合、アクションコマンドを実行しません。
複雑さはO(1)です。

redis> HSETNX message "content" "Good morning, jack!"
(integer) 1
redis> HSETNX message "content" "Good morning, jack!"
(integer) 0

ここに画像を挿入説明

ドメインが存在して確認してください

HEXISTSキーフィールド
キーハッシュキー、与えられたドメインフィールドの有無を表示します。リターンがあり、ゼロへの復帰はありません。複雑さはO(1)です。

redis> HEXISTS message "id"
(integer) 1
redis> HEXISTS message "sender"
(integer) 1
redis> HEXISTS message "content"
(integer) 0
redis> HEXISTS message "NotExistsField"
(integer) 0

ここに画像を挿入説明

删除给定的域值对

HDEL key field [field …]
删除散列键 key 中的一个或多个指定域,以及那些域的值。
不存在的域将被忽略。命令返回被成功 删除的域值对数量。
复杂度为 O(N) ,N 为被删除的域值对数量。

redis> HDEL message "id"
(integer) 1
redis> HDEL message "receiver"
(integer) 1
redis> HDEL message "sender"
(integer) 1

ここに画像を挿入説明

获取散列包含的键值对数量

HLEN key
返回散列键 key 包含的域值对数量。
复杂度为 O(1) 。

redis> HLEN message
(integer) 4
redis> HDEL message "date"
(integer) 1
redis> HLEN message
(integer) 3

ここに画像を挿入説明

批量操作

一次对多个域、多个值或者多个域值对进行操作。

一次设置或获取散列中的多个域值对

ここに画像を挿入説明

redis> HMSET message "id" 10086 "sender" "peter" "receiver" "jack"
OK
redis> HMGET message "id" "sender" "receiver"
1) "10086"
2) "peter"
3) "jack"
获取散列包含的所有域、值、或者域值对

ここに画像を挿入説明
为什么命令叫 HKEYS 而不是 HFIELDS ?
对于散列来说,key 和 field 表示的是同一个意思,并且 key 比 field 更容易拼写,
所以 Redis 选择使用 HKEYS 来做命令的名字,而不是 HFIELDS 。

HKEYS、HVALS 和 HGETALL 示例
redis> HKEYS message
1) "id"
2) "sender"
3) "receiver"
4) "date"
5) "content"
redis> HVALS message
1) "10086"
2) "peter"
3) "jack"
4) "2014-8-3 3:25 p.m."
5) "Good morning, jack!"
redis> HGETALL message
1) "id" # 域
2) "10086" # 值
3) "sender" # 域
4) "peter" # 值
5) "receiver"
6) "jack"
7) "date"
8) "2014-8-3 3:25 p.m."
9) "content"
10) "Good morning, jack!"

ここに画像を挿入説明

数字操作

和字符串键的值一样,在散列里面,域的值也可以被解释为数字,并执行相应的数字操作。

对域的值执行自增操作

ここに画像を挿入説明
虽然 Redis 没有提供与以上两个命令相匹配的 HDECRBY 命令和 HDECRBYFLOAT 命令,但我们同样可以通过 将 increment 设为负数来达到做减法的效果。

redis> HINCRBY numbers x 100 # 域不存在,先将值初始化为 0 ,然后再执行 HINCRBY 操作
(integer) 100
redis> HINCRBY numbers x -50 # 传入负值,做减法
(integer) 50
redis> HINCRBYFLOAT numbers x 3.14 # 浮点数计算
"53.14"

散列键和字符串键

有一种似曾相识的感觉……

效果类似的命令

ここに画像を挿入説明

使用散列的好处(1):将数据放到同一个地方

散列可以让我们将一些相关的信息储存在同一个地方,而不是直接分散地 储存在整个数据库里面,这不 仅方便了数据管理,还可以尽量避免误操作发生。

 redis> MSET "id" 10086 
 "sender" "peter" 
 "receiver" "jack"
 OK
 redis> HMSET message 
 "id" 10086 
 "sender" "peter" 
 "receiver" "jack"
 OK

ここに画像を挿入説明

使用散列的好处(2):避免键名冲突

在介绍字符串键的时候,我们说过,可以在命名键的时候,使用分割符来避免命名冲突 ,但更好的办法是直接使用散列键来储存键值对数据。 举个例子,如果我们需要储存多条消息,那么我们可能会按照格式 message:::: 的方式来创建字符串键并储存数据,比如使用 message::12345::receiver 键来储存 id 为 12345 的消息的接收者,使用 message::10086::sender 键来储存 id 为 10086 的发送者,诸如此类。但更好的办法是直接使用 message: 散列键来表示消息信息,并将与消息有关的各 项信息储存到散列的各个域里面,比如 创建 message::12345 散列,并将该消息的各项信息储存分别储存到这个散列的id 域、receiver 域和 sender 域里面。这保证了数据库中每个键的作用都是固定的、单一的,储存的信息都是被隔离的,从而最大限度地避免键名冲突。

对比

以下两个数据库分别以字符串键和散列键两种形式保存了相同的信息,但是很明 显,使用字符串键的数据库创建的键数量多,而使用散列键的数据库创建的键数量则少。随着域数量的增加,使用散列会比使用字符串少 创建很多数据库键。
ここに画像を挿入説明

使用散列的好处(3):减少内存占用

在一般情况下,保存相同数量的 键值对信息,使用散列键比使用字符串键更节约内存。因为在数据库里面创建的每个键都带有数据库附加的管理信息(比如 这个键的类型、最后一次被访问的时间等等),所以数据库里面的键越多,服务器在储存附加管理信息方面耗 费的内存就越多,花在管理数据库键上的 CPU 也会越多。除此之外,当散列包含的域 值对数量比较少的时候,Redis 会自动使用一种占用内存非常少的数据结构来做散列的底层实现,在散列的数量比较多的时候,这一措施对减少内存有很大的帮助。

结论

それが節約メモリにも簡単にハッシュキー管理、回避の競合にキー名、およびだから可能な限り、そして、代わりに、店舗のキーと値のペアデータに文字列キーのハッシュキーを使用しようとします。
一部ではなく、文字列のキーの状況のハッシュキーを使用することはできません。

  1. 使用ビット動作コマンド:ので、Redisのは、現在、あなたがこれらの操作を使用したい場合は、あなただけの文字列キーを使用することができ、文字列のキーSETBIT、GETBIT、BITOPや他の操作をサポートしています。
  2. 時代遅れの機能を使用する:Redisの主要機能は、現在のキー操作だけで期限切れの有効期限ですが、古くなったデータの主要な機能を使いたい場合はそう、期限切れのドメインハッシュ操作することはできません、そして唯一のキーと値のペア文字列内に格納さ。キーの詳細については、プレゼンテーションの後に期限切れになります。
例:ハッシュ再実装カウンタを使用して

ここに画像を挿入説明

c = Counter('page-counter', redis_client) # 创建一个名为 page-counter 的计数器
c.incr() # => 1
c.incr() # => 2

正確に同じことを達成するための文字列キーとカウンターの前に機能やAPI、ことを除いて、これはすべてのカウンタを実現しますが、フィールド値内の同じハッシュに格納されているこのカウンタはカウンタです。このカウンターの完全なコードは、hash_counter.pyファイルを参照してください。

//hash_counter.py
# encoding: utf-8

# 保存所有计数器的散列键
COUNTER_KEY = 'hash-counter'

class Counter:

    def __init__(self, name, client):
        self.name = name
        self.client = client

    def incr(self, n=1):
        counter = self.client.hincrby(COUNTER_KEY, self.name, n)
        return int(counter)

    def decr(self, n=1):
        minus_n = -n
        counter = self.client.hincrby(COUNTER_KEY, self.name, minus_n)
        return int(counter)

    def reset(self, n=0):
        # 这里的代码带有竞争条件
        # 可以在学习了事务之后,回过头来进行修改
        counter = self.client.hget(COUNTER_KEY, self.name)
        if counter is None:
            counter = 0
        self.client.hset(COUNTER_KEY, self.name, n)
        return int(counter)

    def get(self):
        counter = self.client.hget(COUNTER_KEY, self.name)
        if counter is None:
            counter = 0
        return int(counter)

レビュー

ハッシュキーの以前の説明を思い出してください。

レビュー(1/2)

キーとハッシュ値からなる複数のフィールドのハッシュ値(フィールド値のペア)は、テキスト、整数、浮動小数点、またはバイナリデータです。
一意である必要があり、同じハッシュ内の各ドメインが、異なるドメインの値が重複することができます。
ハッシュキー管理は、キーの名前の衝突を回避し、また節約メモリにすることができ、便利ので、データの格納に文字列のキーハッシュキーと値のペアの代わりに使用してみてください。

レビュー(2/2)

ここに画像を挿入説明

217元記事公開 ・は 125個のように勝っ ビュー10000 +を

おすすめ

転載: blog.csdn.net/qq_39885372/article/details/104235137