Redis五种数据结构应用场景

文章目录

  • 前言
  • 二、字符串String
    • 2.1、常用操作
    • 2.2、应用场景
        • 2.2.1、单值缓存(最常用)
        • 2.2.2、对象缓存
        • 2.2.3、分布式锁
        • 2.2.4、计数器
  • 三、哈希hash
    • 3.1、常用操作
    • 3.2、应用场景
        • 3.2.1、对象缓存
        • 3.2.2、 电商购物车
  • 四、列表list
    • 4.1、常用操作
    • 4.2、应用场景
        • 4.2.1 微博和微信公号消息
  • 五、 集合set
    • 5.1 常用操作
    • 5.2 应用场景
        • 5.2.1 抽奖
        • 5.2.2 微博点赞,收藏,标签
        • 5.2.3 微博微信关注模型
        • 5.2.4 购物网站商品筛选
  • 六、有序集合sorted set
    • 6.1 常用操作
    • 6.2 应用场景
        • 6.2.1 微博热搜榜
  • 总结


前言

Redis作为缓存数据库,目前在市场上占有很大的使用率,大部分人在工作中都使用到其string格式的存储,对于剩下的数据结构却很少使用到,Redis 基本数据结构包含:字符串(string)、 散列(hash)、 列表(list)、 集合(set)、 有序集合(sorted set)五种。这五种数据结构在我们工作中不同的场景中经常使用到,面试过程中经常被问到,因此熟练掌握这5种基本数据结构的使用和应用场景是Redis知识最基础也是最重要的部分


在这里插入图片描述

二、字符串String

2.1、常用操作

SET  key  value 			//存入字符串键值对
MSET  key  value [key value ...] 	//批量存储字符串键值对
SETNX  key  value 		//存入一个不存在的字符串键值对
GET  key 			//获取一个字符串键值
MGET  key  [key ...]	 	//批量获取字符串键值
DEL  key  [key ...] 		//删除一个键
EXPIRE  key  seconds 		//设置一个键的过期时间(秒)
INCR  key 			//将key中储存的数字值加1
DECR  key 			//将key中储存的数字值减1
INCRBY  key  increment 		//将key所储存的值加上increment
DECRBY  key  decrement 	//将key所储存的值减去decrement

2.2、应用场景

2.2.1、单值缓存(最常用)

set num 1

2.2.2、对象缓存

将对象转为json存储

SET  user:1  value(json格式数据)

将对象的每个字段作为可以存储

MSET  user:1:name  zhuge   user:1:balance  1888

在这里插入图片描述

2.2.3、分布式锁

SETNX  product:10001  true 		//返回1代表获取锁成功
SETNX  product:10001  true 		//返回0代表获取锁失败
。。。执行业务操作
DEL  product:10001			//执行完业务释放锁SET product:10001 true  ex  10  nx //设置过期时间防止程序意外终止导致死锁

在这里插入图片描述
在这里插入图片描述

2.2.4、计数器

文章的阅读量、点赞量
在这里插入图片描述
在这里插入图片描述
分布式系统全局序列号,每个系统如果每次使用序号就从redis获取,影响性能,所以每个系统每次可以批量申请N个序号供当前系统使用,使用完毕后再继续获取,可以提升性能
在这里插入图片描述

三、哈希hash

3.1、常用操作

HSET  key  field  value 			//存储一个哈希表key的键值
HSETNX  key  field  value 		//存储一个不存在的哈希表key的键值
HMSET  key  field  value [field value ...] 	//在一个哈希表key中存储多个键值对
HGET  key  field 				//获取哈希表key对应的field键值
HMGET  key  field  [field ...] 		//批量获取哈希表key中多个field键值
HDEL  key  field  [field ...] 		//删除哈希表key中的field键值
HLEN  key				//返回哈希表key中field的数量
HGETALL  key				//返回哈希表key中所有的键值HINCRBY  key  field  increment 		//为哈希表key中field键的值加上增量increment

3.2、应用场景

3.2.1、对象缓存

在这里插入图片描述
在这里插入图片描述

3.2.2、 电商购物车

在这里插入图片描述

以用户id为key, 商品id为field,商品数量为value,添加购物车操作

HSET cart:1  10001 2   //用户1:商品10001  数量2
HSET cart:1  10002 1   //用户1:商品10002  数量1
HINCRBY cart:1 10001 1 //用户1:商品10001 数量+1
HINCRBY cart:1 10001 -2 //用户1:商品10001 数量-2
HLEN cart:1  //获取用户1购物车商品数量
HGETALL cart:1  //获取用户1购物车商品以及数量
hdel cart:1 10001  //删除用户1的10001商品

在这里插入图片描述
优点
1)同类数据归类整合储存,方便数据管理
2)相比string操作消耗内存与cpu更小
3)相比string储存更节省空间
缺点
过期功能不能使用在field上,只能用在key上
Redis集群架构下不适合大规模使用(key相同的经过hash后只会落在其中一台机器上

四、列表list

4.1、常用操作

LPUSH  key  value [value ...] 		//将一个或多个值value插入到key列表的表头(最左边)
RPUSH  key  value [value ...]	 	//将一个或多个值value插入到key列表的表尾(最右边)
LPOP  key			//移除并返回key列表的头元素
RPOP  key			//移除并返回key列表的尾元素
LRANGE  key  start  stop		//返回列表key中指定区间内的元素,区间以偏移量start和stop指定
LINSERT key  BEFORE|AFTER pivot element  // 在元素element前后插入pivot
LREM key count element  //根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素 count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 
//count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
//count = 0 : 移除表中所有与 VALUE 相等的值。
BLPOP  key  [key ...]  timeout	//从key列表表头弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待
BRPOP  key  [key ...]  timeout 	//从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待

4.2、应用场景

Stack(栈FILO) = LPUSH + LPOP  
Queue(队列FIFO)= LPUSH + RPOP
Blocking MQ(阻塞队列)= LPUSH + BRPOP

4.2.1 微博和微信公号消息

在这里插入图片描述
如上图公众号:我订阅了阿里云云栖号(id10001)、新华网(id10002)、infoQ(id10003)等
1、首先在msg:1列表中增加10001、10002、10003 ,以及各个用户对应的消息

LPUSH sub:1 10001 10002 10003LPUSH msg:10001 1 2 3
LPUSH msg:10002 4 5 6
LPUSH msg:10003 8 9 

2、此时10002发送一条消息 id : 11 ,首先在我订阅的集合中移除10002,然后在最前面加入10002,然后在msg中加入11

LREM sub:1 0 10002
LPUSH sub:1 10002 
LPUSH msg:10002 11

在这里插入图片描述

五、 集合set

5.1 常用操作

SADD  key  member  [member ...]			//往集合key中存入元素,元素存在则忽略,若key不存在则新建			
SREM  key  member  [member ...]			//从集合key中删除元素
SMEMBERS  key					//获取集合key中所有元素
SCARD  key					//获取集合key的元素个数
SISMEMBER  key  member			//判断member元素是否存在于集合key中
SRANDMEMBER  key  [count]			//从集合key中选出count个元素,元素不从key中删除
SPOP  key  [count]				//从集合key中选出count个元素,元素从key中删除SINTER  key  [key ...] 				//交集运算
SINTERSTORE  destination  key  [key ..]		//将交集结果存入新集合destination中
SUNION  key  [key ..] 				//并集运算
SUNIONSTORE  destination  key  [key ...]		//将并集结果存入新集合destination中
SDIFF  key  [key ...] 				//差集运算
SDIFFSTORE  destination  key  [key ...]		//将差集结果存入新集合destination中

5.2 应用场景

5.2.1 抽奖

在这里插入图片描述

  1. 参与抽奖
SADD luck:1001 100001 //将用户100001 加入商品1001 的参与池子中
  1. 查看参与抽奖所有用户
SMEMBERS luck:1001
  1. 抽取1名中奖者
SPOP luck:1001 1

5.2.2 微博点赞,收藏,标签

  • 点赞
SADD like:1 1001
  • 取消点赞
SREM like:1 1001
  • 检查用户是否点过赞
SISMEMBER  like:1 1001

5.2.3 微博微信关注模型

刘昊然关注:张杰、刘涛、王宝强

SADD follow:lhr zj lt wbq

张杰关注:刘昊然、刘涛、王宝强、王泷正、谢娜、胡歌

SADD follow:zj  lhr lt wbq wlz xl hg

刘涛关注:刘昊然、张杰、陈奕迅、许嵩

SADD follow:lt  lhr zj cyx xs

模型1:共同关注
刘昊然和张杰关注的人

SINTER follow:lhr follow:zj

在这里插入图片描述
模型2:我关注的人中也有关注
刘昊然关注的人也在关注胡歌

SISMEMBER follow:zj hg
SISMEMBER follow:lt hg
SISMEMBER follow:wbq hg

在这里插入图片描述

模型2:可能感兴趣的人
刘昊然访问张杰主页,会推荐感兴趣的人,张杰关注的人去且不在刘昊然关注中可以推荐

SDIFF follow:zj  follow:lhr

在这里插入图片描述
在这里插入图片描述

5.2.4 购物网站商品筛选

在这里插入图片描述

SADD  brand:huawei  P30  //华为品牌集合中  p30
SADD  brand:xiaomi  mi-6X //小米品牌集合中  mi-6X 
SADD  brand:iPhone iphone8 //苹果品牌集合中  iphone8  
SADD os:android  P30  mi-6X  //安卓系统集合中  P30  mi-6X
SADD cpu:brand:intel  P30  mi-6X //cpu 英特尔集合中  P30  mi-6X
SADD ram:8G  P30  mi-6X  iphone8 //8G内存集合中 P30  mi-6X  iphone8

查找内存为8G,英特尔CPU和安卓系统的手机:

SINTER  os:android  cpu:brand:intel  ram:8G

在这里插入图片描述

六、有序集合sorted set

6.1 常用操作

ZADD key score member [[score member]]	//往有序集合key中加入带分值元素
ZREM key member [member …]		//从有序集合key中删除元素
ZSCORE key member 			//返回有序集合key中元素member的分值
ZINCRBY key increment member		//为有序集合key中元素member的分值加上increment 
ZCARD key				//返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES]	//正序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES]	//倒序获取有序集合key从start下标到stop下标的元素ZUNIONSTORE destkey numkeys key [key ...] 	//并集计算
ZINTERSTORE destkey numkeys key [key …]	//交集计算

6.2 应用场景

6.2.1 微博热搜榜

在这里插入图片描述

以每天热搜新闻为一个集合,当天当一个用户点击一个话题后,分值+1
点击新闻

ZINCRBY hotnews:20220201 1 dawmll //2022-02-01 点击冬奥我们来了+1
ZINCRBY hotnews:20220201 1 gtljp //2022-02-01 点击高亭宇金牌+1
  • 展示当日排行前十
ZREVRANGE hotnews:20220201 0 10 WITHSCORES [WITHSCORES]
  • 2日搜索榜单计算
ZUNIONSTORE newhots 2 hotnews:20220201 hotnews:20220202 //将2个几个中的相同的值的分数相加,将结果放到newhots 中

在这里插入图片描述

  • 展示2日排行前十
ZREVRANGE newhots 0 10 //从上面统计的新的集合中取出前10

在这里插入图片描述


总结

通过本文,大家对Redis五种数据结构有了更多的了解,包括在实际场景中的使用,希望能帮助大家解决实际工作中的问题,后续也会更新Redis架构相关的文章。 如有帮助,感谢关注

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

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

相关文章

IntelliJ IDEA中的神仙插件

文章目录1. Alibaba Java Coding Guidelines2.GsonFormat3.A8Translation4.Maven Helper5.Free Mybatis plugin6.Grep Console7.Lombok8.Nyan progress bar9.FindBugs-IDEA10.Key Promoter X11.JavaDoc12.ignore13.RainbowBrackets14.Activate-power-mode15.CodeGlance16.Gener…

linux 远程拒绝服务,Linux Kernel SCTP远程拒绝服务漏洞

发布日期&#xff1a;2011-08-30更新日期&#xff1a;2011-08-30受影响系统&#xff1a;Linux kernel 2.6.x描述&#xff1a;--------------------------------------------------------------------------------BUGTRAQ ID: 49373CVE ID: CVE-2011-2482Linux Kernel是Linux操…

SpringBoot使用Websocket

webSocket是HTML5的一种新协议&#xff0c;它实现了服务端与客户端的全双工通信&#xff0c;建立在传输层&#xff0c;tcp协议之上&#xff0c;即浏览器与服务端需要先建立tcp协议&#xff0c;再发送webSocket连接建立请求。webSocket的连接&#xff1a;客户端发送请求信息&…

Springboot整合Websocket遇到的坑_websocket session不支持序列化,无法存储至redis_Websocket相关问题总结(Session共享,用户多端登录等)

Springboot整合Websocket遇到的坑 一、使用Springboot内嵌的tomcat启动websocket 1.添加ServerEndpointExporter配置bean Configuration public class WebSocketConfig {/*** 服务器节点** 如果使用独立的servlet容器&#xff0c;而不是直接使用springboot的内置容器&#x…

图文详解mina框架

Apache Mina Server 是一个网络通信应用框架&#xff0c;也就是说&#xff0c;它主要是对基于TCP/IP、UDP/IP协议栈的通信框架&#xff08;当然&#xff0c;也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等&#xff09;&#xff0c;Mina 可以帮助我们快速开发高性能、高…

MINA核心结构和处理消息的逻辑流程

1.MINA 核心结构 IoService 最底层的是IOService&#xff0c;负责具体的IO相关工作。这一层的典型代表有IOSocketAcceptor和IOSocketChannel&#xff0c;分别对应TCP协议下的服务端和客户端的IOService。IOService的意义在于隐藏底层IO的细节&#xff0c;对上提供统一的基于事…

TortoiseSVN忽略文件或文件夹

TortoiseSVN忽略文件或文件夹 方法一&#xff1a; 选择项目目录—>右键–选择TortoiseSVN–Properties 1.svn:ignore&#xff1a;必须每个工作目录都要设置 2.global-ignores&#xff1a;只需要配置一次 添加内容: .settings .settings/* target target/* .classpath .p…

Showdoc使用——接口文档

一、到showdoc官方注册账号 官方地址https://www.showdoc.com.cn/ 登录并创建一个项目,如图&#xff1a; 二、下载showdoc环境 再项目设置中有开发api,点开如下&#xff1a; 其中就是官方教程&#xff0c;简单全面。showdoc基础就是使用官方脚本 https://git-scm.com/downloa…

8款JVM性能调优监控工具(提高开发效率)

在平时的开发当中我们总是会遇到各种各样的问题&#xff0c;比如说内存泄漏、死锁、CPU等。遇到问题不可怕&#xff0c;关键是我们如何去排查这些错误&#xff0c;对症下药才是根本。不过对于很多人来说&#xff0c;往往找不到这些问题的根本所在&#xff0c;因此这篇文章主要是…

linux的静态编译elf无法调试,[翻译]自己动手编写一个Linux调试器系列之4 ELF文件格式与DWARF调试格式 by lantie@15PB...

自己动手编写一个Linux调试器系列之4 ELF文件格式与DWARF调试格式 by lantie15PB在上一节中&#xff0c;你已经听说了DWARF调试格式&#xff0c;它是程序的调试信息&#xff0c;是一种可以更好理解源码的方式&#xff0c;而不只是解析程序。今天我们将讨论源代码级调试信息的细…

SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题

SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题 当你开开心心搭建了一个SpringBoot项目&#xff0c;用插件生成了entity、dao、mapper&#xff0c;写下第一个Controller准备试一下&#xff0c;结果却发现一条简单的查询报错了。 {"timestamp…

Java中switch参数传null会引起异常——Java 语法糖

问题 switch 参数不能是null&#xff0c;swicth(null)会报java.lang.NullPointerException异常 查找原因 为什么会这样呢&#xff0c;查找一下原因&#xff1a; 找到编译后的class文件&#xff0c;就明白了 总结&#xff1a; switch 是一个语法糖。switch语句是先计算 par…

linux head命令作用,Linux查看文件内容之head命令

1. head命令简介本文主要介绍head命令的作用与常用使用方法&#xff0c;该命令和tail命令相反&#xff0c;head默认显示用来显示文本开头&#xff0c;而tail默认显示结尾某个数量的文字区块。2. head命令选项-q 隐藏文件名-v 显示文件名-c 显示字节数-n 显示的行数3. 常见使用方…

SpringBoot使用jasypt加解密密码

在我们的服务中不可避免的需要使用到一些秘钥&#xff08;数据库、redis等&#xff09;&#xff1b;使用过SpringBoot配置文件的朋友都知道&#xff0c;资源文件中的内容通常情况下是明文显示&#xff0c;安全性就比较低一些。打开application.properties或application.yml&…

android 写字体投影,android-给字体设置投影

1&#xff0c;在代码中添加文字阴影TextView 有一个方法/*** Gives the text a shadow of the specified radius and color, the specified* distance from its normal position.** attr ref android.R.styleable#TextView_shadowColor* attr ref android.R.styleable#TextView…

android 开源图表动画,Android 图表开发开源库MPAndroidChart-Go语言中文社区

上面是APP中实现的效果图(点击可以放大查看)图1的效果不是用这个实现的&#xff0c;如果感兴趣可以参考我这篇文章 Android渐变圆环总体来说&#xff0c;MPAndroidChart可能是目前Android 开发最好用的一个三方库了&#xff0c;功能非常强大&#xff0c;集成简单。直接导入作为…

电脑开启防火墙后ping不通 及 开启防火墙后,不能远程的解决办法

有些情况下电脑需要开防火墙但是又希望能被远程或者ping通。 一、先查看电脑的网络类型&#xff08;第二步中打开对应网络类型下的协议&#xff09; 二、控制面板 - Windows防火墙 - 高级设置-入站规则 &#xff08;1&#xff09;开启防火墙后&#xff0c;能ping通设置。 &…

android 时间应用程序,Android在首次启动时需要更多时间启动应用程序

在我的项目中&#xff0c;我使用了需要multidex支持的库。 根据我的研究&#xff0c;我发现它会导致应用启动时出现延迟。我在gradle中启用了multidexfunction。 defaultConfig {multiDexEnabled true}我曾经为kitkat设备获得NoClassDefFound Exception&#xff0c;所以我添加了…

Mysql中用between...and...查询日期时注意事项

select count(1) from user where regist_date between 2017-07-25 00:00:00 and 2017-07-25 24:00:00;这条sql语句查询出结果为0。实际上数据库有一条符合该查询条件的数据。 错误原因&#xff1a;2017-07-25 24:00:00 晚上24点即为下一天00点 2017-07-26 00:00:00&#xff0…

android core log,Android 日志系统(Logcat)的实现分析

这篇说一下Android 日志系统的实现&#xff1a;1. Android中的打印分为4个缓冲区和6个打印等级&#xff0c;在frameworks\base\core\java\android\util\Log.java中有定义&#xff1a;四缓冲&#xff1a;public static final int LOG_ID_MAIN 0;public static final int LOG_ID…