Redis应用场景

news2025/1/13 3:09:45

redis的五种基本数据类型

结构类型

结构存储的值

结构的读写能力

String字符串

可以是字符串、整数或浮点数

对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;

List列表

一个链表,链表上的每个节点都包含一个字符串

对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素;

Set集合

包含字符串的无序集合

字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等

Hash散列

包含键值对的无序散列表

包含方法有添加、获取、删除单个元素

Zset有序集合

和散列一样,用于存储键值对

字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素

  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中存储的值减1

INCRBY key increment //将key中存储的值加上increment

DECRBY key decrement //将key中存储的值减去increment

应用场景:

①单值缓存

SET key value

GET VALUE

可以将商品的库存存入redis,在缓存中减少商品效率更高

②对象缓存(登录验证)

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

③分布式锁

线程1: SETNX product:10001 true //返回1代表获取锁成功

线程2: SETNX product:10001 true //返回0代表获取锁失败

...执行业务操作

DEL product:10001 //执行完业务释放锁

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

④计数器

INCR article:readCount: {文章id}

GET article:readCount: {文章id}

⑤分布式系统全局序列号(分库分表的情况下,主键保证不重复)

INCR orderId //如果订单数量大 redis压力会很大

INCRBY oderId 100 //redis批量生成序列号提升性能 直接分配100个 在内存中++,也能保证id不会重复

  1. Hash常用操作

HSET key field value //存储一个哈希表key的键值

HSETNX key field value //存储一个不存在的哈希表key的键值

HMSET key field value [field value ...] //在一个哈希表存入多个键值对

HGET key field //获取哈希表key中对应field的值

HMGET key field [field ...] // 批量获取field值

HDEL key field [field ...] // 删除key中field值

HLEN key //获取key中field的数量

HGETALL key //返回哈希表key中所有的键值

HINCRBY key fileld increment //为哈希表key中field键的值加上增量increment

应用场景:

①对象缓存

HMSET user 1:name zhuge 1:balance 1888

HMGET user 1:name 1:balance //哈希的存储方式比直接把对象装备json(String类型存储)的好处主要体现在可以灵活操作某一个field的value,如果使用string类型存储则需要先反序列化再进行操作

②电商购物车

  1. 以用户id为key

  1. 商品id为field

  1. 商品数量为value

购物车操作

  1. 添加商品->hset cart:1001 10088 1

  1. 增加数量->hincrby cart:1001 10088 1

  1. 商品总数->hlen cart:1001

  1. 删除商品 ->hdel cart:1001 10088

  1. 获取购物车所有商品->hgetall cart:1001

  1. List常用操作:

LPUSH key value [value ...] //将一个或多个值value插入到key列表的表头(最左边)

RPUSH key value [value ...] //将一个或多个值value插入到key列表的表头(最右边)

LPOP key //从左边移出并返回列表的元素(头)

LPOP key //从右边移出并返回列表的元素(尾)

LRANGE key start stop //返回列表指定区间内的元素

BLPOP key [key ...] timeout //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,则一直等待

BRPOP key [key ...] timeout //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,则一直等待

应用场景:

①常用分布式数据结构

Stack(栈) = LPUSH + LPOP

Queue(队列) = LPUSH + RPOP

Blocking MQ(阻塞队列) = LPUSH + BRPOP

②微博消息和微信公众号消息(适用粉丝少)

使用关系型数据存储,消息会有很多,查询最新的消息需要oderBy ,orderBy比较耗时,尤其数据量大的时候

小明关注了备胎说车,MacTtalk,等大v

备胎说车发微博,消息id为10018 # LPUSH msg :{小明-id} 10018

MacTtalk发微博,消息id为10016 # LPUSH msg :{小明-id} 10016

查看最新微博消息: LRANGE msg:{小明-id} 0 4

  1. Set集合:

常用操作:

SADD key member [member ...] //往集合key中存入元素,元素存在则忽略,不存在则新建

SREM key member [member ...] //从集合key中删除元素

SMEMBERS key //获取集合中所有元素

SCARD key //获取集合key的元素个数

SISMEMBER key member //判断member元素是否存在于集合key中

SRANDMEMBER key [count] //从集合key中选出count个元素,元素不从key中删除

STOP key [count] //从集合key中选出count个元素,元素从key中删除

Set运算操作:

SINTER key [key ...] //交集运算

SINTERSTORE destination key [key ...] //将交集结果存入新集合 destination中

SUNION key [key ...] //并集运算

SUNIONSTORE destination key [key ...] //将并集结果存入新集合 destination中

SDIFF key [key ...] //差集运算

SDIFFSTORE destination key [key ...] //将差集结果存入新集合 destination中

集合操作:

SINTER set1 set2 set3 ->{c}

SUNION set1 set2 set3 ->{a,b,c,d,e}

SDIFF set1 set2 set3 ->{a}

应用场景:

①微信抽奖小程序

  1. 点击参与抽奖加入集合: SADD key {userId}

  1. 查看参与抽奖所有用户: SMEMBERS key

  1. 抽取count名中奖者: SRANDMEMBER key [count] /STOP key [count]

②微信微博点赞,收藏,标签

  1. 点赞: SADD like:{消息id} {用户id}

  1. 取消点赞: SREM like:{消息id} {用户id}

  1. 检查用户是否点过攒: SISMEMBERS like:{消息id} {用户id}

  1. 获取点赞的用户列表: SMEMBERS like:{消息id}

  1. 获取用户点赞数: SCARD like:{消息id}

③集合操作实现微博微信关注模型

  1. xiaoming关注的人: hong,hei

  1. bai关注的人:xiaoming,huang,hong,hei

  1. hong关注的人: xiaoming,bai,huang,hei,hui

  1. xiaoming和bai共同关注: SINTER xiaoming bai

  1. ZSet集合:

常用操作:

ZADD key score member [[score member] ...] //往有序集合key中加入带分值元素

ZREM key member [member ...] //从有序集合key中删除元素

ZSCORE key member //返回有序集合中key元素member的分值

ZINCRBY key incrment member //为有序集合中key元素member的分值加上incrment

ZCARD key //返回有序集合key中元素个数

ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start到stop的元素

ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start到stop的元素

ZSet集合操作

ZUNIONSTORE deskey numkeys key [key ...] //并集计算

ZINTERSTORE deskey numkeys key [key ...] //交集计算

应用场景:

①实现排行榜

  1. 点击新闻: ZINCRBY hostNews:20230210 1 xxx者会

  1. 展示当日排行前十: ZREVRANGE hostNews:20230210 0 9 WITHSCORES

  1. 七日搜索榜单计算: ZUNIONSTORE hostNews:20230210-hostNews:20230204 7 hostNews:20230204 ... hostNews:20230210

  1. 展示七日排行前十: ZREVRANGE hostNews:20230210-hostNews:20230204 0 9 WITHSCORES

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

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

相关文章

Docker进阶 - 9. docker network 之自定义网络

1. 运行两个tomcat实例,并进入容器内部 docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8 docker exec -it tomcat81 bashdocker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-idk8 docker exec -it tomcat82 bash2. ping一下各自的ip…

Windeployqt 打包,缺少dll 的解决方法

Windeployqt 打包,缺少DLL 的原因分析,解决方法 很多同学使用工具windeployqt进行打包发布后,运行exe文件时,还是会出现下图所示的系统错误提示,这种情况就表示相关的DLL 库文件没有被正确打包。可是windeployqt明确显…

20230210使AIO-3568J开发板在Android12下调通3个USB

20230210使AIO-3568J开发板在Android12下调通3个USB 2023/2/10 10:00 0、默认编译RK3568的Andorid12的rk3568-evb2-lp4x-v10.dts,2个USB2.0接口的鼠标可以用。 并列USB3.0接口的上面的鼠标不能用。USB3.0接口下面可以连接ADB。 vcc5v0_host: vcc5v0-host-regula…

邀您参赛!DCIC 2023「科技金融欺诈风险识别」算法赛正在报名中

近年来,跨境赌博、电信网络诈骗、黑产等外部欺诈违法犯罪形势日益严峻,呈现线上化、产业化、团伙化等特征,国家、监管机构及银行自身都高度重视反欺诈治理工作,坚决守护人民群众的财产安全。 为进一步打击外部欺诈违法犯罪行为&am…

CentOS7 ifconfig(或 ip addr)命令不显示IP地址

问题(因为当时没有存图 所以这个图上是网上找的 )解决办法第一:可能是本地服务没有开启,检查本地服务。如图所示,检查这两个服务是否开启。注:如何快速找到服务 可以把光标放在其中一个上面 然后按下VM就可…

硬盘分类及挂载硬盘知识补充和介绍

一、硬盘介绍Linux硬盘分IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘1.对于IDE硬盘,驱动器标识符为"hdx~",其中"hd"表明分区所在设备的类型,这里是指IDE硬盘了。"x"为盘号(a为基本盘,b为基…

endo-BCN-PEG4-Palmitic,环丙烷环辛炔四聚乙二醇-Palmitic包装灵活

endo-BCN-PEG4-Palmitic,endo环丙烷环辛炔四聚乙二醇-Palmitic反应特点:endo-BCN-PEG4-Palmitic 酯在其末端含有一个 Palmitic基和一个 BCN 基。对点击试剂来说同样会通过不同的小分子PEG进行连接,BCN-PEG-acid、BCN-PEG-NHS ester、BCN-PEG-…

软件测试—对职业生涯发展的一些感想

目录:导读 职场生涯 1、短期规划 2、长期规划 自身定位 1、你在哪儿? 2、你想要什么? 3、你拥有什么? 4、你需要做什么?什么时候做? 5、淡定啊淡定 最近工作不是很忙,有空都是在看书&a…

多传感器融合定位十一-基于滤波的融合方法Ⅱ

多传感器融合定位十一-基于滤波的融合方法Ⅱ1. 编码器运动模型及标定1.1 编码器基础知识1.2 编码器运动模型1.2.1 旋转半径求解1.2.2 角速度求解1.2.3 线速度求解1.2.4 位姿求解1.3 编码器的标定1.3.1 轮子半径标定1.3.2 轮子与底盘中心距离标定2. 融合编码器的滤波方法2.1 核心…

调用chatgpt的api, 必须知道的三件事

牙叔教程 简单易懂 调用api的代码 let url "https://api.openai.com/v1/completions"; let answer await axios // 使用axios发送post请求.post(url, data, { headers: headers }).then((res) > {return res.data.choices[0].text.trim();}).catch((err) >…

谈谈会话管理

客户端和服务器之间进行数据传输遵循的是HTTP协议, 此协议属于无状态协议(一次请求对应一次响应, 响应完之后断开连接), 服务器是无法跟踪客户端的请求, 通过cookie技术可以给客户端添加一个标识, 客户端之后发出的每次请求都会带着这个标识从而让服务器识别此客户端, 但由于co…

PostgreSQL入门

PostgreSQL入门 简介 PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES, 版本 4.2为基础的对象关系型数据库管理系统(ORDBMS) 支持大部分SQL标准并且提供了许多现代特性 复杂查询外键触发器可更新视图事务完整性多版本并发控制 …

引导滤波code

文章目录1. 原理概述2. 实验环节2.1 验证与opencv 库函数的结果一致2.2 与 双边滤波比较2.3 引导滤波应用,fathering2.3 引导滤波应用,图像增强2.4 灰度图引导,和各自通道引导的效果差异2.5 不同参数设置影响3. 参考引导滤波1. 原理概述 引导…

VHDL语言基础-状态机设计-ASM图法状态机设计

目录 有限状态机的描述方法: ASM图: 状态转移图: 状态转移列表: MDS图: ASM图法状态机设计: ASM图的组成: 状态框: 判断框: 条件框: 状态框与条件框…

Python之FileNotFoundError: [Errno 2] No such file or directory问题处理

错误信息:FileNotFoundError: [Errno 2] No such file or directory: ../AutoFrame/temp/report.xlsx相对于当前文件夹的路径,其实就是你写的py文件所在的文件夹路径!python在对文件的操作时,需要特别注意文件地址的书写。文件的路…

上海亚商投顾:三大指数集体调整 消费板块逆市活跃

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。市场情绪三大指数今日集体调整,沪指全天弱势震荡,创业板指盘中跌超1%。旅游、食品、乳业等大消费板块…

渗透测试 -- 网站信息收集

数据来源 01 网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言(php、java、...)、数据库(Mysql、...)为什么要了解这些? 举个例子:发现了一…

vue3组件库项目学习笔记(八):Git 使用总结

目前组件库的开发已经接近尾声,因为这次是使用 git 进行协作的开发模式,在团队协作的时候遇到很多的问题,开发过程中发现小伙伴们对于 git 的使用还不是很熟练,这里就简单总结一下常用的 git 的操作,大致有&#xff1a…

Revit快速材质切换:同一墙面赋予不同材质的方法

一、Revit中对同一墙面赋予不同材质的方法 方法1:零件法 重点:通过工作平面面板上的设置工作平面命令选取正确的面取消勾选通过原始分类的材质,如图1所示 方法2:拆分构造层绘制一道墙体,选择创建的墙体,单击…

判断元素是否在可视区域

前言 在日常开发中,我们经常需要判断目标元素是否在视窗之内或者和视窗的距离小于一个值(例如 100 px),从而实现一些常用的功能,例如: 图片的懒加载列表的无限滚动计算广告元素的曝光情况可点击链接的预加…