当前位置: 首页 > news >正文

Redis实战 - 3.Hash

196558-20190414212625553-253789391.png

hash

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

Hash里面能存放的值也能作为String类型来存储,如果Hash里面值的类型可以解析为数字,那么也可以进行自增自减等操作。
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)

转载于:https://www.cnblogs.com/tangge/p/10702999.html

相关文章:

  • session的使用
  • C++ string使用
  • 外连接查询
  • C#中三层架构UI、BLL、DAL、Model实际操作
  • Opencart3.0 本地环境 前台无法提交订单
  • springcloud(六)-Ribbon配置自定义算法
  • NABCD分析---校园服务
  • go语言学习逻辑运算符if判断,iota的理解
  • actuator与spring-boot-admin 可以说的秘密
  • mongodb排序限制输出, 分组查询,爬虫连接mongodb
  • leetcode 刷题day1
  • Unity UGUI和特效(含粒子系统和3D Object)之间层级问题
  • 事件Event一
  • 高等代数
  • 【索引】索引的介绍与优化
  • 自己简单写的 事件订阅机制
  • Android开源项目规范总结
  • angular学习第一篇-----环境搭建
  • C++11: atomic 头文件
  • hadoop集群管理系统搭建规划说明
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JS函数式编程 数组部分风格 ES6版
  • SpiderData 2019年2月23日 DApp数据排行榜
  • SpringBoot 实战 (三) | 配置文件详解
  • Vultr 教程目录
  • 从0到1:PostCSS 插件开发最佳实践
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前端相关框架总和
  • 如何胜任知名企业的商业数据分析师?
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用API自动生成工具优化前端工作流
  • 我从编程教室毕业
  • 小程序button引导用户授权
  • ​Python 3 新特性:类型注解
  • #100天计划# 2013年9月29日
  • #define
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (2.2w字)前端单元测试之Jest详解篇
  • (3)STL算法之搜索
  • (Java)【深基9.例1】选举学生会
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (第27天)Oracle 数据泵转换分区表
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (汇总)os模块以及shutil模块对文件的操作
  • (十)T检验-第一部分
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)c++ std::pair 与 std::make
  • .bat批处理出现中文乱码的情况
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net core开源商城系统源码,支持可视化布局小程序
  • .net 反编译_.net反编译的相关问题