Redis入门到通关之Hash命令

文章目录

  • ⛄介绍
  • ⛄命令
  • ⛄RedisTemplate API
    • ❄️❄️添加缓存
    • ❄️❄️设置过期时间(单独设置)
    • ❄️❄️添加一个Map集合
    • ❄️❄️提取所有的小key
    • ❄️❄️提取所有的value值
    • ❄️❄️根据key提取value值
    • ❄️❄️获取所有的键值对集合
    • ❄️❄️删除
    • ❄️❄️判断Hash中是否含有该值
  • ⛄RedisTemplate API 实战
    • ❄️❄️添加 put / putAll
    • ❄️❄️删除小Key
    • ❄️❄️删除大Key
    • ❄️❄️判断key是否存在
    • ❄️❄️获取
    • ❄️❄️增加散列hashKey的值(整型)
    • ❄️❄️获取key所对应的散列表的key
    • ❄️❄️获取key所对应的散列表的大小个数
    • ❄️ ❄️获取整个哈希存储的值
    • ❄️❄️获取整个哈希存储
    • ❄️❄️使用Cursor在key的hash中迭代,相当于迭代器。
  • ⛄应用场景


在这里插入图片描述

⛄介绍

Hash类型,也叫散列,其value是一个无序字典,类似于Java中的 HashMap 结构。

在这里插入图片描述


String 结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:

keyvalue
snow:user:1{“id”:1, “name”: “Snow”, “age”: 18}
snow:product:1{“id”:1, “name”: “Apple”, “price”: 9999}

Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD

在这里插入图片描述


⛄命令

Hash 类型的常见命令🌈🌈
HSET key field value:添加或者修改 hash 类型 key 的 field 的值
HGET key field:获取一个hash类型key的field的值
HMSET:批量添加多个hash类型key的field的值
HMGET:批量获取多个hash类型key的field的值
HGETALL:获取一个hash类型的key中的所有的field和value
HKEYS:获取一个hash类型的key中的所有的field
HVALS:获取一个hash类型的key中的所有的value
HINCRBY:让一个hash类型key的字段值自增并指定步长
HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行


⛄RedisTemplate API

❄️❄️添加缓存

//1、通过redisTemplate设置值
redisTemplate.boundHashOps("HashKey").put("SmallKey", "HashVaue");//2、通过BoundValueOperations设置值
BoundHashOperations hashKey = redisTemplate.boundHashOps("HashKey");
hashKey.put("SmallKey", "HashVaue");//3、通过ValueOperations设置值
HashOperations hashOps = redisTemplate.opsForHash();
hashOps.put("HashKey", "SmallKey", "HashVaue");

❄️❄️设置过期时间(单独设置)

HashMap<String, String> hashMap = new HashMap<>();
redisTemplate.boundHashOps("HashKey").putAll(hashMap );

注意:只能给大 KEY 设置过期时间, 小 KEY 不能拥有独立的过期时间.


❄️❄️添加一个Map集合

HashMap<String, String> hashMap = new HashMap<>();
redisTemplate.boundHashOps("HashKey").putAll(hashMap );

❄️❄️提取所有的小key

//1、通过redisTemplate获取值
Set keys1 = redisTemplate.boundHashOps("HashKey").keys();//2、通过BoundValueOperations获取值
BoundHashOperations hashKey = redisTemplate.boundHashOps("HashKey");
Set keys2 = hashKey.keys();//3、通过ValueOperations获取值
HashOperations hashOps = redisTemplate.opsForHash();
Set keys3 = hashOps.keys("HashKey");

❄️❄️提取所有的value值

//1、通过redisTemplate获取值
List values1 = redisTemplate.boundHashOps("HashKey").values();//2、通过BoundValueOperations获取值
BoundHashOperations hashKey = redisTemplate.boundHashOps("HashKey");
List values2 = hashKey.values();//3、通过ValueOperations获取值
HashOperations hashOps = redisTemplate.opsForHash();
List values3 = hashOps.values("HashKey");

❄️❄️根据key提取value值

//1、通过redisTemplate获取
String value1 = (String) redisTemplate.boundHashOps("HashKey").get("SmallKey");//2、通过BoundValueOperations获取值
BoundHashOperations hashKey = redisTemplate.boundHashOps("HashKey");
String value2 = (String) hashKey.get("SmallKey");//3、通过ValueOperations获取值
HashOperations hashOps = redisTemplate.opsForHash();
String value3 = (String) hashOps.get("HashKey", "SmallKey");

❄️❄️获取所有的键值对集合

//1、通过redisTemplate获取
Map entries = redisTemplate.boundHashOps("HashKey").entries();//2、通过BoundValueOperations获取值
BoundHashOperations hashKey = redisTemplate.boundHashOps("HashKey");
Map entries1 = hashKey.entries();//3、通过ValueOperations获取值
HashOperations hashOps = redisTemplate.opsForHash();
Map entries2 = hashOps.entries("HashKey");

❄️❄️删除

//删除小key
redisTemplate.boundHashOps("HashKey").delete("SmallKey");
//删除大key
redisTemplate.delete("HashKey");

❄️❄️判断Hash中是否含有该值

Boolean isEmpty = redisTemplate.boundHashOps("HashKey").hasKey("SmallKey");

⛄RedisTemplate API 实战

❄️❄️添加 put / putAll

//	初始数据:
template.opsForHash().put("redisHash","name","tom");
template.opsForHash().put("redisHash","age",26);
template.opsForHash().put("redisHash","class","6");Map<String,Object> testMap = new HashMap();
testMap.put("name","jack");
testMap.put("age",27);
testMap.put("class","1");
template.opsForHash().putAll("redisHash1",testMap);

仅当hashKey不存在时才设置散列hashKey的值。

System.out.println(template.opsForHash().putIfAbsent("redisHash","age",30));
System.out.println(template.opsForHash().putIfAbsent("redisHash","kkk","kkk"));
//结果:
false
true

❄️❄️删除小Key

template.opsForHash().delete("redisHash","name");

❄️❄️删除大Key

template.opsForHash().delete("redisHash");

❄️❄️判断key是否存在

template.opsForHash().hasKey("redisHash","age")

❄️❄️获取

template.opsForHash().get("redisHash","age")

❄️❄️增加散列hashKey的值(整型)

System.out.println(template.opsForHash().get("redisHash","age"));
System.out.println(template.opsForHash().increment("redisHash","age",1));
//	结果:
26
27

❄️❄️获取key所对应的散列表的key

System.out.println(template.opsForHash().keys("redisHash1"));
//redisHash1所对应的散列表为{class=1, name=jack, age=27}
//结果:[name, class, age]

❄️❄️获取key所对应的散列表的大小个数

template.opsForHash().size("redisHash1");
//redisHash1所对应的散列表为{class=1, name=jack, age=27}
//结果:3

❄️ ❄️获取整个哈希存储的值

template.opsForHash().values("redisHash");
//	结果:[tom, 26, 6]

❄️❄️获取整个哈希存储

template.opsForHash().entries("redisHash");
//	结果:{age=26, class=6, name=tom}

❄️❄️使用Cursor在key的hash中迭代,相当于迭代器。

Cursor<Map.Entry<Object, Object>> curosr = ops.scan("redisHash", ScanOptions.ScanOptions.NONE);while(curosr.hasNext()){Map.Entry<Object, Object> entry = curosr.next();System.out.println(entry.getKey()+":"+entry.getValue());}
//结果:
age:28.1
class:6
kkk:kkk

⛄应用场景

下面列举了几个应用场景:

  • 存储对象: 可以通过hash类型将一个对象的多个属性以键值对(key-value)的形式存储, 方便快捷。举例来说,可以把一个用户的姓名、年龄、邮箱,保存为 Hash 类型,并以用户编号为 Key,这样在更新某一个属性时,就不需要重新写入整个对象。

  • 缓存环境变量:当使用 Redis 来做缓存系统时,我们可以把那些常用的项目配置都放到 Redis 中去,比如域名、端口号、数据库名称、数据库地址的 hash 设置等,利用 Redis hash 的特性,可以使得这些配置很容易被更新,且不会持续占用内存空间。

  • 购物车:购物车是一个经典的以Hash方式实现的例子,每个用户一个购物车,每个购物车用一个哈希来表示。

  • 计数器:如果您想要更灵活地定义一个String类型的计数器(例如,基于某种“维度”进行依次命名),则可以使用Hash。 每个待计数的“块”可以用“键->Value”的方式存储。

  • 存储对象属性:同一个对象的不同属性可以放在同一个hash类型中,例如,把一本书相关信息(作者、出版日期、价格)存成一个哈希。

在这里插入图片描述



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/814447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阐述嵌入式系统的基本组成:硬件层、驱动层、操作系统层和应用层

大家好&#xff0c;今天给大家介绍阐述嵌入式系统的基本组成&#xff1a;硬件层、驱动层、操作系统层和应用层&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 嵌入式系统是一种能…

Java集合(一)--Map(2)

ConcurrentHashMap与HashTable 底层实现 在JDK1.7时&#xff0c;底层采用的是分段数组&#xff0b;链表的形式&#xff0c;在JDK1.8之后&#xff0c;采用的是与HashMap相同的形式&#xff0c;数组链表/红黑树。而HashTable采用的是数组链表的形式。 如何实现线程安全 Concu…

如何访问远程服务器?

在现代技术时代&#xff0c;随着信息化的快速发展&#xff0c;远程访问服务器已经成为了不可或缺的一种需求。无论是企业还是个人用户&#xff0c;都需要通过远程访问来管理、传输和获取数据。本文将介绍一种名为【天联】的工具&#xff0c;它能够通过私有通道进行远程服务器访…

vscode配置c\c++及美化

文章目录 vscode配置c\c及美化1.安装vscode2.汉化3.安装c\c插件4.安装mingw5.配置mingw6. 运行c代码6.1 创建代码目录6.2 设置文件配置6.3 创建可执行任务&#xff1a;task.json6.4 编译执行6.5 再写其他代码6.6 运行多个c文件 7. 运行c文件8.调式代码8.1 创建launch.json8.2 修…

【排序 贪心】3107. 使数组中位数等于 K 的最少操作数

算法可以发掘本质&#xff0c;如&#xff1a; 一&#xff0c;若干师傅和徒弟互有好感&#xff0c;有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二&#xff0c;有无限多1X2和2X1的骨牌&#xff0c;某个棋盘若干格子坏了&#xff0c;如何在没有坏…

Springboot+Vue项目-基于Java+MySQL的母婴商城系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

常用组合逻辑电路模块(5):加法器

半加器和全加器 半加器 半加&#xff1a;只考虑两个加数本身&#xff0c;不考虑低位进位的加法运算。实现半加运算的逻辑电路称为半加器。 其对应真值表为&#xff1a; 由真值表可得逻辑表达式&#xff1a; 逻辑电路和框图如下&#xff1a; 其中&#xff0c;CO为进位输出端&…

家庭网络防御系统搭建-siem之security onion 安装配置过程详解

本文介绍一下security onion的安装流程&#xff0c;将使用该工具集中管理终端EDR和网络NDR sensor产生的日志。 充当SIEM的平台有很多&#xff0c;比如可以直接使用原生的elastic以及splunk等&#xff0c;security onion的优势在于该平台能够方便的集成网络侧&#xff08;比如…

Linux 硬链接和软链接怎么区分使用?

一、什么是硬链接和软链接 硬链接 在Linux操作系统中&#xff0c;硬链接相当于存储在硬盘驱动器中的文件&#xff0c;它实际上引用或指向硬盘驱动器上的某个点。硬链接是原始文件的镜像副本。 硬链接与软链接的区别在于&#xff0c;删除原始文件不会影响硬链接&#xff0c;但…

AI图书推荐:如何在课堂上使用ChatGPT 进行教育

ChatGPT是一款强大的新型人工智能&#xff0c;已向公众免费开放。现在&#xff0c;各级别的教师、教授和指导员都能利用这款革命性新技术的力量来提升教育体验。 本书提供了一个易于理解的ChatGPT解释&#xff0c;并且更重要的是&#xff0c;详述了如何在课堂上以多种不同方式…

【攻防世界】supersqli(堆叠注入)

进入题目环境&#xff0c;有输入框与注入参数&#xff0c;推测类型为SQL注入&#xff1a; 测试--注入类型为数字型还是字符型&#xff0c;构造payload&#xff1a;?inject1 or 12 并提交&#xff1a; 发现页面依然正常&#xff0c;说明注入类型为字符型&#xff0c;则继续检查…

ML在骨科手术术前、书中、术后方法应用综述【含数据集】

达芬奇V手术机器人 近年来,人工智能(AI)彻底改变了人们的生活。人工智能早就在外科领域取得了突破性进展。然而,人工智能在骨科中的应用研究尚处于探索阶段。 本文综述了近年来深度学习和机器学习应用于骨科图像检测的最新成果,描述了其贡献、优势和不足。以及未来每项研究…

用AI提升儿童英语口语:和小猪佩奇对话

小孩子大部分都是喜欢动画片的&#xff0c;如果能让动画片中的角色和他们进行口语对话&#xff0c;应该可以极大的激发他们英语学习兴趣。 下面&#xff0c;以小猪佩奇为例来说明如何利用AI来创建一个虚拟的英语口语陪练小猪佩奇角色。 在kimichat对话框中键入提示词&#xf…

360极速浏览器启动外部应用设置记住选择后无法启动应用

之前学习并测试过通过网页调用本地应用的路线&#xff0c;原理是在注册表中注册能在网页中调用的命令&#xff0c;然后在网页中通过命令调用本地应用。测试过程中发现使用版本为12.0.1212.0的360极速浏览器的极速模式下启动外部应用时&#xff0c;每次都会出现启动外部应用的提…

vue3 vueUse 连接蓝牙

目录 vueuse安装&#xff1a; useBluetooth: 调用蓝牙API 扫描周期设备 选择设备配对 连接成功 vue3的网页项目连接电脑或者手机上的蓝牙设备&#xff0c;使用vueUse库&#xff0c;可以快速检查连接蓝牙设备。 vueUse库使用参考&#xff1a; VueUse工具库 常用api-CSDN…

【spring】AOP切面注解学习(二)

文接上篇&#xff1a;【spring】AOP切面注解学习&#xff08;一&#xff09; AOP切面注解测试示例代码 示例代码 一 maven的pom文件导入 <dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></depende…

itop4412内核编译_编译自定义函数到内核

我的itop4412开发板是半路捡的&#xff0c;所以没办法加他们的售后群&#xff0c;遇到的问题只好一点点记录吧 内核驱动编译 在日常工作过程中&#xff0c;编写内核程序可能机会不多&#xff0c;但是将厂商提供的内核源码编译到固件中&#xff0c;这个技能还是必须掌握的。 i…

Redis入门到通关之String命令

文章目录 ⛄1 String 介绍⛄2 命令⛄3 对应 RedisTemplate API❄️❄️ 3.1 添加缓存❄️❄️ 3.2 设置过期时间(单独设置)❄️❄️ 3.3 获取缓存值❄️❄️ 3.4 删除key❄️❄️ 3.5 顺序递增❄️❄️ 3.6 顺序递减 ⛄4 以下是一些常用的API⛄5 应用场景 ⛄1 String 介绍 Stri…

Asterisk 21.2.0编译安装经常遇到的问题和解决办法之卸载pjsip

目录 会安装也要会卸载make uninstallldconfig 会安装也要会卸载 有些人就只会装。 最常见的场景就是需要卸载之前版本的pjproject。 一般来说&#xff0c;其他版本的 pjproject 会被作为静态链接库安装。这些库跟 Asterisk可能不兼容。 因此&#xff0c;在安装正确版本的pjpro…

连锁收银系统哪个好用 国内三大连锁收银系统评比

随着数字化管理趋势下互联网技术的不断发展革新&#xff0c;互联网技术&#xff0c;以及不断升级优化传统行业渠道模式&#xff0c;线上线下结合的电子商务模式正逐渐成为企业发展的趋势。而门店管理系统也在越来越多的企业应用。但市场上连锁店管理系统品牌诸多&#xff0c;很…