redis——使用

news2025/5/23 1:03:27

    • 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.coloradmin.cn/o/413604.html

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

相关文章

【Linux驱动开发】023 platform设备驱动

一、前言 驱动分离目的:提高Linux代码重用性和可移植性。 二、驱动的分隔与分离 百度看了很多,大多都没讲清楚为什么使用platform驱动,为什么驱动分隔与分离可以提高代码重用性,只是在讲实现的结构体、函数接口等等&#xff0c…

npm、pnpm、yarn的常用命令

npm、pnpm、yarn的常用命令 文章目录npm、pnpm、yarn的常用命令一、常用命令1、npm命令2、pnpm命令:3、yarn命令二、对比一、常用命令 1、npm命令 npm init: 初始化一个新的npm包。 npm install: 安装项目依赖项。 npm install : 安装指定的包。 npm install --sa…

【Java数据结构】链表(Linked List)-双向链表

双向链表(Linked List)是一种常用的数据结构,它允许在所有节点中快速添加或删除元素,并且可以有效地实现反向遍历。本篇文章将介绍双向链表的基础知识,并提供使用Java语言实现该数据结构的示例代码。 一、双向链表的基…

mysql数据库事务脏读、不可重复度、幻读详解

文章目录1 事务隔离级别2 脏读3 不可重复度3.1 解决了脏读的问题。3.2 有不可重复度的问题4 幻读4.1 没有脏读和不可重复读的问题4.2 有幻读的问题5 serializable1 事务隔离级别 read-uncommitted:脏读、不可重复度、幻读,均可出现。安全性低&#xff0…

HBase架构篇 - Hadoop家族的天之骄子HBase

HBase的基本组成结构 表(table) HBase 的数据存储在表中。表名是一个字符串。表由行和列组成。 行(row) HBase 的行由行键(rowkey)和 n 个列(column)组成。行键没有数据类型&…

《花雕学AI》06:抢先体验ChatGPT的九个国内镜像站之试用与综合评测

最近ChatGPT持续大火,大家们是不是在网上看到各种和ChatGPT有趣聊天的截图,奈何自己实力不够,被网络拒之门外,只能眼馋别人的东西。看别人在体验,看别人玩,肯定不如自己玩一把舒服的啊。 上一期&#xff0…

2.5d风格的游戏模式如何制作

文章目录一、 介绍二、 绘制瓦片地图三、 添加场景物体,添加碰撞器四、 创建玩家五、 创建玩家动画六、 玩家脚本七、 2d转换成2.5d八、 “Q”键向左转动视角、“E”键向右转动视角九、 下载工程文件一、 介绍 制作一个类似饥荒风格的2.5d游戏模板。 2.5D游戏是指以…

Spring之循环依赖

什么事循环依赖 很简单的定义就是就如有两个对象A类,B类,其中两个类中的属性都有对方。 A类 public class A{private B b;}B类 public class B{ private A a; }在Spring中,什么情况下会出现循环依赖 如果要了解循环依赖,首先…

基于matlab进行雷达信号模拟

一、前言此示例说明如何将基本工具箱工作流应用于以下方案:假设有一个工作频率为 4 GHz 的各向同性天线。假设天线位于全局坐标系的原点。有一个目标,其非波动雷达横截面为0.5平方米,最初位于(7000,5000,0&…

Linux下使用ClamAV病毒查杀

一、介绍Clam AntiVirus 是一款 UNIX 下开源的 (GPL) 反病毒工具包,专为邮件网关上的电子邮件扫描而设计。该工具包提供了包含灵活且可伸缩的监控程序、命令行扫描程序以及用于自动更新数据库的高级工具在内的大量实用程序。该工具包的核心在于可用于各类场合的反病…

CompletableFuture使用详解(IT枫斗者)

CompletableFuture使用详解 简介 概述 CompletableFuture是对Future的扩展和增强。CompletableFuture实现了Future接口,并在此基础上进行了丰富的扩展,完美弥补了Future的局限性,同时CompletableFuture实现了对任务编排的能力。借助这项能力…

2023最新快速单机创建三主三从Redis集群

单机搭建Redis集群 本次采用Redis的5.0.14版本在单机centos8上搭建Redis三主三从集群. 1.创建6个文件夹 一个文件夹代表一个节点,同时也代表每个节点的端口号. 2.下载Redis文件并解压 使用命令: #下载Redis 可以将5.0.14替换成自己想要的版本 wget http://download.redis…

JavaScript面向对象编程再讲

JavaScript面向对象编程再讲 JavaScript支持的面向对象比较复杂,和其他编程语言又有其独特之处。本文是对以前博文 JavaScript的面向对象编程 https://blog.csdn.net/cnds123/article/details/109763357 补充。 概述 这部分是JavaScript面向对象的概括&#xff0c…

计算机网络微课堂1-3节

目录 1. TCP/TP协议​编辑 2. 3.调制解调器 4.因特网的组成 5.电路交换 6.分组交换 重要常用 7.报文交换 8.总结电路交换 报文交换和分组交换 9. 1. TCP/TP协议 2. ISP 网络提供商 ISP的三层 国际 国家 和本地 3.调制解调器 什么是调制解调器,它存在的…

稳压二极管工作原理、重要参数意义和典型电路参数计算

稳压二极管的工作原理:稳压二极管也叫稳压管,它在电路中一般起到稳定电压的作用,也可以为电路提供基准电压值。稳压二极管使用特殊工艺制造,这种工艺使它在反向击穿时仍然可以长时间稳定工作,不损坏,而工作…

macbook触摸板怎么按右键

苹果MacBook电脑触摸板如何右键,对于初次使用MacBook电脑的朋友,是一个小难题,其实MacBook电脑右键打开快捷辅助菜单的方法很简单。我们在MacBook电脑的【系统设置】—【触控板】中对触控板进行设置后可使用不同方式实现鼠标右键。 方法一&am…

形式与语言与自动机总结-----图灵机

图灵机的设计 图灵机的组成: 图灵机包括三部分:输入输出表带 ,上面包括一些空格和输入字符,读写头可以向两个方向移动,每一次可以读取一个字符并对他进行改写,改变状态根据状态转移函数来确定。 状态转移函数: 图灵机…

【树】你真的会二叉树了嘛? --二叉树LeetCode专题Ⅳ

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…

C# 文件操作

一 File\FileInfo类 在.NETFramework提供的文件操作类基本上都位于System.IO的命名空间下。操作硬盘文件常用的有两个类File\FileInfo. File类主要是通过静态方法实现的,FileInfo类是通过实例方法。 File类核心成员: FileInfo类的实例成员提供了与Fil…

Redis实现分布式锁的7种方案,及正确使用姿势!

redis学习笔记 7种方案前言 日常开发中,秒杀下单、抢红包等等业务场景,都需要用到分布式锁。而Redis非常适合作为分布式锁使用。本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式。如果有不正确的地方,欢迎大家指出…