hash

Redis的Hash有点像一个对象(object),一个Hash里面可以存多个Key-Value对作为它的field,所以它通常可以用来表示对象。

Hash里面能存放的值也能作为String类型来存储,如果Hash里面值的类型可以解析为数字,那么也可以进行自增自减等操作。

HSET HGET

HSET 设置Hash里面的值:

语法:HSET KEY_NAME FIELD VALUE

127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HGET myhash field1
"foo"

HMSET HMGET

HMSET:同时将多个 field-value (字段-值)对设置到哈希表中。

语法: HMSET KEY_NAME FIELD1 VALUE1 ...FIELDN VALUEN

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"

HGETALL

如果想获得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

HDEL key field1 [field2]

删除一个或多个哈希表字段

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

HEXISTS key field

查看哈希表 key 中,指定的字段是否存在。

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

HINCRBY

如果Hash里某个Field值的类型可以解析成数值,那么还可以用HINCRBY来做自增:

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

HINCRBYFLOAT key field increment

为哈希表 key 中的指定字段的浮点数值加上增量 increment 。

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

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

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

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

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)

用.NET Core操练HASH

准备工作

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

HSCAN key cursor [MATCH pattern] [COUNT count]

迭代哈希表中的键值对。

http://www.redis.cn/commands/hscan.html

参考:

草根专栏,Redis in .NET Core 入门:(3) Hash

runoob,Redis 哈希(Hash)

Redis实战 - 3.Hash的更多相关文章

  1. Linux+Redis实战教程_day02_3、redis数据类型_4、String命令_5、hash命令_6、java操作redis数据库技术

    3. redis数据类型[重点] redis 使用的是键值对保存数据.(map) key:全部都是字符串 value:有五种数据类型 Key名:自定义,key名不要过长,否则影响使用效率 Key名不要 ...

  2. (转)国内外三个不同领域巨头分享的Redis实战经验及使用场景

    随着应用对高性能需求的增加,NoSQL逐渐在各大名企的系统架构中生根发芽.这里我们将为大家分享社交巨头新浪微博.传媒巨头Viacom及图片分享领域佼佼者Pinterest带来的Redis实践,首先我们 ...

  3. Redis实战

    大约一年多前,公司同事开始使用Redis,不清楚是配置,还是版本的问题,当时的Redis经常在使用一段时间后,连接爆满且不释放.印象中,Redis 2.4.8以下的版本由于设计上的主从库同步问题,就会 ...

  4. Redis实战之征服 Redis + Jedis + Spring (一)

    Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: Redis实战 Re ...

  5. Redis实战经验及使用场景

    随着应用对高性能需求的增加,NoSQL逐渐在各大名企的系统架构中生根发芽.这里我们将为大家分享社交巨头新浪微博.传媒巨头Viacom及图片分享领域佼佼者Pinterest带来的Redis实践,首先我们 ...

  6. 【SpringBoot】整合Redis实战

    ========================9.SpringBoot2.x整合Redis实战 ================================ 1.分布式缓存Redis介绍 简介: ...

  7. SpringBoot2.x整合Redis实战 4节课

    1.分布式缓存Redis介绍      简介:讲解为什么要用缓存和介绍什么是Redis,新手练习工具 1.redis官网 https://redis.io/download          2.新手 ...

  8. Redis实战总结-Redis的高可用性

    在之前的博客<Redis实战总结-配置.持久化.复制>给出了一种Redis主从复制机制,简单地实现了Redis高可用.然后,如果Master服务器宕机,会导致整个Redis瘫痪,这种方式的 ...

  9. Redis实战:如何构建类微博的亿级社交平台

    微博及 Twitter 这两大社交平台都重度依赖 Redis 来承载海量用户访问.本文介绍如何使用 Redis 来设计一个社交系统,以及如何扩展 Redis 让其能够承载上亿用户的访问规模. 虽然单台 ...

随机推荐

  1. git的命令行输出正确地显示中文文件名

    参考:https://stackoverflow.com/questions/22827239/how-to-make-git-properly-display-utf-8-encoded-pathn ...

  2. P4178 Tree(点分治)

    题面要求小于等于K的路径数目,我么很自然的想到点分治(不会的就戳我) 这道题的统计答案与模板题不一样的地方是由等于K到小于等于K 那么我们可以把每一个子节点到当前根(重心)的距离排序,然后用类似双指针 ...

  3. 小白月赛13 B小A的回文串 (马拉车算法求最长回文子串)

    链接:https://ac.nowcoder.com/acm/contest/549/B来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  4. 互联网+ 何人能挡?带着你的Code飞奔吧!

    Python方向: 早期方向 Web全栈 擅长专栏 爬虫系列 数据分析 人工智能 物联网系(lot万物互联)[逆天很看好未来的前景] 自动化运维(安全与测试) 其他系列 游戏开发(最近很火) 导航栏: ...

  5. 初探VUX(基本官网上无特别无干货)

    vux@2.x 推荐webpack+vue-loader方式的开发. 第一步安装cli依赖 npm install vue-cli -g 接下来创建项目注意名称是小写 cd projectPath y ...

  6. seq2seq

    seq2seq: seq2seq就是将输入序列经过encoder-decoder变成目标序列. 如图所示,输入序列是 [A, B, C, <EOS>],输出序列是  [W, X, Y, Z ...

  7. express起一个代理服务器,webpack-dev-server同时起多个

    由于系统业务比较复杂,微前端(多页应用)实现期望用一个app一个webpack的形式,这样可以更好隔离,而且每个app的webpack config可以定制. Nginx在前端项目中安装比较麻烦,所以 ...

  8. Airflow 重跑dag中部分失败的任务

    重跑dag中部分失败的任务 例如 dagA 中, T1 >> T2 >> T3 >> T4 >> T5  ,其中 T1 T2 成功, T3 失败, T4 ...

  9. Angular记录(8)

    文档资料 箭头函数--MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_fun ...

  10. CSS定位 深入理解定位(position)的偏移

    前言 CSS有三种基本的布局机制:普通流.浮动和绝对定位.利用定位,可以准确地定义元素框相对于其正常位置应该出现的位置,或者相对于父元素.另一个元素甚至浏览器窗口本身的位置.但元素究竟如何定位,定位到 ...