redis——使用

    • session
    • 缓存
      • 缓存更新方式
      • 删除缓存vs更新缓存
      • 缓存和数据库操作原子性
      • 缓存和数据库操作顺序
      • 结论
    • 缓存问题
      • 缓存穿透
      • 缓存雪崩
      • 缓存击穿
    • 全局唯一ID
    • 数据并发线程安全
      • 单体
      • 分布式
        • redis分布式锁的问题
    • redis消息队列
      • list
      • pubsub
      • stream
    • 消息推送

session

问题:session存在tomcat服务器,多个服务器之间session不共享,nginx会将请求打到不同的服务器

tomcat处理:session拷贝
缺点

  • 存储多份,内存浪费
  • 拷贝有延迟

redis处理优点

  • 数据共享
  • 内存存储——速度快
  • key-value存储 便于查找
    key要求唯一、方便携带查找
    应当设置ttl,避免存储过长时间,占据内存
    value可用json转为string存储,也可适用hash,便于单字段的修改
    value中可将一些敏感数据去除

备注

  • cookie中包含sessionId,前端携带cookie到服务器,服务器取出sessionId,查找到session。tomcat自动维护session。
  • 每个浏览器不同的session
  • 可在redis中存储token-user的键值对,每次操作根据token查询,如果查到,则说明token有效,刷新其ttl。若长期不操作,token过期,redis删除该token,下次使用时无法查到

缓存

优点

  • 降低后端负载
  • 效率高,响应快

问题

  • 数据一致性
  • 保持数据一致性,代码维护
  • 保持缓存高可用,运维

缓存更新方式

  • 编码,更新数据库时更新缓存。使用较多
  • 服务,服务中维护缓存和数据库一致性,其他方只调用即可。没有现成的服务,自己编写,麻烦。
  • 直接操作缓存,另起任务异步更新到数据库。缓存如果挂掉,数据丢失。

删除缓存vs更新缓存

  • 更新缓存:多次更新,但可能数据没有使用,多次更新无用
  • 删除缓存:删除缓存,查询时,未命中,到数据库查

缓存和数据库操作原子性

  • 单体系统:事务
  • 分布式:ttc等分布式事务系统

缓存和数据库操作顺序

在这里插入图片描述
右边查询速度比左边更新速度快,所以出现上述情况概率高

在这里插入图片描述
左边查询速度比右边更新速度快,所以出现上述情况概率低
如果出现,可增加ttl,到期后删除缓存,使得旧数据出现的时间较短

结论

  • 低一致性:redis内存淘汰,到期删除
  • 高一致性:主动更新+超时剔除
    • 读:未命中,查数据库,存入缓存
    • 写:写数据库,删缓存,二者原子性

缓存问题

缓存穿透

查询不存在的数据,redis没有,请求会打到数据库。大量并发,数据库承受大量请求

解决:

  1. 缓存一个空对象
    • 简单
    • 浪费内存(可加ttl,节省内存)
    • 短期不一致(新增数据时主动更新)
  2. 布隆过滤器:在redis之前,判断数据是否存在,不存在直接结束
    • 数据生成hash,转为二进制位,存在布隆过滤器,请求时判断对应的二进制位0/1。内存占用少,实现复杂。
    • 不准确,布隆过滤器判断没有则一定没有,判断有可能没有。有穿透风险
  3. 增加id复杂度,数据格式校验
  4. 用户权限管理,对用户限流

缓存雪崩

同时大量key失效或redis宕机,大量请求会打到数据库。

解决:

  1. 给key的TTL增加随机数,使得过期时间分散
  2. redis集群高可用
  3. 降级限流策略:快速失败,拒绝服务
  4. 多级缓存:浏览器缓存(静态资源)、nginx缓存、reids、jvm、数据库。多层面建立缓存

缓存击穿

热点key(高并发访问)失效,缓存重建复杂

解决:

  1. 互斥锁:缓存重建加锁。。
    • 性能差:高并发,只有一个线程重建缓存,其他大量线程都在等待。(获取不到锁,休眠重试)
    • 可能死锁
  2. 逻辑过期:给redis中数据增加过期时间字段。如果查询数据时发现过期,则获取互斥锁开启新线程取重建缓存,自己则使用旧数据。
    • 不保证一致性
    • 额外内存消耗
    • 实现复杂

setnx:没有值的时候设置,有值的时候不能再设置值。类似于互斥锁
用完后删除即可
为避免死锁,可设置TTL(expire lock 5),到期自动删除
如果redis宕机,锁自动释放
在这里插入图片描述

//两条命令合在一起  原子性
SET lock 1 EX 5 NX

全局唯一ID

数据库自增id

  • 规律性太明显
  • 大量数据,一张表放不下,多个表id重复

id=自增id+其他信息拼接而成
在这里插入图片描述
解决:

  1. UUID,jdk生成的16进制的字符串,不是单调递增
  2. redis自增:时间戳+自增id,key每天一个,使得自增值不会持续增加过大
  3. snowflake算法,时钟依赖较高,维护一个机器id
  4. 数据库id,专门一张表,生成自增id,其他表从该处取id。性能较差,可以一次性生成多个,缓存在内存

数据并发线程安全

单体

悲观锁:lock,读写都加锁
乐观锁:读不加锁,写加锁

  1. 给表加version,先读后写,写时判断verison,保证操作之间数据未改变
  2. CAS:先读后写,写时判断当前数据和之前数据是否一致

缺点:失败率高,只有一个成功,其他的都失败

分布式

分布式/集群下多进程可见并互斥的

  • zk强调一致性,性能不如redis
  • redis:setnx等互斥命令

setnx等互斥命令。给key设置了ttl,如果线程1获取锁后长时间阻塞,导致key过期被删除,之后其他线程正常获取锁,线程1唤醒后执行完,del lock(此时的lock是别的线程的锁)。

解决:

  • 先get lock 判断lock是否为自己的锁(set lock时存入线程标识),然后del lock。
  • 线程标识:使用uuid+线程id,线程id时jvm内部维护的自增id,集群情况下,线程id会重复

get和del是两步操作,不是原子的,del时线程长时间阻塞,key过期被删除,同上

解决:将两个操作放在一起,变成原子性

redis分布式锁的问题

  • 不可重入:线程1获取锁,调用线程2,线程2获取锁执行操作时,无法获取,阻塞,死锁
  • 不可重试
  • 超时删除key
  • 主从一致:在主节点获取锁,然后主节点宕机,从节点没有锁

redis消息队列

并发时,为响应速度提高,将部分数据在redis中缓存,在redis中更新数据,将更新的数据存在jvm阻塞队列中,再异步的将数据更新到数据库

问题:

  1. jvm内存大小有限
  2. 宕机,数据丢失

list

redis的list做消息队列,数据持久化,不丢失,只能读一次

//没有返回null
LPUSH, RPOP
//阻塞 直到获取到一个可用的,取出并删除
BLPUSH, BRPOP

pubsub

//发布
PUBLISH [channel] [msg]
//订阅
SUBSCRIBE [channel] [msg]
//订阅匹配的
PSUBSCRIBE [channel] [pattern]
  • 多生产多消费
  • 不可持久化,消息会丢失
  • 消息堆积有上限,超出丢失

stream

一种新的数据类型
在这里插入图片描述
在这里插入图片描述
漏读消息:如果每次只读一条最新消息(设定Id为$),如果一次加入多个消息,则只读到了第一个,其他消息漏掉

消费者组

  • 消息分流,加快处理速度
  • 消息标识,标记消费消息的offset,没有漏读问题
  • 消息确认,消费完成后,确认,将消息标记为已处理,消息可回溯
  • 可阻塞读取

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

消息推送

FeedLine-TimeLine

  1. 推送,生产者将消息发给每一个消费者
    • 每个消费者存一份消息,内存↑
  2. 拉取,消费者拉取生产者生成的消息
    • 延迟
  3. 混合:区分不同的生产者和消费者,根据不同情况选择推/拉
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx简单使用与配置

nginx简单使用与配置 Nginx 是一个高性能的HTTP和反向代理web服务器、一个邮件代理服务器,一个通用的 TCP/UDP 代理服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。 前端可以通过nginx实现以下功能&#xff1a…

DAY 34 正则表达式

正则表达式 REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式, 其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能, 类似于增强版的通配符功能,但…

Linux--tty

Linux 终端(TTY) TTY 是 Teletype 或 Teletypewriter 的缩写,原来是指电传打字机,后来这种设备逐渐键盘和显示器取代。不管是电传打字机还是键盘显示器,都是作为计算机的终端设备存在的,所以 TTY 也泛指计算机的终端(terminal)设…

【面试】你在项目中遇到过慢查询问题吗?你是怎么做SQL优化的?

文章目录 前言一、找出有问题的SQL1、系统层面2、SQL语句层面 二、查看SQL执行计划三、SQL优化案例慢查询优化步骤 SQL优化小结 前言 我在面试的时候很喜欢问候选人这样一个问题:“你在项目中遇到过慢查询问题吗?你是怎么做SQL优化的?” 很多…

基于DSP+FPGA的多轴运动控制平台(一)硬件设计

2 实验平台总体方案与硬件设计 2.1.1 实验平台的功能需求分析 针对便于多轴运动控制技术的研究,培养此方面技术的人才,实验平台应能 对多轴运动实现高速高精度的控制效果,同时保证系统开放性和兼容多种算法及 参数的运行。 实验过程契合…

TCP/IP协议及配置

文章目录 一、TCP/IP概述1. TCP/IP协议族2. 主机与主机之间通信的三个要素 二、什么是IP地址1. 用来标识一个网络节点的互联网地址(如同电话的号码)2. IPv4地址组成 三、IP地址分类1. 常用的IP地址2. 组播及科研专用 四、IP地址分类(续&#…

wait 和 notify

wait 和 notify 7. wait 和 notify7.1 wait()方法7.2 notify()方法★★★wait和notify代码wait 需要搭配 synchronized 7.3 notifyAll()方法7.4 wait 和 sleep 的对比(面试题) 7. wait 和 notify 保证其他线程可以正常进行 由于线程之间是抢占式执行的, …

为什么你这么累,销量还不如那些轻松工作的同行?

管理混乱 忙碌却不见成效 在工业品行业做了10多年的小张,最近向我吐槽:每天忙得团团转,结果销售业绩还不如那些整天轻松工作的同行。几番沟通下来,发现小张每天要做这么多的工作,不忙才怪! 管理员工&#x…

系统安全及应用

目录 一、账号安全控制 1)系统账号清理 2)密码安全控制 chage命令 示例 3)命令历史限制 4)终端自动注销 总结 账号安全 密码安全 二、系统引导和登录控制 1)使用su命令切换用户 用途及用…

生产管理系统是什么?它有哪些功能模块?

阅读本文您将了解:1.企业生产管理的问题;2.生产管理系统模块有哪些;3.如何利用生产管理系统模块解决问题。 一、企业生产管理会遇到哪些问题? 生产管理是有计划、组织、指挥、监督调节的生产活动。以最少的资源损耗,…

风电的Weibull分布及光电的Beta分布组合研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

九龙证券|服务器龙头获资金连续抢筹,尾盘主力抢筹前期大热门股

今天,核算机职业取得主力大手笔抢筹。 今天主力资金净流出53.89亿元,其间创业板净流出3.19亿元,沪深300成份股净流出7.61亿元。 申万一级职业中,今天有19个职业上涨,传媒职业接连两日均涨近5%,居首位&…

OA系统的功能和作用是什么(OA系统百科)

OA系统的功能和作用是什么(OA系统百科)。OA系统是一种非常实用的企业内部管理系统,它可以帮助公司实现各项管理工作,可以说是整个公司和团队的纽带,有助于提高工作效率和管理水平。 具体来说,OA系统的作用…

换电脑 NoteExpress 数据备份迁移

前言 主要操作是跟着这篇博客做的:NoteExpress数据库备份和转移。但也有一些不一样的地方 旧电脑NoteExpress(NE)版本3.7,新电脑版本3.8 旧电脑 导出配置文件 桌面找到图标,打开位置,点击配置备份(绿色的图标&#…

wordpres漏洞扫描器——wpscan

WordPress 使用PHP语言开发的博客平台 WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用。 WordPress是一款个人博客系统&#xff0c…

SpringBoot 整合 RabbitMQ (四十一)

二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。 上一章简单介绍了SpringBoot 实现 Web 版本控制 (四十),如果没有看过,请观看上一章 关于消息中间件 RabbitMQ, 可以看老蝴蝶之前的文章: https://blog.csdn.net/yjltx1234csdn/categor…

小红书热词速看 | 古茗有何营销动作?

【导语】 据古茗官方数据,新系列推出当日即售空,单店最高出杯420杯,最快24小时内卖断货;上架3天,销量突破100万杯;10天,就售出了343万杯,其中2款牛油果奶昔用掉了40万斤牛油果&…

【Java基础】迷宫问题的Java代码实现

迷宫问题通常是指在给定的迷宫中,找到从起点到终点的路径的问题。迷宫通常由障碍物和自由空间组成,其中障碍物是不可穿越的区域,自由空间可以穿越。解决迷宫问题的方法有很多种,本文使用递归算法来解决迷宫问题。 一、使用递归算法…

vLive带你走进虚拟直播世界

虚拟直播是什么? 虚拟直播是基于5G实时渲染技术,在绿幕环境下拍摄画面,通过实时抠像、渲染与合成,再推流到直播平台的一种直播技术。尽管这种技术早已被影视工业所采用,但在全民化进程中却是困难重重,面临…

【状态估计】基于增强数值稳定性的无迹卡尔曼滤波多机电力系统动态状态估计(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…
最新文章