Redis数据类型之(哈希Hash和集合Set)

Redis数据类型之(哈希Hash和集合Set)

一定注意看红色注意项。

哈希(Hash):

Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

特征:提到hash首先想到Java语言中的hashMap,他的结构也是key-value结构(下面就用字段名和值表示hash里面的key value)。这就相当于redis的里面可以存一个key - (key-value),这有点像json了,只不过就2层。如果有一个用户,他有姓名、年龄、地址等信息。在redis中就可以用hash类型来存储。下面是hash的使用命令。

由于他是string类型的一个映射表,所以他的命令基本都是H开头的String命令:如下

  1. Hset:field相当于字段名,value是值
    HSET key field value
    将哈希表 key 中的字段 field 的值设为 value 。

  2. Hget:
    HGET key field
    获取存储在哈希表中指定字段的值。

  3. Hmset:设置多对字段名和值,成对出现。
    HMSET key field1 value1 [field2 value2 ]
    同时将多个 field-value (域-值)对设置到哈希表 key 中。

  4. Hmget:获取多个字段值
    HMGET key field1 [field2]
    获取所有给定字段的值

  5. Hkeys:获取key 中的所有字段名
    HKEYS key
    获取哈希表中的所有字段

  6. Hvals:获取key 中的所有值
    HVALS key
    获取哈希表中所有值。

  7. Hlen:获取key中的字段数量
    HLEN key
    获取哈希表中字段的数量

  8. Hgetall:获取key中的字段名和值,都输出
    HGETALL key
    获取在哈希表中指定 key 的所有字段和值

  9. Hexists:字段名是否存在
    HEXISTS key field
    查看哈希表 key 中,指定的字段是否存在。

  10. Hdel:删除多个字段
    HDEL key field1 [field2]
    删除一个或多个哈希表字段

  11. Hincrby:可以给字段中的数值增加,比如age:18。可以增加age的值1。1就是加1,如果写-1就是减一,不需要再多加一个减法命令。
    HINCRBY key field increment
    为哈希表 key 中的指定字段的整数值加上增量 increment 。

  12. Hincrbyfloat:上面提到整数增减了,这个是浮点数增减,比如:0.5 就是加0.5,-0.5就是减0.5。注意:如果用浮点型命令加0.5后,就只能使用浮点命令操作了,因为他就变成了浮点型。若果用浮点型给一个整数增加了1,则还可以用整数型命令继续操作,因为数值还是整数。
    HINCRBYFLOAT key field increment
    为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
    在这里插入图片描述

  13. Hsetnx:如果该字段不存在时,设置该字段值
    HSETNX key field value
    只有在字段 field 不存在时,设置哈希表字段的值。

实操:

在这里插入图片描述
这里可以看到我用hmset设置了多组属性,并且设置了两次name。最终查询结果表示name被最后一个设置覆盖了,所以可以说明他具有hashmap的特征,去重。
在这里插入图片描述
这里也支持设置一个空字符串。和hashmap一样。

哈希(Hash)的使用场景:

由于他可以对字段进行数值计算。所以可以在点赞,收藏场景使用,巨鹿用户点赞数,然后每点一次就+1,取消-1,收藏同样。因为他还是key-value结构,用来存储详情页信息等。

  1. 点赞
  2. 收藏
  3. 存储详情页信息

集合(Set):

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

集合对象的编码可以是 intset 或者 hashtable。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

特征:他和Java语言中的set一样,所以具有set的特征。无序和去重

他的命令基本都是S开头:如下

  1. Sadd:member1 是值。如果设置多个同样的值,会自动去重
    SADD key member1 [member2]
    向集合添加一个或多个成员
  2. Scard:返回集合的成员数量有几个
    SCARD key
    获取集合的成员数
  3. Smembers:返回集合中具体的成员
    SMEMBERS key
    返回集合中的所有成员
  4. Srem:删除元素。因为他是无序,所以只能增删,不能改
    SREM key member1 [member2]
    移除集合中一个或多个成员

下面介绍一下他的交、并、差集,应用多

  1. Sinter:返回他们的交集。
    SINTER key1 [key2]
    返回给定所有集合的交集

  2. SinsterStore:把他们交集返回并存储在destination 中。写的时候可以都小写,我只是为了看着清晰,才驼峰写法
    SINTERSTORE destination key1 [key2]
    返回给定所有集合的交集并存储在 destination 中

  3. Sunion:返回他们的并集。
    SUNION key1 [key2]
    返回所有给定集合的并集

  4. SunionStore:把他们并集返回并存储在destination 中。
    SUNIONSTORE destination key1 [key2]
    所有给定集合的并集存储在 destination 集合中

  5. Sdiff:返回他们的差集。**这里需要注意,key1和key2的顺序。key1在前表示返回key1中key2没有的数据,反之则返回key2中key1没有的数据。下面会提到他的具体用处
    SDIFF key1 [key2]
    返回第一个集合与其他集合之间的差异。
    在这里插入图片描述

  6. SdiffStore:把他们差集返回并存储在destination 中。
    SDIFFSTORE destination key1 [key2]
    返回给定所有集合的差集并存储在 destination 中

  7. Smove:
    SMOVE source destination member
    将 member 元素从 source 集合移动到 destination 集合

  8. Spop:随机移除一个 。可以用到抽奖上,抽完且不放回
    SPOP key
    移除并返回集合中的一个随机元素

  9. Srandmember:返回一个或多个随机数。可以用到抽奖可重复中,因为不删除
    SRANDMEMBER key [count]
    返回集合中一个或多个随机数

  10. SisMember:判断元素是否存在
    SISMEMBER key member
    判断 member 元素是否是集合 key 的成员

集合(Set)的使用场景:

由于他可以进行交并差集运算。所以可以在点赞,收藏场景使用,巨鹿用户点赞数,然后每点一次就+1,取消-1,收藏同样。因为他还是key-value结构,用来存储详情页信息等。

  1. 抽奖:
    A:只抽1次,1次抽n个人。
    B:抽多次,比如三等奖抽3名,二等奖抽2名,一等奖抽1名。
    主要利用Set结构元素的不重复性和获取随机数的方法来实现

  2. 微博、微信点赞(文章的收藏)
    微信朋友圈用户A的某条消息的点赞功能,要实现点赞、取消点赞、获取点赞列表、获取点赞用户数量、判断某用户是否点赞过。
    A:点赞 sadd方法

    B:取消点赞 srem方法

    C:获取点赞列表 smembers方法

    D:获取点赞用户数量 scard方法

    E:判断某用户是否点赞过 sIsMember方法

  3. 关注模型
    比如微博关注或者共同好友的问题,以微博关注为例,要实现:同时关注、关注的和、关注A的用户中也关注B的、当A进入B页面,求可能认识的人。

    A:关注和取消关注: sadd方法 和 srem方法

    B:同时关注:求交集

    C:关注的和:求并集

    D:关注A的用户中也有关注B的 注意这里不是取交集,而是在A的用户中判断,是否有关注B的,所以要遍历一遍A的用户:遍历A中的用户,利用sIsMember判断是否也关注B

    E:当A进入B页面,求可能认识的人:这里指的是关注B中的用户 扣去 里面也关注A的用户,就是A可能认识的人。 注意:这里的A和B求差集是有顺序的,比如求A的可能认识的人,就要把B放在A前面:Sdiff B A。仔细思考下是不是这样,要求A的可能认识人,就相当于求B中没有在A中出现的人。反之就是Sdiff A B。

求差集:B-A,A-B

暂时就理解到这儿。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

龙芯2K1000实战开发-USB/PCIe/HDMI外设开发

文章目录 概要整体架构流程技术名词解释技术细节小结概要 提示:这里可以添加技术概要 本文主要针对2k1000的PCIE和USB外设的国产化设计 整体架构流程 提示:这里可以添加技术整体架构 使用2k1000自带的以太网pcie控制器,USB控制器。 考虑到龙芯没有HDMI接口,选用龙讯半…

springboot启动过程原理分析

前言 现在绝大多数java项目都上了Springboot框架, 因此深入理解Springboot框架的运行原理,能帮助我们更好的在Springboot框架下进行业务开发,同时能学习框架中优秀的设计思想, 本文主要是通过对Springboot源码的分析, 来理解整个springboot项目的启动流程. 因为Springboot不同…

AdaIN

AdaIN的全名是Adaptive Instance Normalization,源自风格迁移的论文Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization 假设原图和风格图经过VGG进行特征提取后得到shape分别为CxHxW和CxH‘xW’的特征图c和s,AdaIN的计算如…

JDBC查询数据库——普通、流式、游标

问题 通过JDBC对MySQL进行数据查询时,有个很容易踩的坑,以下面代码为例: public static void selectNormal() throws SQLException{Connection connection DriverManager.getConnection("jdbc:mysql://localhost:3306/test", &qu…

被迫在小公司熬了2年,现在我终于进了腾讯测试岗...

其实两年前校招的时候就往腾讯投了一次简历,结果很明显凉了,随后这个理想就被暂时放下了,但是这个种子一直埋在心里,想着总有一天会再次挑战的。 其实这两年除了工作以外,其余时间基本上都在学习,打磨自己…

Burp模块

Target模块 记录流量 1.Target按主机或域名分类记录 2.HTTP History 按时间顺序记录且会记录很多次 3.Target模块的作用 (1)把握网站的整体情况 (2)对一次工作的域进行分析 (3)分析网站存在的攻击面 …

从C语言到C++_14(vector的常用函数+相关选择题和OJ题)

目录 1. vector的常用函数 1.1 vector 的介绍 1.2 vector 的初始化 1.3 vector 的操作和遍历 1.4 vector 的容量和增删查改 2. vector 相关笔试题 3. vector 相关OJ题 136. 只出现一次的数字 - 力扣(LeetCode) 解析代码: 118. 杨辉…

详解iPaaS与RPA的区别及各自的应用场景

随着企业数字化转型的加速,业务系统集成和自动化流程成为关键议题。本文旨在探讨iPaaS(Integration Platform as a Service)与RPA(Robotic Process Automation)在业务系统集成方面的区别,它们各自的用途和适…

Web端3D模型轻量化工具如何实现建筑行业“数字化”建设?

随着数字化技术的飞速发展,建筑行业也在不断寻找新的技术手段来提供高产能和建筑质量。其中,Web端3D模型轻量化工具HOOPS Communicator SDK在建筑行业中的应用不断地得到了市场的广泛注意和应用。本文将深入探讨HOOPS Communicator在建筑行业中的应用及其…

【Redis】浅谈Redis-集群(Cluster)

文章目录 前言1、集群实现1.1 创建cluster目录,并将redis.conf复制到该文件夹1.2 复制redis.conf,并进行配置1.3 启动redis,查看启动状态1.4 合成集群1.5 查看集群1.6 集群读写操作 2、SpringBoot整合redis集群2.1 引入包2.2 设置配置2.3 使用…

Codeforces Div.2 1798B Three Sevens题解

题目: 传送门 B. Three Sevens time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Lottery "Three Sevens" was held for m days. On day i, ni people with the numbers ai,1…

职场工作的前提

职场工作 目录概述需求: 设计思路实现思路分析1.职场工作 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.…

CompletableFuture的简单使用

原文地址:CompletableFuture原理与实践-外卖商家端API的异步化 CompletableFuture的介绍: CompletableFuture是Java 8中引入的一种基于Future的异步编程机制。与传统的Future相比,CompletableFuture提供了更多的操作链支持,并且…

企业级信息系统开发——Spring Boot加载自定义配置文件

文章目录 一、使用PropertySource加载自定义配置文件(一)创建Spring Boot Web项目ConfigDemo01(二)创建自定义配置文件(三)创建自定义配置类(四)编写测试方法(五&#xf…

实验9 分类问题

1. 实验目的 ①掌握逻辑回归的基本原理,实现分类器,完成多分类任务; ②掌握逻辑回归中的平方损失函数、交叉熵损失函数以及平均交叉熵损失函数。 2. 实验内容 ①能够使用TensorFlow计算Sigmoid函数、准确率、交叉熵损失函数等,…

【一次调频】考虑储能电池参与一次调频技术经济模型的容量配置方法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

web服务器有哪些

<1>什么是web服务器 “网络服务”&#xff08;Web Service&#xff09;的本质&#xff0c;就是通过网络调用其他网站的资源。 Web Service架构和云 如果一个软件的主要部分采用了”网络服务”&#xff0c;即它把存储或计算环节”外包”给其他网站了&#xff0c;那么我…

关于机器人状态估计(15)-VIO与VSLAM精度答疑、融合前端、主流深度相机说明与近期工程汇总

VIOBOT种子用户有了一定的数量&#xff0c;日常大家也会进行交流&#xff0c;整理总结一下近期的交流与答疑。 VIO-SLAM(作为三维SLAM&#xff0c;相对于Lidar-SLAM和LIO-SLAM)在工程上落地的长期障碍&#xff0c;不仅在算法精度本身&#xff0c;还有相对严重的鲁棒性问题&…

【Redis25】Redis进阶:分布式锁实现

Redis进阶&#xff1a;分布式锁实现 锁这个概念&#xff0c;不知道大家掌握的怎么样。我是先通过 Java &#xff0c;知道在编程语言中是如何使用锁的。一般 Java 的例子会是操作一个相同的文件&#xff0c;但其实我们知道&#xff0c;不管是文件&#xff0c;还是数据库中的一条…

MYSQL高级之关联查询优化

建表 CREATE TABLE IF NOT EXISTS class ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, card INT(10) UNSIGNED NOT NULL, PRIMARY KEY (id) ); CREATE TABLE IF NOT EXISTS book ( bookid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, card INT(10) UNSIGNED NOT NULL, PRI…