formdata.append加多个值_redis的五种数据结构和应用场景:微博微信点赞+加购物车等...

Redis五种数据结构如下:

28239f9f511324c5ce070e3ee40bc40f.png

1.String 字符串类型

是redis中最基本的数据类型,一个key对应一个value。

String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。

2.Hash (哈希)

是一个Mapmap,指值本身又是一种键值对结构,如 value={{field1,value1},......fieldN,valueN}}

3.链表 (List)

List 说白了就是链表(redis 使用双端链表实现的 List),是有序的,value可以重复,可以通过下标取出对应的value值,左右两边都能进行插入和删除数据。

4.Set 集合

集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中 1. 不允许有重复的元素,2.集合中的元素是无序的,不能通过索引下标获取元素,3.支持集合间的操作,可以取多个集合取交集、并集、差集。

5.zset 有序集合

有序集合和集合有着必然的联系,保留了集合不能有重复成员的特性,区别是,有序集合中的元素是可以排序的,它给每个元素设置一个分数,作为排序的依据。

应用场景

String应用场景

91e378f8270f6fa6adec15b49a65e9a0.png
5529657a19c4d91f2ecd643c05d230eb.png

1. 单值缓存

Set Key Value

Get Key

2. 对象缓存

1.Set user:1 value (json格式数据)

2.MSet user:1:name guajia use:1:balance 1888

MGet user1:name user:1:balance

3. 分布式锁:

3.1 分布式运用场景一【下单减库存】

79ce6ffba905436cbc51f58261f5f8f4.png

如图标红的部分,如果是单体架构 我们一般是这样来实现减库存操作的 但是在高并发的互联网公司这样做,就会造成“超卖”的现象。所以就需要redis来实现分布式锁

如上图标记SETNX命令 它只会存入一个不存在的键值对,如果不会改变原来的key所存入的值,返回结果为0

SETNX product:10001 true //返回1代表获取锁成功 返回0代表获取锁失败---》 执行业务操作

d3dac0be9690b697c6e835b1836fb10f.png

如果setnx 命令返回0 直接扔给前端后端服务正忙 请稍后重试】 DEL product:10001 //执行完业务用它来释放锁

SET product:10001 true ex 10 nx //防止程序意外终止而导致死锁

3.2 分布式运用场景二

06ea7e5724fff758381d4c818d1dc240.png

INCR 命令 每次执行 所存储的key的值 数量加1 (如果用数据库的话 需要考虑并发和加锁) 【注:redis是个单线程应用程序 这样不会导致高并发的脏读,主从的redis 在后面会使用分布式锁,一般单体的redis并发量在9-10万左右 】

6bd26cb00d474ad770ca4048d3644e9e.png

3.3 分布式运用场景三 【 Web集群的session 共享 】

原理是把原有的tomcat存储用户信息转为redis 把用户的信息 序列化后 存入redis。

3.4 分布式运用场景四【 分布式系统全局序列号 】

INCRBY orderId 1000 // redis 批量生成序列号提升性能

如项目使用 分库分表 ,就可以使用这个 ,目的是让主键ID 在都是唯一的 ,这个在实际场景非常重要。

使用INCRBY orderId 1000 (这个命令是一次生成1000个订单id 供下次生成订单使用)

Hash应用场景

96badecf9894b3094e424bcb3a799a82.png

大家仔细看 Hset key field value 比string多出来了一个field

3518dec90833ae20c795ba2d02bbb595.png
7c4aa8a496be0442e5435ef4c95cac17.png

Hash应用场景一 【电商购物车】

ff4aeb3b9f9d7b9136132979efa686df.png
d7b1e3b9e0831eef7851b5bf1997df3a.png

如图先示刚加入购物车的商品使用 hset cart:1001 10088 1,啥意思 cart代表的购物车 当然这个key 你可以随意定 但是意义要让所有人清楚,:1001 这里代表的是用户id,后面的10088 代表的是商品id。

第二步 点击 购物车的增加商品按钮 可以使用hincrby 命令 对已有值进行增量操作

有人可能会问,如果减少加购数量?骚年 你太年轻了 可以把增量的值调为-1 那每次就是减1

获取购物车商品总数 hlen cart:1001 [这边把商品id去掉就行了 前提是你所有的加购设置key 和field的格式是一样的 不然查出来的数量肯定不对] //它返回的是key下的所有field数量

涉及删除商品,使用删除的命令 hdel cart:1001 10088

获取加购商品的总数量 使用hgetall cart:1001 //它返回的key下的所有键值,可以把所有的值加起来就是加购商品总数量

6b787f0d6374384392b7bbf9f52aa6ad.png

hash的优点 缺点

6a78a83a5bb1e05f87729d88acee420f.png

hash的会分配槽位,集群中 会导致数据过于集中,没办法做分片。

List应用场景

4386ab7d77e70d7ef86ff6e7c32b5642.png

仔细看命令前缀 有L 和R 分别代表左和右。

常用的数据结构

7b6542c1d7527ca7169eeb205d81ad5c.png

: LPUSH +LPOP = > 放进去的数据放在左边 导致最后放进去的元素处于栈顶 最先的元素是处于栈底 使用LPOP 取值【或称移除值】是先从最左侧【栈顶】取值的 符合 先进后出的规则 【FILO】

队列: 与上面相反 取值时是使用RPOP 是 移除值是从最右侧开始的 所有最后进入的会被取出 符合 队列的先进先出的规则【FIFO】

**BLOCKIng MQ(阻塞队列) **: = LPUSH +BRPOP [这个就是一个消息队列 ,消息队列中有个发送者 和 接受者 ]

BRPOP 就是从key列表尾弹出一个元素,如果列表中没有元素,就会一直处于阻塞等待多少秒,后面又会循环地执行 直到取到元素为止

运用的场景一 【微博和公众号的消息流】

afd433e787ca5c33293f300b554d1f19.png

如微博你关注了1000个大V 每个大V 一天放两条数据 ,有1亿用户 。那么数据量有多大。可能有几百M的数据。 如果使用数据库 查询效率那就不是很高了

比如 你关注了小明和小红。

小明发了一条消息: 使用 LPUSH msg:小明Id 消息Id 小红发了一条消息: 使用 LPUSH msg:小红Id 消息Id

查看最新的微博消息: 使用LRANGE msg:小红Id 0 4 这个就是从左侧取下标是0到4的消息 意味着是取小红发的最新的5条消息的消息ID 进而从缓存里面取出对应的消息内容

SET应用场景

2c7a69b9ad89eececa22b7db7e20aaed.png

常见命令

50ad11263ab9a6cb2ea63cb6c3bd7a1e.png

运用的场景一 【微信抽奖】

e0002ed0a0a43f29726298b10275fd33.png

1.参与抽奖: SADD key 用户id : 参与了用户的id

2.查看参与抽奖的又会: SMEMBERS key

  1. 抽取n名中奖者

方式一:DMEMBER key [count]

方式二: SPOP key [count]

方式一和方式二的运用常见是 方式一 只有中奖单一 没有多次抽奖和设置奖品等级。因为方式一 每次执行不会把抽取的数据删掉,后面执行还可能会抽取到原来的用户

[ SRANDMEMBER key [count] 返回集合中一个或多个随机数]

637683942c1ee5e7d0e471da88337a4f.png

ps: like:{消息ID} 就是 key {用户ID} 是 member

运用的场景三【微信微博关注模型】

f248a246f549c5ed4aac0f7220022786.png

SDIFF set1 set2 set3 是以 set1为基准 秋 与set2和set3的并集 的差集

[得到a是set2和set3的并集中所没有的】

关注模型:

1.你关注的人

set guanzhu:我的id {张三、李四、王五、小明、程咬金}

2.小明关注的人

set guanzhu:小明的id {张三、赵六、尼古拉斯}

3.程咬金关注的人

set guanzhu:程咬金的id {小明、李四}

4.我和小明的共同关注:

SINTER guanzhu:我的id guanzhu:小明的id

得到就是 张三

5.我关注的人也在关注他 【我关注的某人 否也请关注小明】

SISMEMBER guanzhu:程咬金的id 小明的ID

SISMEMBER guanzhu:张三的id 小明的ID

SISMEMBER //判断 member 元素是否是集合 key 的成员

6.我可能认识的人

SDIFF guanzhu:小明的id 我的ID

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

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

相关文章

iOS开发-自动隐藏键盘及状态栏

1.隐藏状态栏 iOS升级至7.0以后,很多API被废止,其中原有隐藏状态栏StatusBar的方法就失效了。 原有方案 [[UIApplication sharedApplication] setStatusBarHidden:YES]; 但很不幸,在后来的版本中实效了,因此我们可以使用新的API来…

python gevent模块 下载_【python安全攻防】包、模块、类、对象

终于又到了一周一度的整理博客的时间了,博主平时课余时间看书,周末统一整理,坚持周更真是爱了爱了 ~今天要说的是python面向对象这一部分的内容,今天这是基础篇的第二篇,也是最后一篇。说来基础篇还真是少呢…

LeetCode LCP 33. 蓄水(暴力枚举)

文章目录1. 题目2. 解题1. 题目 给定 N 个无限容量且初始均空的水缸,每个水缸配有一个水桶用来打水,第 i 个水缸配备的水桶容量记作 bucket[i]。小扣有以下两种操作: 升级水桶:选择任意一个水桶,使其容量增加为 buck…

302状态码_你见过 HTTP 哪些状态码?

❝好久没有写技术文章,今天在四川广元无事,总结一篇。附一张今天早上在嘉陵江遇见的白鹡鸰 (不是我拍的)❞白鹡鸰101 Switch Protocol200 Ok201 Created204 No Content206 Partial Content301 Moved Permanently302 Found304 Not Modified307 Temporary …

LeetCode LCP 34. 二叉树染色(树上DP)

文章目录1. 题目2. 解题1. 题目 小扣有一个根结点为 root 的二叉树模型,初始所有结点均为白色,可以用蓝色染料给模型结点染色,模型的每个结点有一个 val 价值。 小扣出于美观考虑,希望最后二叉树上每个蓝色相连部分的结点个数不能…

delphi 串口通信发送_关于串口通信232、485、422和常见问题,就没见过能讲这么清楚的...

先讲串口通信的一些基本概念,术语。如果对串口通信比较熟悉的,就当复习,如果哪里讲的不到位,欢迎及时指出。这里并不对串口的编程作讲解,主要是从应用的角度去讲一讲。因为更多的时候,都是产品做好了&#…

LeetCode 1822. 数组元素积的符号

文章目录1. 题目2. 解题1. 题目 已知函数 signFunc(x) 将会根据 x 的正负返回特定值: 如果 x 是正数,返回 1 。如果 x 是负数,返回 -1 。如果 x 是等于 0 ,返回 0 。 给你一个整数数组 nums 。 令 product 为数组 nums 中所有元…

快速替换图片的组合-AE-样片!

模板下载网址:http://pan.baidu.com/s/1hqCbErM转载于:https://www.cnblogs.com/nedtwo/p/4278337.html

南昌理工学院计算机网络技术专业怎么样,南昌理工学院怎么样 重点专业是什么...

毕业季即将来临,报考的时候同学们和家长朋友们最关心的就是学校好不好的问题,想要了解学校有哪些特色专业、师资力量怎么样。下面小编整理了南昌理工学院的信息,供大家参考。南昌理工学院重点专业国家级特色专业:计算机科学与技术…

matplotlib绘图_使用matplotlib库绘图

本代码演示对列表元素进行绘图并可视化代码如下:import matplotlib.pyplot as plt #导入matplotlib绘图库,并设置简称为pltlist1[i*2 for i in range(1,10)] #遍历range(1,10)里的元素,并每个乘以2,并将最终的列表赋值给list1plt.…

LeetCode 1824. 最少侧跳次数(DP)

文章目录1. 题目2. 解题1. 题目 给你一个长度为 n 的 3 跑道道路 ,它总共包含 n 1 个 点 ,编号为 0 到 n 。 一只青蛙从 0 号点第二条跑道 出发 ,它想要跳到点 n 处。然而道路上可能有一些障碍。 给你一个长度为 n 1 的数组 obstacles &a…

postman 使用_Postman简单使用

今天主要讲解下Postman的简单使用。在使用前,首先需要了解一下什么是Postman,它可以用来做什么?1、 Postman是一款自动化测试的工具,它可以方便的处理HTTP的请求(get、post、put、delete等)。本文主要讲解get和post的使用。2、 那…

中山大学校队选拔赛第二试题试题3【Compressed suffix array】-------2015年2月8日

一:题目大意 本题通过给定三个数组S0,P,S,其中S0是1到2n的一个排列,P具有2n个整数,且满足: 数组S是把数组S0中所有奇数元素全部删除并将所有偶数元素除以2并按照原来的相对顺序进行排列而得。 现…

LeetCode 1825. 求出 MK 平均值(set + queue)

文章目录1. 题目2. 解题1. 题目 给你两个整数 m 和 k ,以及数据流形式的若干整数。 你需要实现一个数据结构,计算这个数据流的 MK 平均值 。 MK 平均值 按照如下步骤计算: 如果数据流中的整数少于 m 个,MK 平均值 为 -1 &#…

maven deploy plugin_Maven快速上手

作者:u_7deeb657158f出自:ITPUB博客原文:blog.itpub.net/69956102/viewspace-2726121/创建项目首先需要创建一个用于存储项目的文件夹,在控制台中输入以下命令:mvn archetype:generate -DgroupIdcom.mycompany.app -Da…

.net string format

转自:http://www.cnblogs.com/jobs2/p/3948049.html 转自:http://jingyan.baidu.com/article/48206aeaf8c52f216ad6b300.html 1、格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元&#xff0…

python画饼图_百度飞桨PaddlePaddle之[Python小白逆袭大神]7天训练营

第三次参加百度的7天训练营了这次参加的主题是【Python小白逆袭大神】,不过你别看是小白逆势。。。除非你一开始参加就逆袭完,不然你真的是python小白,这个课程还是有难难度的。说一下个训练营的特点版。这个营从python一些基础练习-->数据…

潍坊学院的计算机类怎么样,潍坊学院教育技术学专业怎么样?有知道的麻烦说下,谢谢!...

潍坊学院教育技术学专业怎么样?有知道的麻烦说下,谢谢!以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!潍坊学院教育技术学专业怎么样?有知道的…

c++ class struct同名_C/C++面向对象编程之封装

点击“蓝字”关注我们吧前言:何为面向过程:面向过程,本质是“顺序,循环,分支” 面向过程开发,就像是总有人问你要后续的计划一样,下一步做什么,再下一步做什么,意外、事物…

LeetCode 1718. 构建字典序最大的可行序列(贪心+回溯)

文章目录1. 题目2. 解题1. 题目 给你一个整数 n ,请你找到满足下面条件的一个序列: 整数 1 在序列中只出现一次。2 到 n 之间每个整数都恰好出现两次。对于每个 2 到 n 之间的整数 i ,两个 i 之间出现的距离恰好为 i 。 序列里面两个数 a[…