Redis的Hash有點像一個對象(object),一個Hash裏面能夠存多個Key-Value對做爲它的field,因此它一般能夠用來表示對象。html
Hash裏面能存放的值也能做爲String類型來存儲,若是Hash裏面值的類型能夠解析爲數字,那麼也能夠進行自增自減等操做。
redis
HSET 設置Hash裏面的值:
語法:HSET KEY_NAME FIELD VALUEsql
127.0.0.1:6379> HSET myhash field1 "foo" (integer) 1 redis 127.0.0.1:6379> HGET myhash field1 "foo"
HMSET:同時將多個 field-value (字段-值)對設置到哈希表中。
語法: HMSET KEY_NAME FIELD1 VALUE1 ...FIELDN VALUENnosql
HMGET:返回哈希表中,一個或多個給定字段的值
語法:HMGET KEY_NAME FIELD1...FIELDN工具
127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World" OK 127.0.0.1:6379> HMGET MYHASH field1 1) (nil) 127.0.0.1:6379> HMGET myhash field1 1) "Hello" 127.0.0.1:6379> HMGET myhash field1 field2 1) "Hello" 2) "World"
若是想得到Hash全部的Key-Value對,那就使用HGETALL:測試
127.0.0.1:6379> hgetall myhash 1) "field1" 2) "Hello" 3) "field2" 4) "World" 127.0.0.1:6379>
HDEL key field1 [field2]
刪除一個或多個哈希表字段this
redis 127.0.0.1:6379> HSET myhash field1 "foo" (integer) 1 redis 127.0.0.1:6379> HDEL myhash field1 (integer) 1 redis 127.0.0.1:6379> HDEL myhash field2 (integer) 0
HEXISTS key field
查看哈希表 key 中,指定的字段是否存在。.net
redis 127.0.0.1:6379> HSET myhash field1 "foo" (integer) 1 redis 127.0.0.1:6379> HEXISTS myhash field1 (integer) 1 redis 127.0.0.1:6379> HEXISTS myhash field2 (integer) 0
若是Hash裏某個Field值的類型能夠解析成數值,那麼還能夠用HINCRBY來作自增:code
127.0.0.1:6379> hincrby user:1000 age 1 (integer) 1 127.0.0.1:6379> hincrby user:1000 age 1 (integer) 2 127.0.0.1:6379> hincrby user:1000 age 1 (integer) 3 127.0.0.1:6379> hincrby user:1000 age -1 (integer) 2 127.0.0.1:6379>
HINCRBYFLOAT key field increment
爲哈希表 key 中的指定字段的浮點數值加上增量 increment 。htm
redis> HSET mykey field 10.50 (integer) 1 redis> HINCRBYFLOAT mykey field 0.1 "10.6" redis> HINCRBYFLOAT mykey field -5 "5.6" redis> HSET mykey field 5.0e3 (integer) 0 redis> HINCRBYFLOAT mykey field 2.0e2 "5200" redis>
HKEYS key
獲取全部哈希表中的字段
redis 127.0.0.1:6379> HSET myhash field1 "foo" (integer) 1 redis 127.0.0.1:6379> HSET myhash field2 "bar" (integer) 1 redis 127.0.0.1:6379> HKEYS myhash 1) "field1" 2) "field2"
HLEN key
獲取哈希表中字段的數量
redis 127.0.0.1:6379> HSET myhash field1 "foo" (integer) 1 redis 127.0.0.1:6379> HSET myhash field2 "bar" (integer) 1 redis 127.0.0.1:6379> HLEN myhash (integer) 2
HSETNX key field value
只有在字段 field 不存在時,設置哈希表字段的值。
若是哈希表不存在,一個新的哈希表被建立並進行 HSET 操做。
若是字段已經存在於哈希表中,操做無效。
若是 key 不存在,一個新哈希表被建立並執行 HSETNX 命令。
redis 127.0.0.1:6379> HSETNX myhash field1 "foo" (integer) 1 redis 127.0.0.1:6379> HSETNX myhash field1 "bar" (integer) 0 redis 127.0.0.1:6379> HGET myhash field1 "foo" redis 127.0.0.1:6379> HSETNX nosql key-value-store redis (integer) 1 redis 127.0.0.1:6379> HSETNX nosql key-value-store redis # 操做無效, key-value-store 已存在 (integer) 0
HVALS key
獲取哈希表中全部值
redis 127.0.0.1:6379> HSET myhash field1 "foo" (integer) 1 redis 127.0.0.1:6379> HSET myhash field2 "bar" (integer) 1 redis 127.0.0.1:6379> HVALS myhash 1) "foo" 2) "bar" # 空哈希表/不存在的key redis 127.0.0.1:6379> EXISTS not_exists (integer) 0 redis 127.0.0.1:6379> HVALS not_exists (empty list or set)
1.建一個Person類
class Person { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public DateTime JoinDate { get; set; } public int Age { get; set; } public decimal BankBlance { get; set; } }
2.而後從網上抄襲了一個C#對象
和Redis HashEntry[]
之間轉換的工具類:
static class RedisHelper { public static HashEntry[] ToHashEntries(this object obj) { PropertyInfo[] properties = obj.GetType().GetProperties(); return properties.Select(propertype => new HashEntry(propertype.Name, propertype.GetValue(obj).ToString())) .ToArray(); } public static T ConvertFromRedis<T>(this HashEntry[] hashEntries) { PropertyInfo[] properties = typeof(T).GetProperties(); var obj = Activator.CreateInstance(typeof(T)); foreach (var property in properties) { HashEntry entry = hashEntries.FirstOrDefault(g => g.Name.ToString().Equals(property.Name)); if(entry.Equals(new HashEntry())){ continue;} property.SetValue(obj, Convert.ChangeType(entry.Value.ToString(), property.PropertyType)); } return (T) obj; } }
static void Hash() { using (ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379")) { IDatabase db = redis.GetDatabase(); var person = new Person(); person.Id = 123; person.FirstName = "Nick"; person.LastName = "Carter"; person.JoinDate = new DateTime(2019,4,20); person.Age = 32; person.BankBlance = 567.43m; //1.HSET db.HashSet("user:123", person.ToHashEntries()); //2.HGETALL 獲取全部 HashEntry[] entries = db.HashGetAll("user:123"); foreach (HashEntry entry in entries) { Console.WriteLine(entry.Name); } Console.WriteLine(); //獲取這個對象 Console.WriteLine("獲取這個對象"); var thePerson = entries.ConvertFromRedis<Person>(); Console.WriteLine(thePerson.FirstName); //Nick Console.WriteLine(thePerson.Age); //32 Console.WriteLine(); //3.HGET 獲取一個 var age = db.HashGet("user:123", nameof(person.Age)); Console.WriteLine(age);//32 Console.WriteLine(); //4.HMGET 獲取多個 RedisValue[] values = db.HashGet("user:123", new RedisValue[] { nameof(person.Id), nameof(person.FirstName), nameof(person.Age), nameof(person.BankBlance), }); foreach (RedisValue redisValue in values) { Console.WriteLine(redisValue); } // 123 // Nick // 32 // 567.43 Console.WriteLine(); //5.HINCRBY 自增整數 var ageIncrement = db.HashIncrement("user:123", nameof(person.Age)); Console.WriteLine(ageIncrement); //33 ageIncrement = db.HashIncrement("user:123", nameof(person.Age),5); Console.WriteLine(ageIncrement); //38 Console.WriteLine(); //6.HDEL 刪除 var ageDelSuccess = db.HashDelete("user:123", nameof(person.Age)); Console.WriteLine(ageDelSuccess); //true var ageDel = db.HashGet("user:123", nameof(person.Age)); Console.WriteLine(ageDel); //null //7.HSCAN 迭代 IEnumerable<HashEntry> entriesEnumerable = db.HashScan("user:123"); foreach (HashEntry hashEntry in entriesEnumerable) { Console.WriteLine($"{hashEntry.Name}:{hashEntry.Value}"); } // Id: 123 // FirstName: Nick // LastName:Carter // JoinDate:2019 / 4 / 20 0:00:00 // BankBlance: 567.43 } }
HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的鍵值對。
http://www.redis.cn/commands/hscan.html
草根專欄,Redis in .NET Core 入門:(3) Hash
runoob,Redis 哈希(Hash)