Redis场景总结
使用场景
在大型的秒杀库存扣减,app首页流量高峰,很容易将传统的关系型数据库(mysql,oracle等)给压垮。
还有很多没必要持久化的数据,比如说短信验证码,点赞数等。
分布式锁。
分布式缓存(会话共享)。
数据结构
redis的存储是以key-value的键值对的形式存储的,其中key都是String类型,value常见的就是以下的5种。
String
字符串类型,可以包含任何数据,最大可以是512MB,内部的实现结构和ArraList类似,采用内分配几余的形式,来减少内存的频繁分配(降低CPU压力)。
在创建字符串的时候,len 的长度就是capacity,当需要修改时,如果存储容量不够的话,就会进行扩容,当字符串的容量小于1mb时,就会执行加倍扩容,即扩容到2*capacity,当容量大于1MB时,每次多增加1MB。
set name mengze --存放字符串键值对 mset name mengze age 18 --批量存放键值对 SETNX name mengze --如果不存在key为name,那么就设置value (分布式锁的原理) get name -- 获取key mget name age --批量获取key DEL key --删除key expire key 6 --设置过期时间,单位为秒 INCR key --将key中存储的数字加1 DECR key --将key中存储的数字减1 INCRBY key 2 --将key中存储的值都加上2 DECRBY key 2 --将key中存储的值都减去2
需要注意的是,尽量避免同时操作大批量的key,比如给所有的key设置过期时间,因为redis是单线程的,如果操作耗费太多时间,会造成redis的假死。(暂时不对外提供服务)
使用场景
1,不需要持久化的数据或者频繁更新的数据,比如验证码,点赞数。
2,对象缓存
可以通过序列化工具类,来缓存java对象,比如将某个对象序列化为json,需要用的时候再取出来,反序列化。常见的使用方式有mybatis二级缓存,接口级别缓存等等。
3,使用setnx来实现分布式锁,(使用分布式锁时一定要设置过期时间,防止不能释放锁,造成死锁)
4,可以用incr,decr来实现点赞数
5,分布式全局id
在一个大型的系统下,如果涉及到分库分表后,mysql 的自增id,肯定满足不了需要,如果用户量不大,可以每次从redis 这里通过自增获取id,但是如果用户量大,每次都拿肯定会给redis造成压力,可以一次取1000个,放本地缓存里,等用完了再去取。
Hash
是一个key-value的键值对,和iava里的hashMap相似,当数据量较小是采用的是ziphash (默认),当数据量较大时采用hashtable。
常用命令
hset hash name mengze --设置值 hget hash name -- 获取值 hmset hash name mengze age 18 --批量设置 hmget hash name age --批量获取 hgetall hash --获取key的所有值 hkeys hash --获取hashmap中所有的key hvals hash --获取hashmap中所有的value
应用场景
可以用于存储系统中对象的数据。
也可以用于做缓存,来解决数据一致性的问题(不推荐)。
List
redis的list为quickList (快速链表)即多个ziplist (压缩链表)组合起来的。
redis的list是按插入顺序排序的,可以添加的一个节点到链表的头部(头插)或者尾部(尾插),是一个双向链表,对两端的操作性能会比较高,对中间节点的操作性能相对来说较差(因为得通过指针对遍历对应的节点)。
常用指令
rpush myList valu5e1 --向 ist 的头部 (右边)添加元素 rpush myList value2 value3 --向list的头部 (最右边)添加多个元素 lpop myList --将list的尾部(最左边)元素取出 rpop myList2 value1 --尾插
使用场景
可以实现栈和队列,需要注意的是,push和pop的操作是原子性的,所以操作redis的时候,直接用就行了,不要把list读出来,通过java修改,再放回去,这样不能保证数据一致性。 (先读先写或先读后写)。
Set
redis的set和list相似,只不过可以自动去重。 (java的set也可以自动去重)
当你需要存储一个没有重复数据的列表时就可以选择set,同时set也可以判断某个数据在不在集合里面。
set的底层结构是一个value为null的哈希表,也就意味着他的时间复杂度为0(1),也就意味着即使数据再多,查找的时间也是一样的。
使用场景
可以用来计算多个数据源的交集或并集。
SortedSet
和set很相似,sortedSet是一个有序不重复的列表。SortedSet里面的每个节点都关联了一个权重,用来排序。
(集合里的每个节点是唯一的,但是评分却可以是相同的),利用这个特性我们可以利用redis来实现排行榜。也可以很快速的获取到一个区间内的节点。
SortedSet的的底层是hash和跳表了一个很典型的数据结构,牺牲空间来换取时间) 。hash的作用是存储每个节点和权重,跳表的作用是用来快速获取一个区间里的节点。
redis常用的数据机构就是以上五种,还有一些不常用的。
使用场景
直播系统的实时排行榜
Geospatial
地理位置的缩写,可以表示一个区域的二维坐标,redis提供了经纬度设置,查询,范围查询,距离查询,经纬度hash等操作。
使用场景
可以用来计算距离最近的门店。
BloomFilter(布隆过滤器)
可能判断失误。因此他不适合零失误的场景布降过滤器是一段很长的二进制向量和一系列随机映射函数,用来快速检索一个元素是否在一个集合里。但是他的准确率不是百分之百,有可能判断失误。因此他不适合零失误的场景。
优点:
支持海量数据场景下,判断元素是否存在。
存储空间占用量小,不存储数据本身,存储的是hash值。
不存储数据本身,可以用来存储加密数据。
缺点:
不支持计数,同一个元素可以多次插入,而且效果是相同的。
使用场景
用来解决缓存穿透问题。
可以判断用户是否阅读过某篇文章,防止重复推送,比如说抖音。
相关文章:
Redis场景总结
使用场景 在大型的秒杀库存扣减,app首页流量高峰,很容易将传统的关系型数据库(mysql,oracle等)给压垮。 还有很多没必要持久化的数据,比如说短信验证码,点赞数等。 分布式锁。 分布式缓存(会话共享)。 …...
2024.3.11 C++作业
1、提示并输入一个字符串,统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数要求使用C风格字符串完成 #include <iostream>using namespace std;int main() {char str[20];cout << "please enter the str:";gets(str);in…...
【wps】wps与office办公函数储备使用(结合了使用案例 持续更新)
【wps】wps与office办公函数储备使用(结合了使用案例 持续更新) 1、TODAY函数 返回当前电脑系统显示的日期 TODAY函数:表示返回当前电脑系统显示的日期。 公式用法:TODAY() 2、NOW函数 返回当前电脑系统显示的日期和时间 NOW函数:表示返…...
初级爬虫实战——伯克利新闻
文章目录 发现宝藏一、 目标二、简单分析网页1. 寻找所有新闻2. 分析模块、版面和文章 三、爬取新闻1. 爬取模块2. 爬取版面3. 爬取文章 四、完整代码五、效果展示 发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不…...
WPF资源的继承
假设这里有一个全局的资源 <Style TargetType"TextBlock"><Setter Property"FontSize" Value"40"/> </Style> 这是时候有些控件可能需要一个样式在这个基础上加一点内容的 <Style x:Key"textBlockStyle" Targ…...
linux网络通信(TCP)
TCP通信 1.socket----->第一个socket 失败-1,错误码 参数类型很多,man查看 2.connect 由于s_addr需要一个32位的数,使用下面函数将点分十进制字符串ip地址以网络字节序转换成32字节数值 同理端口号也有一个转换函数 我们的端口号位两个字…...
Mybatis 多个简单类型参数传入sql语句
如果只有一个简单类型的参数传入sql语句,我们可以在在#{}中可以随意命名,都可以获取到数据。但通常与接口方法中的参数同名。 但是如果有多个简单类型参数,如果没有特殊处理,那么Mybatis无法根据参数名获取数据。 正确获取方式如…...
SpringCloud OpenFeign 服务接口调用
一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第四篇,即介绍 Feign 和 OpenFeign 服务接口调用。 二、概述 2.1 Feign 是什么 Feign 是一…...
WAP网站商业计划书(附下载)
这份文件“WAP网站商业计划书.zip”详细阐述了一个由富有创造力和远见的大学生团队构思的创业项目。这个计划旨在开发并运营一个专注于无线应用协议(WAP)技术的网站,以服务于移动设备用户群体,提供一个易于访问、功能丰富且用户体…...
【存储】ZYNQ+NVMe小型化全国产存储解决方案
文章目录 1、背景2、基础理论3、设计方案3.1、FPGA设计方案3.1.1、NVMe控制器实现3.1.2、NVMe控制器实现 3.2 驱动软件设计方案3.2.1 读写NVMe磁盘软件驱动3.2.2 NVMe磁盘驱动设计3.2.3 标准EXT4文件系统设计 3.3 上位机控制软件设计方案 4、测试结果4.1 硬件测试平台说明4.2 测…...
数据结构之栈详解(C语言手撕)
🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…...
Docker学习——Dock镜像
什么是Docker镜像 Docker 镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。 一个镜像可以包含一个基本的操作系统环境,里面仅安装了 Apache 应用程序(或 用户需要的其他软件) 可以把它称为一个 Apache 镜像。镜像是创建 Do…...
CorelDRAW Graphics Suite2024专业图形设计软件Windows/Mac最新25.0.0.230版
CorelDRAW Graphics Suite 2024是一款专业的图形设计软件,它集成了CorelDRAW Standard 2024和其他高级图形处理工具,为用户提供了全面的图形设计和编辑解决方案。 该软件拥有强大的矢量编辑功能,用户可以轻松创建和编辑矢量图形,…...
el-form表单中,对非表单内字段增加校验的方法
1、问题说明: 在开发表单的时候,可能会遇到el-form-item中绑定的值不在表单绑定的数据对象中。 此时用prop绑定该字段名是无效的,需要单独对这个字段进行校验。 在el-form-item中有一个属性 error 。用于表单域验证错误信息,设…...
【VTKExamples::Points】第四期 ExtractEnclosedPoints
很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ExtractEnclosedPoints,并解析接口vtkExtractEnclosedPoints,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我…...
bug--xxoobject has no attribute xxx
Python 创建类的实例后却不能调用写的方法,检查了半天原来是缩进的问题,def函数不应该和class并列 只能说这个英文空格太小了,看不出来。。。。...
7 BUILD.gn文件怎么写,Gn + Ninja编译一个Hello world程序的例子Demo
BUILD.gn文件怎么写,Gn Ninja编译一个Hello world程序的例子Demo 作者将狼才鲸创建日期2024-03-11 Ninja安装流程见:一个能直接运行的Ninja例子,build.ninja文件怎么写?Gn安装流程见:Ubuntu18.04下安装Gn软件 这是一…...
北京市行政村边界shp数据/北京市乡镇边界/北京市土地利用分类数据
北京是一座有着三千多年历史的古都,在不同的朝代有着不同的称谓,大致算起来有二十多个别称。北京地势西北高、东南低。西部、北部和东北部三面环山,东南部是一片缓缓向渤海倾斜的平原。境内流经的主要河流有:永定河、潮白河、北运…...
力扣--动态规划/深度优先算法/回溯算法93.复原IP地址
这题主要用了动态规划和回溯算法。 动态规划数组初始化(DP数组): 首先,创建一个二维数组dp,用于记录字符串中哪些部分是合法的IP地址。对字符串进行遍历,同时考虑每个可能的IP地址部分(每部分由1到3个字符组…...
第一次Python小练习题目
1.打印某学校的校训,具体内容如下所示: ****************************** 勤奋 严谨 求实 创新 ****************************** 注意: 第一行和最后一行各有 30 个*号。 答案: school_strs "勤奋 严谨 求实 创新&q…...
亚马逊向忠实Kindle用户“致谢“:停止支持旧款设备
亚马逊正以停止支持旧款设备的方式"回馈"长期忠实的Kindle用户,但同时也试图以新设备八折优惠及电子书购书抵用金来"降低影响"。正如科技领域的规律——没有任何设备能永远获得支持。亚马逊在今日发送给用户的邮件中宣布,自2026年5月…...
泛型:像“填空”一样写类型,让你的代码从“复制粘贴”中解放
你是不是遇到过这种场景:写了一个函数,处理数字的版本写一遍,处理字符串的版本再写一遍,处理数组的又写一遍……最后代码里全是长得差不多的“双胞胎”。今天我们来学TypeScript的泛型——一个能让你写一次、处处用的“类型模板”…...
5分钟解锁你的首个Gemini AI智能体:全栈开发终极指南
5分钟解锁你的首个Gemini AI智能体:全栈开发终极指南 【免费下载链接】gemini-fullstack-langgraph-quickstart Get started with building Fullstack Agents using Gemini 2.5 and LangGraph 项目地址: https://gitcode.com/gh_mirrors/ge/gemini-fullstack-lang…...
“羽绒服面料哪家好?”这 5 家源头工厂值得加入采购清单
在 2026 年的服装消费大环境中,品牌的供应链抗压能力正面临前所未有的考验。随着气候变化与消费趋势的急速迭代,品牌方对于核心材料的需求,已经从单纯的“低价采购”彻底转变为“确定性交付”。对于采购主理人与供应链总监而言,评…...
化工园区智慧巡检平台
化工园区智慧巡检平台概述化工园区智慧巡检平台通过物联网、大数据、人工智能等技术,实现巡检流程数字化、智能化,提升安全性和效率。平台通常涵盖设备监控、隐患识别、数据分析、应急响应等功能,助力园区管理降本增效。核心功能模块实时监控…...
算法工程师的随身匕首:PyTorch 极简入门与实战
PyTorch 快速入门指南 一、PyTorch 是什么? PyTorch 是一个基于 Python 的深度学习框架,由 Facebook AI Research 开发。它以动态计算图和直观的接口著称,是研究和生产中最受欢迎的框架之一。 二、环境安装 # 基础安装(CPU版本&am…...
4大核心能力!March7thAssistant让崩坏:星穹铁道实现全自动游戏体验
4大核心能力!March7thAssistant让崩坏:星穹铁道实现全自动游戏体验 【免费下载链接】March7thAssistant 崩坏:星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant March7thAssistant是一款专…...
Fish Speech 1.5企业应用:会议纪要自动转语音播报方案
Fish Speech 1.5企业应用:会议纪要自动转语音播报方案 1. 企业会议纪要处理的痛点与解决方案 在日常企业运营中,会议纪要的整理和传达往往面临三大挑战: 效率瓶颈:人工整理会议录音平均耗时1-2小时/场,关键信息传递…...
构建企业级单点登录认证中心:Spring Boot OAuth2 Server完整实战指南
构建企业级单点登录认证中心:Spring Boot OAuth2 Server完整实战指南 【免费下载链接】oauth2-server spring boot (springboot 3) oauth2 server sso 单点登录 认证中心 JWT,独立部署,用户管理 客户端管理 项目地址: https://gitcode.com/gh_mirrors/oau/oauth2-…...
Qwen3-TTS声音设计实战:一句话生成萝莉音,手把手教你搭建语音合成服务
Qwen3-TTS声音设计实战:一句话生成萝莉音,手把手教你搭建语音合成服务 1. 为什么选择Qwen3-TTS进行声音设计? 想象一下,你正在开发一款虚拟偶像APP,需要为角色生成各种风格的语音。传统语音合成方案需要专业录音棚、…...
