认识Redis
1. 前置操作
以下内容基于CentOS
1.1. 安装
yum -y install redis
1.2. 启动
redis-server /etc/redis.conf &
1.3. 打开
redis-cli
1.4. 停止
redis-cli shutdown
1.5. 设置远程连接
修改 /etc/redis/redis.conf
修改 bind 127.0.0.1为 bind 0.0.0.0
1.6. 使用隧道连接更安全
因为redis默认没密码, 要是别人知道了服务器ip会不安全, 直接用端口号连接你的redis, 此时可以用"隧道"连接
使用了隧道, 可以不开放端口号, 别人就连不上了, 而配置隧道需要系统密码, 所以安全, 不同工具的隧道配置方法不同, 可以自行查阅.
主要步骤就是, 将localhost
的端口号
, 端口号可以随便指定一个空闲的, 映射到服务器的redis的端口号上. 这样就可以远程连接了, 不过要保证隧道工具的连接不断开
2. 基本命令操作
redis数据存放的方式就是key-value
2.1. set 设置键值对
set 'key' 'value'
2.2. get 获取key的值
get 'key'
2.3. keys 返回存在的key
返回所有满足样式的key, 对于生产环境千万不要用keys *
因为数据很多,会卡死
2.4. exists 判断key是否存在
exists 'key'
存在返回1, 不存在返回0
2.5. del 删除指定的key
del 'key'
删除成功返回1, 删除失败返回0
2.6. expire 给key设置过期时间(秒)
expire 'key' 30
2.7. ttl 查看key过期时间(秒)
ttl 'key'
返回-2, 表示已过期
返回-1, 表示没有设置有效期
2.8. type 返回key的数据类型
type 'key'
返回key的数据类型
不同的命令设置的值是不同的数据类型, 例如
set -> string
lpush -> list
sadd -> set
3. 常见数据类型
这些只是对外的数据结构
3.1. string
3.2. list
3.3. hash
3.4. set
3.5. zset(有序集合)
4. Spring Redis
4.1. 配置Redis
4.1.1. 引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
4.1.2. 配置文件
yml
spring:redis:database: 1 # Redis数据库索引port: 6379 # Redis服务器端口host: 127.0.0.1 # Redis服务器主机地址lettuce:pool:min-idle: 5 # 连接池最小空闲连接数max-idle: 10 # 连接池最大空闲连接数max-active: 8 # 连接池最大活动连接数max-wait: 1ms # 连接池获取连接的最大等待时间(毫秒)
4.1.3. 代码操作
//必须使用stringRedisTemplate这个名字不然乱码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/redis")
public class RedisController {//必须使用stringRedisTemplate这个名字不然乱码@Autowiredprivate RedisTemplate stringRedisTemplate;@RequestMapping("/setStr")public String setStr(String key,String value){if (!StringUtils.hasLength(key) || !StringUtils.hasLength(value)){return "failed";}//stringstringRedisTemplate.opsForValue().set(key,value);//hashstringRedisTemplate.opsForHash().put("hashKey","k1","v1");stringRedisTemplate.opsForHash().put("hashKey","k2","v2");//liststringRedisTemplate.opsForList().leftPush("listKey","l1");stringRedisTemplate.opsForList().leftPush("listKey","l2");//setstringRedisTemplate.opsForSet().add("setKey","s1","s2","s3");//zsetstringRedisTemplate.opsForZSet().add("zsetKey","z1",80);stringRedisTemplate.opsForZSet().add("zsetKey","z2",90);stringRedisTemplate.opsForZSet().add("zsetKey","z3",10);return "success";}
}
5. 负载均衡(共享session)
5.1. 添加依赖
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>
5.2. 修改配置
spring:redis:database: 0 # Redis数据库索引port: 6379 # Redis服务器端口host: 127.0.0.1 # Redis服务器主机地址# 配置 Spring Session 使用 Redis 作为会话存储session:store-type: redisredis:flush-mode: on_save # 会话数据在保存时刷新到 Redisnamespace: spring:session # Redis 的命名空间,用于存储 Spring Session 数据server:servlet:session:timeout: 30m # 设置会话超时时间为 30 分钟
5.3. 代码(使用redis存session)
使用redis存session还可以设置会话时长
由于redis不能存对象, 所以把User变成json来存
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;@RestController
@RequestMapping("/session")
public class SessionController {@RequestMapping("/login")public String login(String name, Integer age, HttpSession session) throws JsonProcessingException {//模拟,不登录,只存SessionUser user = new User();user.setName(name);user.setAge(age);ObjectMapper mapper = new ObjectMapper();session.setAttribute("user_session",mapper.writeValueAsString(user));return "success";}
}@Data
class User{private String name;private Integer age;
}
运行: http://localhost:8080/session/login?name=zhangsan&age=18
结果: 可以看到命名空间spring:session
产生的结果
6. 使用场景
6.1. 缓存
Redis是存在内存中的, 所以读写非常快
6.1.1. 缓存穿透
Redis 缓存穿透是指在使用缓存系统(如 Redis)时,恶意或者恶意构造的请求导致缓存无法命中,从而导致请求直接访问后端存储系统,对后端系统造成压力,甚至可能引发性能问题。
- 客户端发送一个请求,请求一个不存在于缓存中的数据,这样的请求称为 "缓存穿透查询"。
- 缓存系统尝试查找这个键,发现缓存中没有相关数据。
- 缓存系统向后端存储系统(如数据库)发出请求以获取数据。
- 后端存储系统返回数据,但缓存系统并未将数据放入缓存,因为本次查询是无效的。
由于这种无效的查询无法被缓存,恶意请求或者大量的无效请求可能会直接访问后端存储,导致后端系统负载过大,甚至引发性能问题。
例子:
假设有一个恶意用户,不断发送无效的商品ID请求(例如负数或不存在的ID),这些请求将绕过缓存直接访问数据库。如果该用户发送大量这样的请求,就可能导致数据库服务器过载,影响了整个应用程序的性能。
6.1.2. 缓存雪崩
Redis 缓存雪崩是指在某个时间段内,缓存中的大量数据同时失效或过期,导致大量请求直接访问后端存储系统,从而造成后端系统负载剧增,可能导致系统性能问题甚至崩溃。
典型情况下,缓存雪崩发生在以下步骤:
- 缓存中的一组数据(例如,同一数据表的多个缓存项)在某个时刻同时失效。
- 在失效期间,有大量的请求访问这些缓存项,但无法从缓存中命中数据,因为数据已经失效。
- 这些请求都会直接访问后端存储系统(如数据库),导致后端系统承受巨大负载。
缓存雪崩可能对系统的性能和可用性造成严重影响,因为突然间的大量请求可能会使后端存储系统瘫痪。
例子:
假设在某个时间点,由于某种原因(例如缓存服务器重启、缓存过期策略设置不当等),大量商品的缓存项同时失效。接着,在这个失效期间,有大量用户查询这些商品的详情。由于缓存无法命中,每个查询都会直接访问数据库。
由于数据库需要处理大量的并发查询,可能导致数据库负载暴增,性能急剧下降。这种情况下,系统可能会变得异常缓慢,甚至可能完全崩溃。
6.1.3. 缓存击穿
Redis 缓存击穿是指一个非常热门的缓存项在某个时间点突然失效,而此时又有大量的请求同时访问这个缓存项,导致请求直接访问后端存储系统,造成后端系统负载剧增。
典型情况下,缓存击穿发生在以下步骤:
- 一个热门的缓存项在某个时间点突然失效,可能是因为过期时间到达、手动清除缓存等原因。
- 在缓存失效的短时间内,有大量请求访问这个缓存项,但无法从缓存中命中数据,因为数据已经失效。
- 这些请求都会直接访问后端存储系统(如数据库),导致后端系统承受巨大负载。
缓存击穿可能对系统的性能和可用性造成影响,因为突然间的大量请求可能会使后端存储系统负载过大,甚至导致性能问题。
6.2. 数据库
6.3. 消息队列
相关文章:

认识Redis
1. 前置操作 以下内容基于CentOS 1.1. 安装 yum -y install redis 1.2. 启动 redis-server /etc/redis.conf & 1.3. 打开 redis-cli 1.4. 停止 redis-cli shutdown 1.5. 设置远程连接 修改 /etc/redis/redis.conf 修改 bind 127.0.0.1为 bind 0.0.0.0 1.6. 使用…...

同步、异步无障碍:Python异步装饰器指南
一、引言 Python异步开发已经非常流行了,一些主流的组件像MySQL、Redis、RabbitMQ等都提供了异步的客户端,再处理耗时的时候不会堵塞住主线程,不但可以提高并发能力,也能减少多线程带来的cpu上下文切换以及内存资源消耗。但在业务…...

CodeSite for .NET Crack
CodeSite for .NET Crack CodeSite for.NET与Visual Studio集成,通过实时查看器日志记录系统提供对代码执行的更深入了解,该系统有助于在本地或远程执行代码时快速查找问题。超越传统的断点调试,在应用程序继续运行时记录应用程序的执行&…...

基于IMX6ULLmini的linux裸机开发系列九:时钟控制模块
时钟控制模块 核心 4个层次配置芯片时钟 晶振时钟 PLL与PFD时钟 PLL选择时钟 根时钟/外设时钟 系统时钟来源 RTC时钟源:32.768KHz 系统时钟:24MHz,作为芯片的主晶振使用 PLL和PFD倍频时钟 7路锁相环电路(每个锁相环电路…...

【数据结构与算法】1. 绪论
1. 绪论 1.1 数据结构 1.1.1 数据结构的基本概念 1.1.2 数据结构的三要素 数据结构三要素: 逻辑结构 划分方法一: 线性结构:线性表、栈、队列、串非线性结构:树、图 划分方法二: 集合结构线性结构树形结构网状&…...

2023年京东儿童智能手表行业数据分析(京东销售数据分析)
儿童消费市场向来火爆,儿童智能手表作为能够实现定位导航,信息通讯,SOS求救,远程监听,智能防丢等多功能的智能可穿戴设备,能够通过较为精准的定位功能和安全防护能力保障儿童的安全,因而广受消费…...

数据结构(6)
2-3查找树 2-结点:含有一个键(及其对应的值)和两条链,左链接指向2-3树中的键都小于该结点,右链接指向的2-3树中的键都大于该结点。 3-结点:含有两个键(及其对应的值)和三条链,左链接指向的2-3树中的键都小于该结点&a…...

C++学习|CUDA安装和配置
CUDA安装和配置 Windows下安装CUDAVS项目配置CUDA Windows下安装CUDA 第一步:先看自己NIVIDIA显卡适合什么版本的CUDA。打开电脑的“NIVIDIA控制面板”->系统信息->组件。会看到我的显卡驱动最高支持的CUDA版本是11.4.56。 第二步:去CUDA官网&…...

3.若依前后端分离版开发用户自定义配置表格功能
一、背景 在项目上线测试的时候,关于同一个界面的表格,不同的用户会出现不同的字段排列需求,有些用户希望把A字段排在最前面,有些用户则希望A字段不显示。针对这种情况,开发一个表格自定义配置的功能,每个…...

【操作系统】24王道考研笔记——第三章 内存管理
第三章 内存管理 一、内存管理概念 1.基本概念 2.覆盖与交换 覆盖技术: 交换技术: 总结: 3.连续分配管理方式 单一连续分配 固定分区分配 动态分区分配 动态分区分配算法: 总结: 4.基本分页存储管理 定义…...

Spring缓存深入解析:@Cacheable的使用详解
摘要:在本文中,我们将深入研究Spring框架中的Cacheable注解。我们会通过详细的Java示例,探讨如何使用这个功能强大的注解来提升应用程序性能。 一、什么是缓存? 在计算机科学中,缓存是一种存储技术,用于保…...

软件配置安装(破解)--- jdk下载配置
下载jdk 如果有oracle账号的话直接登录下载你想要的版本 不然可以尝试镜像站 HUAWEI镜像:https://repo.huaweicloud.com/java/jdk/ 安装 配置(细节) 这里的JAVA_HOME就是java的家,也就是解压(或安装)之后的java的目录ÿ…...

idea使用docker生成镜像(打包镜像,导入镜像,导出镜像)
1:先下载安装dockerdesktop,安装成功后 2: 在cmd执行docker -v,查看安装的docker版本 C:\Users\dell>docker -v Docker version 24.0.5, build ced09963:需要启动 dockerdesktop应用,才算启动docker&a…...

wazuh环境配置
目录 一、wazuh的安装 1.1官方仓库安装 1.2虚拟机OVA安装 1.2.1 然后执行下面命令 1.2.2 这里还要下载脚本和config.yml配置文件,用来生成证书编辑 1.2.3然后编辑config.yml文件,将下面的三个IP地址改为一样的 1.2.4运行./wazuh-certs-tool.sh以…...
【Linux】Linux下常用压缩解压缩指令及选项小结
0x00 前言 版本信息:Ubuntu 18.04.6 LTS 最后更新日期:2023.8.22 0x01 Linux下常用压缩解压缩指令小结 1.gzip指令 gzip file:压缩file文件为file.gz ,但是只能压缩文件不能压缩目录,且不保留源文件。若想打包目录…...

香蕉派社区推出带10G SFP+ 端口的Banana Pi BPI-R4 Wifi7开源路由器
香蕉派BPI-R4 根据著名Banana Pi品牌背后的公司Sinovoip提供的初步信息,他们即将推出的Banana Pi BPI-R4路由器板目前正在开发中。与之前的 Banana Pi R3 板相比,这在规格上将有显着提升。这就是我们目前所知道的。 您可以选择 R4 板的两种不同配置。具…...
A 题:震源属性识别模型构建与震级预测 :代码分析:
问题 1: 针对附件 1~8 中的地震波数据,找出一系列合适的指 标与判据,构建震源属性识别模型,进行天然地震事件(附件 1~7) 与非天然地震事件(附件 8)的准确区…...

源码分析CompletableFuture使用默认线程池ForkJoinPool的弊端
先说结论: 假如有20CompletableFuture任务并发执行时,都使用默认线程池ForkJoinPool,但cpu的核心数又小于3,那么就会新建20个线程(不使用默认线程池了),这20个线程相互竞争cpu资源和内存&#x…...

连接pgsql数据库 sslmode sslrootcert sslkey sslcert 参数的作用
sslmode 参数的作用 sslmode 参数用于指定数据库连接时使用的 SSL 加密模式。SSL(Secure Sockets Layer)是一种加密协议,用于保护数据在客户端和服务器之间的传输过程,以增加数据传输的安全性。sslmode 参数可以设置不同的值&…...
从零学算法3
3.给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”&…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...