-
2022-05-10 21:40:35
set:
1.成员不能重复
2.只有键值,没有键名,有点类似数组
3.可以遍历,方法又add,delete,has
Map:
1.本质上是键值对的集合,类似集合;
2.可以遍历,方法很多,可以干跟各种数据格式转换
Set和Map主要的应用场景在于数据重组和数据存储
set 是一种叫做集合的数据结构,Map是一种叫做字典的数据结构
- Set 和 Map 主要的应用场景在于 数据重组 和 数据储存。
- Set 是一种叫做集合的数据结构,Map 是一种叫做字典的数据结构。
集合 与 字典 的区别:
- 共同点:集合、字典 可以储存不重复的值
- 不同点:集合 是以 [value, value]的形式储存元素,字典 是以 [key, value] 的形式储存
- 集合(Set):
-
// 去重数组的重复对象 let arr = [1, 2, 3, 2, 1, 1] [... new Set(arr)] // [1, 2, 3]
操作方法:
遍历方法:
Map:
- add(value):新增,相当于 array里的push。
- delete(value):存在即删除集合中value。
- has(value):判断集合中是否存在 value。
- clear():清空集合。
-
字典(Map):
是一组键值对的结构,具有极快的查找速度。
-
const m = new Map() const o = {p: 'haha'} m.set(o, 'content') m.get(o) // content m.has(o) // true m.delete(o) // true m.has(o) // false
-
操作方法:
- set(key, value):向字典中添加新元素。
- get(key):通过键查找特定的数值并返回。
- Keys():将字典中包含的所有键名以迭代器形式返回。
- values():将字典中包含的所有数值以迭代器形式返回。
- entries():返回所有成员的迭代器。
- forEach():遍历字典的所有成员。
- has(key):判断字典中是否存在键key。
- delete(key):通过键 key 从字典中移除对应的数据。
- clear():将这个字典中的所有元素删除。
-
总结:
Set:
- 成员唯一、无序且不重复。
- [value, value],键值与键名是一致的(或者说只有键值,没有键名)。
- 可以遍历,方法有:add、delete、has。
- 本质上是键值对的集合,类似集合。
- 可以遍历,方法很多可以跟各种数据格式转换。
更多相关内容 -
Redis set数据类型的常见业务场景
2020-10-27 13:48:23set类型是string类型的集合,其特点是集合元素无序且不重复,每个集合最多可以存储 232- 1 个元素(40多亿),set类型主要有以下应用场景。 1. 好友/关注/粉丝/感兴趣的人集合 set类型唯一的特点使得其适合...set类型是string类型的集合,其特点是集合元素无序且不重复,每个集合最多可以存储 232 - 1 个元素(40多亿),set类型主要有以下应用场景。
1. 好友/关注/粉丝/感兴趣的人集合
set类型唯一的特点使得其适合用于存储好友/关注/粉丝/感兴趣的人集合,集合中的元素数量可能很多,每次全部取出来成本不小,set类型提供了一些很实用的命令用于直接操作这些集合,如
a. sinter命令可以获得A和B两个用户的共同好友
b. sismember命令可以判断A是否是B的好友
c. scard命令可以获取好友数量
c. 关注时,smove命令可以将B从A的粉丝集合转移到A的好友集合
需要注意的是,如果你用的是Redis Cluster集群,对于sinter、smove这种操作多个key的命令,要求这两个key必须存储在同一个slot(槽位)中,否则会报出 (error) CROSSSLOT Keys in request don't hash to the same slot 错误。Redis Cluster一共有16384个slot,每个key都是通过哈希算法CRC16(key)获取数值哈希,再模16384来定位slot的。要使得两个key处于同一slot,除了两个key一模一样,还有没有别的方法呢?答案是肯定的,Redis提供了一种Hash Tag的功能,在key中使用{}括起key中的一部分,在进行 CRC16(key) mod 16384 的过程中,只会对{}内的字符串计算,例如friend_set:{123456}和fans_set:{123456},分别表示用户123456的好友集合和粉丝集合,在定位slot时,只对{}内的123456进行计算,所以这两个集合肯定是在同一个slot内的,当用户123456关注某个粉丝时,就可以通过smove命令将这个粉丝从用户123456的粉丝集合移动到好友集合。相比于通过srem命令先将这个粉丝从粉丝集合中删除,再通过sadd命令将这个粉丝加到好友集合,smove命令的优势是它是原子性的,不会出现这个粉丝从粉丝集合中被删除,却没有加到好友集合的情况。然而,对于通过sinter获取共同好友而言,Hash Tag则无能为力,例如,要用sinter去获取用户123456和456789两个用户的共同好友,除非我们将key定义为{friend_set}:123456和{friend_set}:456789,否则不能保证两个key会处于同一个slot,但是如果真这样做的话,所有用户的好友集合都会堆积在同一个slot中,数据分布会严重不均匀,不可取,所以,在实战中使用Redis Cluster时,sinter这个命令其实是不适合作用于两个不同用户对应的集合的(同理其它操作多个key的命令)。
2. 随机展示
通常,app首页的展示区域有限,但是又不能总是展示固定的内容,一种做法是先确定一批需要展示的内容,再从中随机获取。如下图所示,酷狗音乐K歌擂台赛当日的打擂歌曲共29首,首页随机展示5首;昨日打擂金曲共200首,首页随机展示30首。
set类型适合存放所有需要展示的内容,而srandmember命令则可以从中随机获取几个。
3. 黑名单/白名单
经常有业务出于安全性方面的考虑,需要设置用户黑名单、ip黑名单、设备黑名单等,set类型适合存储这些黑名单数据,sismember命令可用于判断用户、ip、设备是否处于黑名单之中。
加入set类型的应用场景后的思维导图如下。
-
Set和Map的使用场景
2022-04-03 22:19:30Set和Map Set集合是一种无重复元素...Set的使用场景 Set和Array的区别是Set里的每一个元素都是唯一的,比如你有一个Array里面有4个元素[1, 2, 3, 1,4],如果你把它转换成Set,就变成[1, 2, 3,4]了。所以我们可以利用SeSet和Map
Set集合是一种无重复元素的列表,开发者们一般不会逐一读取数组中的元素,也不太可能逐一访问Set集合中的每个元素,通常的做法是检测给定的值在某个集合中是否存在
Map集合内含多组键值对,集合中每个元素分别存放着可访问的键名和它对应的值,Map集合经常被用于缓存频繁取用的数据。
Set的使用场景
Set和Array的区别是Set里的每一个元素都是唯一的,比如你有一个Array里面有4个元素[1, 2, 3, 1,4],如果你把它转换成Set,就变成[1, 2, 3,4]了。所以我们可以利用Set的这个特性做整数数组的去重。但要注意的是,如果你的数组是[{name: 1}, {name: 1}]这样的包含Object的数组,那么你把它转换为Set时并不能去重,因为虽然这两个对象看起来一样,但在Set看来,这个数组里的两个对象是两个完全不同的值,所以并不符合去重的要求。
Map的使用场景
Map类似于对象,是键值对的集合,数据可为任意类型,与Object的区别在于Object的键只能是字符串或者Symbols,但Map可以为任意类型,且Map中的键值是有序的,Map有一个比较特殊的应用场景。如果你在开发时不确定键值对里面的键的名称,那么你需要用Map。举例来说,你需要动态地从MongoDB里获取键值并显示给用户,但也许你并不关心这些键值的键名到底是什么,那么在这种情况下,你可以用Map,例如这样:var myMap = new Map(); var keyObj = {}, keyFunc = function () { return 'hey'}, keyString = "a string"; myMap.set(keyString, "value associated with 'a string'"); myMap.set(keyObj, "value associated with keyObj"); myMap.set(keyFunc, "value associated with keyFunc"); console.log(myMap.get(keyFunc));
-
sorted set 数据类型的应用场景
2020-09-26 19:17:04在 set 的基础上给集合中每个元素关联了一个分数,往有序集合中插入数据时会自动根据这个分数排序。它保留了元素不能重复的特性,并且元素是有序的。 2.基本操作 zadd key score member //score是可以重复的,...1.简介
在 set 的基础上给集合中每个元素关联了一个分数,往有序集合中插入数据时会自动根据这个分数排序。它保留了元素不能重复的特性,并且元素是有序的。
2.基本操作
zadd key score member //score是可以重复的,添加key的时候指定分数 zcard key //计算成员个数 zscore key member //计算某个成员的分数 zrank key member //计算成员排名,从低到高 zrevrank key member //计算成员排名,从高到低 zrem key member [member...] //删除成员 zincrby key increnment member //增加成员的分数 zrange key start end [withscores] //从低到高返回指定排名的分数 zrevrange key start end [withscores] //从高到低返回 zrangebyscore key min max [withscores] [limit offset count] //按照分数从低到高返回 zrevrange score key min max [withscores] [limit offset count] //按照分数从高到低返回成员 withscore 代表返回的时候带上成员的分数 ...还有求交集,并集等操作
3.应用场景
在集合类型的场景上加入排序就是有序集合的应用场景了。
(1)根据好友的“亲密度”排序显示好友列表。
// 用元素的分数(score)表示与好友的亲密度 zadd user:kobe 80 james 90 wade 85 melo 90 paul // 根据“亲密度”给好友排序 zrevrange user:kobe 0 -1 /** * 输出: * 1) "wade" * 2) "paul" * 3) "melo" * 4) "james" */ // 增加好友的亲密度 zincrby user:kobe 15 james // 再次根据“亲密度”给好友排序 zrevrange user:kobe 0 -1 /** * 输出: * 1) "james" * 2) "wade" * 3) "paul" * 2) "melo" */ //类似的需求还出现在根据文章的阅读量或点赞量对文章列表排序
(2)排行榜
实效性
从排行榜的实效性上划分,主要分为:
-
实时榜:基于当前一段时间内数据的实时更新,进行排行。例如:当前一小时内游戏热度实时榜,当前一小时内明星送花实时榜等
-
历史榜:基于历史一段周期内的数据,进行排行。例如:日榜(今天看昨天的),周榜(上一周的),月榜(上个月的),年榜(上一年的)
业务数据类型
从需要排行的数据类型上划分,主要分为:
-
单类型数据排行榜:是指需要排行的主体不需要区分类型,例如,所有用户积分排行,所有公贡献值排行,所有游戏热度排行等
-
多类型(复合类型)数据排行榜:是指需要排行的主体在排行中要求有类型上的区分,例如:竞技类游戏热度排行、体育类游戏热度排行、MOBA类游戏操作性排行、角色/回合/卡牌三类游戏热度排行等
展示唯度
从榜单的最终展示唯度上划分,主要分为:
-
单唯度:是指选择展示的排行榜就是基于一个唯度下的排行,例如前面提到的MOBA类游戏操作性排行榜,就仅展示所有MOBA类游戏按操作性的评分排行
-
多唯度:是指选择展示的排行榜还有多种唯度供用户选择,仍然以前面的MOBA类游戏为例,唯度除了操作性,还有音效评分排行,难易度评分排行,画面评分排行等。
展示数据量
从需要展示的数据量上划分,主要分为:
-
topN数据:只要求展示topN条排行纪录,例如:最火MOBA游戏top20
-
全量数据:要求展示所有数据的排行,例如:所有用户的积分排行
-
-
Redis 的 set(集合类型) 数据类型与结构和应用场景
2021-09-08 18:03:54redis 的 set 类型是使用哈希表构造的,因此复杂度是O(1),它支持集合内的增删改查,并且支持多个集合间的交集、并集、差集操作。可以利用这些集合操作,解决程序开发过程当中很多数据集合间的问题。 常用命令 ... -
Redis(3)数据类型(string、hash、list、set、sorted_set)详解与业务场景实战
2020-07-28 17:53:50目录 前言 redis 数据存储格式 一、string 类型 1、基本介绍 2、string 类型数据的基本操作 ...3、string 类型数据的扩展操作 ...业务场景1 ...业务场景2 ...业务场景3 ...业务场景1 ...业务场景2 ...业务场景... -
Redis学习5:Set基本操作、拓展操作、业务场景等
2021-10-03 17:30:18set的拓展操作:用户推荐-业务场景 注意第一个50个是不会变减少的,但是第二个是会减少的。 操作如下: 综上所示,redis应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热点APP等推荐! ... -
Vue计算属性computed的 get() 和 set() 方法的应用场景 : 全选
2021-01-18 19:57:36其实计算属性中还有 get 和 set 方法 举个’栗子’ 下面是页面结构 需求 : 多选框全都选中 >> 全选框 – 选中 其他多选框没有全部选中 >> 全选框 – 不选中 点击 选中 全选框 >> 其他多选框要 –... -
真实业务场景展现CAS原理的ABA问题及解决方案
2021-09-25 18:27:32文章目录阅读提示CAS原理、ABA问题介绍真实业务场景如何解决ABA问题CAS学习总结 阅读提示 本文将借助开保险柜的业务场景重点阐述误用AtomicBoolean引起的ABA问题,以及解决方案。基于此,请先深入理解CAS原理,以及... -
Redis数据类型String\List\Set\Hash\Zset使用与应用场景(第二章)
2021-11-18 18:20:58五大数据类型 才基本语法,到应用场景描述 常用Redis-key 语法 expire name 10 #设置key过期时间(过期就null,单位:秒) ttl name #查询当前key剩余时间 exists name #key是否存在 move name #移除当前key ... -
Redis——Redis五大数据类型——list,set和sorted_set(及应用场景)
2021-04-16 14:01:57五大数据类型——list,set和sorted_setlistlist 类型数据基本操作list 类型数据扩展操作list 类型数据操作注意事项list 类型应用场景setsorted_set list 数据存储需求:存储多个数据,并对数据进入存储空间的顺序... -
java面试(业务场景)
2020-07-16 23:51:23九、OSCache+autocomplete+单例业务场景 在我以前做某项目的过程中,其中我们在做产品列表的查询的时候为了提高用户的体验度,我们使用了autocomplete插件来代替select进行品牌的选择,才开始的时候每次都要根据... -
redis中的常用业务场景
2019-05-19 21:12:26**Redis**的常用业务场景 1、热点数据的缓存 由于redis访问速度比较快、支持的数据类型比较丰富,所以redis很适合存储热点数据,另外结合expire,我们可以设置过期时间在进行缓存更新操作,这个功能最为常见,... -
redis的String、List、Hash、SET、ZSet五中数据类型常用的一些场景总结
2021-04-11 23:36:20Key的设计注意事项 一般以业务功能模块: 比如购物车key: cart:001,表示1号用户的购物车 简短,明了以主, 节约内存。 简单字符缓存 set key value get key 结构体或对象的存储 a) set user:1 value //... -
【航母特辑】06_乐观锁和悲观锁的业务场景以及使用案例,这篇很全
2022-03-23 11:22:50本文记录乐观锁悲观锁的使用场景以及案例,由MVCC引出乐观锁和悲观锁和一些共享锁、排他锁、当前读、快照读的概念,全面分析乐观锁和悲观锁。 -
一文搞懂分布式锁及其业务场景
2019-09-12 09:40:04在讨论这个问题之前,我们先来看一个业务场景: 系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户下单。 由于系统有... -
装饰器是什么,有什么功能,能用在什么业务场景?
2018-05-15 21:03:053.装饰器的返回值也是⼀个函数的对象,它经常用于有切面需求的场景,实现路由传参,flask的路由传参依赖于装饰器,浏览器通过url访问到装饰器的路由,从而访问视图函数获得返回的HTML页面; 应用场景:1.可以在外层... -
MySQL中的find_in_set()函数使用技巧心得与应用场景总结
2021-01-27 14:17:41知乎@极客小俊,官方首发原创文章前言今天很多小伙伴来问我find_in_set这个函数在MySQL中到底有什么用处 还有与这个函数相关的应用场景会有哪些? 今天我就来给大家讲解一下这个函数从基本的使用到实际应用! 让大家... -
Redis之5———set类型详解:常用操作、业务场景
2020-05-30 17:03:39介绍了redis set类型,包括详细操作和业务场景等。 -
策略模式在实际业务场景中的使用及优化
2019-09-30 10:28:03策略模式在实际业务场景中的使用及优化 策略模式(Strategy Pattern):定义不同的策略算法,以达到新增算法、移除算法、修改算法的便利性和调用无感知,并且不同的算法区分开之后也更加方便阅读策略算法。(个人... -
Redis 面试中必考的业务场景解析
2019-04-23 15:26:13Redis 各个知识点在业务场景中的使用方式; Redis 可能遇到的困难以及解决方案(穿透、雪崩等); Redis 分布式环境的使用方案(分布式锁、自增 ID 等); Redis 集群模式总结; Redis 面试题目总结。 ... -
真实业务场景下,事务隔离级别使用读提交还是可重复读?
2020-06-23 09:48:51那我们在实际场景中到底用的哪种隔离级别比较多呢?答案是:提交读! 缘由一:在RR隔离级别下,存在间隙锁,导致出现死锁的几率比RC大的多! 缘由二:在RR隔离级别下,条件列未命中索引会锁表!而在RC隔离级别下,... -
Redis 的 String,hash,list,set,zet常用命令 及其实际业务场景
2020-04-17 23:09:48redis基础命令 select切换数据库:一共16个库(索引从0开始) dbsize查看当前数据库的key的数量 flushdb:清空当前库 Flushall;通杀全部库 key 相关的命令 ...keys *:查看当前数据库所有的key ... -
redis的SortSet应用场景
2017-10-13 15:46:11应用场景:论坛的热门帖子[回复数前五] redis默认根据权升序排列集合 name :0 > zadd hot 100 [权--帖子回复数] 1 [值--帖子id] 1 name :0 > zadd hot 200 2 1 name :0 > zadd hot 300 3 1 ... -
Redis适用的业务场景
2020-05-31 22:19:41Redis基础适用业务场景 总结: 本质:底层使用C语言开发 注意:业务逻辑不要放到redis处理 详细命令参照:这哥们写的不错 hash 购物车: 商家id为key 商品id为field 参与商品数量为value string讲究整体性,适合读... -
转账业务场景
2018-04-18 13:14:00A转给B100元 两个关键点: 1 A B sql在一个事务中 ...lined = update set A.money = A.money-100 where A.money >= 100 if(lined == 0) return 没钱; update set B.money = B.money+100 提交事务 ... -
redis 五大类型学习笔记(业务场景+精美截图)
2022-05-18 09:42:56常见业务场景 1.秒杀商品的扣库存 2.热点微博点赞数量 二、Hash 简介 常用个性命令 常见业务场景 1.热点明星资料 2.双十一上架的商品属性 三、List 简介 常用个性命令 常见业务场景 1.热点明星的粉丝列表 四、Set ... -
java集合总结使用场景
2021-10-06 20:22:51集合总结使用场景 在开发中选择什么集合实现类,主要取决于业务操作的特点,然后根据集合实现类特性进行选择: 先判断存储的类型(一组对象(单一)或一组键值对(双列)) 一组对象(单列):Collection 接口 ... -
【vue计算属性】 computed,动态计算值,具体业务场景详细分析讲解
2022-04-27 21:17:57一直都知道计算属性大概是个什么,但是之前项目里用的不多,甚至是基本上用不到,学习过,但是不去用的话始终不会有深刻的印象。 今天用到了,打算好好记录一下,多做笔记,以后找起来也方便 ** 计算属性是通过一... -
每日一博 - CountDownLatch使用场景分析以及源码分析
2021-11-05 01:02:54分析一下这个业务场景, 让method 1 和 method 2 异步执行,然后执行完以后再回到主线程,取到返回结果汇总呗 我们简化下,不获取返回结果 package com.artisan.juc; import java.util.concurrent.*; /** * @author...