当前位置: 首页 > news >正文

认识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异步开发已经非常流行了&#xff0c;一些主流的组件像MySQL、Redis、RabbitMQ等都提供了异步的客户端&#xff0c;再处理耗时的时候不会堵塞住主线程&#xff0c;不但可以提高并发能力&#xff0c;也能减少多线程带来的cpu上下文切换以及内存资源消耗。但在业务…...

CodeSite for .NET Crack

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

基于IMX6ULLmini的linux裸机开发系列九:时钟控制模块

时钟控制模块 核心 4个层次配置芯片时钟 晶振时钟 PLL与PFD时钟 PLL选择时钟 根时钟/外设时钟 系统时钟来源 RTC时钟源&#xff1a;32.768KHz 系统时钟&#xff1a;24MHz&#xff0c;作为芯片的主晶振使用 PLL和PFD倍频时钟 7路锁相环电路&#xff08;每个锁相环电路…...

【数据结构与算法】1. 绪论

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

2023年京东儿童智能手表行业数据分析(京东销售数据分析)

儿童消费市场向来火爆&#xff0c;儿童智能手表作为能够实现定位导航&#xff0c;信息通讯&#xff0c;SOS求救&#xff0c;远程监听&#xff0c;智能防丢等多功能的智能可穿戴设备&#xff0c;能够通过较为精准的定位功能和安全防护能力保障儿童的安全&#xff0c;因而广受消费…...

数据结构(6)

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

C++学习|CUDA安装和配置

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

3.若依前后端分离版开发用户自定义配置表格功能

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

【操作系统】24王道考研笔记——第三章 内存管理

第三章 内存管理 一、内存管理概念 1.基本概念 2.覆盖与交换 覆盖技术&#xff1a; 交换技术&#xff1a; 总结&#xff1a; 3.连续分配管理方式 单一连续分配 固定分区分配 动态分区分配 动态分区分配算法&#xff1a; 总结&#xff1a; 4.基本分页存储管理 定义&#xf…...

Spring缓存深入解析:@Cacheable的使用详解

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

软件配置安装(破解)--- jdk下载配置

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

idea使用docker生成镜像(打包镜像,导入镜像,导出镜像)

1&#xff1a;先下载安装dockerdesktop&#xff0c;安装成功后 2&#xff1a; 在cmd执行docker -v&#xff0c;查看安装的docker版本 C:\Users\dell>docker -v Docker version 24.0.5, build ced09963&#xff1a;需要启动 dockerdesktop应用&#xff0c;才算启动docker&a…...

wazuh环境配置

目录 一、wazuh的安装 1.1官方仓库安装 1.2虚拟机OVA安装 1.2.1 然后执行下面命令 1.2.2 这里还要下载脚本和config.yml配置文件&#xff0c;用来生成证书​编辑 1.2.3然后编辑config.yml文件&#xff0c;将下面的三个IP地址改为一样的 1.2.4运行./wazuh-certs-tool.sh以…...

【Linux】Linux下常用压缩解压缩指令及选项小结

0x00 前言 版本信息&#xff1a;Ubuntu 18.04.6 LTS 最后更新日期&#xff1a;2023.8.22 0x01 Linux下常用压缩解压缩指令小结 1.gzip指令 gzip file&#xff1a;压缩file文件为file.gz &#xff0c;但是只能压缩文件不能压缩目录&#xff0c;且不保留源文件。若想打包目录…...

香蕉派社区推出带10G SFP+ 端口的Banana Pi BPI-R4 Wifi7开源路由器

香蕉派BPI-R4 根据著名Banana Pi品牌背后的公司Sinovoip提供的初步信息&#xff0c;他们即将推出的Banana Pi BPI-R4路由器板目前正在开发中。与之前的 Banana Pi R3 板相比&#xff0c;这在规格上将有显着提升。这就是我们目前所知道的。 您可以选择 R4 板的两种不同配置。具…...

A 题:震源属性识别模型构建与震级预测 :代码分析:

问题 1&#xff1a; 针对附件 1&#xff5e;8 中的地震波数据&#xff0c;找出一系列合适的指 标与判据&#xff0c;构建震源属性识别模型&#xff0c;进行天然地震事件&#xff08;附件 1&#xff5e;7&#xff09; 与非天然地震事件&#xff08;附件 8&#xff09;的准确区…...

源码分析CompletableFuture使用默认线程池ForkJoinPool的弊端

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

连接pgsql数据库 sslmode sslrootcert sslkey sslcert 参数的作用

sslmode 参数的作用 sslmode 参数用于指定数据库连接时使用的 SSL 加密模式。SSL&#xff08;Secure Sockets Layer&#xff09;是一种加密协议&#xff0c;用于保护数据在客户端和服务器之间的传输过程&#xff0c;以增加数据传输的安全性。sslmode 参数可以设置不同的值&…...

从零学算法3

3.给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”&…...

宠物小程序开发

在当今社会&#xff0c;宠物已成为许多人生活中不可或缺的一部分。宠物市场的持续增长为创业者提供了巨大的商机。然而&#xff0c;作为一个创业者&#xff0c;要在竞争激烈的宠物市场中脱颖而出并不容易。因此&#xff0c;开发一个专属于自己的宠物小程序成为了解决这一难题的…...

07-Vue基础之综合案例——小黑记事本

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…...

vite4+vue3+electron23.3+ts桌面应用bs端开发 打包windows、linux、max三个系统的安装包

vite4vue3electron23.3ts桌面应用bs端开发 打包windows、linux、max三个系统的安装包 主要包依赖 "electron-store": "^8.1.0", //全局数据状态管理&#xff0c;可选择性安装"electron": "23.3.8","electron-builder": &q…...

限制 el-input 输入 emoji

1. 电脑如何输入 emoji 表情 ? 快捷键 win; 或 win. 2. 代码实现 <template><el-input v-model"input" placeholder"请输入内容" input"inputChange"></el-input> </template><script> export default {name: D…...

【AI】解决Number_Words的安装和使用

It appears that you encountered an error while trying to install the “Numbers_Words” package using the specific version 0.18.2 of the PEAR channel. The error message indicates that there was a problem unpacking the “Math_BigInteger-1.0.3” package, whi…...

开启MySQL的binlog日志

在/etc/my.cnf增加如下配置 #binlog相关 log-bin /testdata/mysql/log/bin/mysql-bin expire_logs_days 7 binlog-format ROW binlog_cache_size 4M max_binlog_cache_size 20G binlog_rows_query_log_events 1 binlog_row_image FULL sync_binlog 1 log_bin_trust_fun…...

【支付宝小程序】支付宝小程序自定义组件技术教程

&#x1f996;我是Sam9029&#xff0c;一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 **&#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409;恭喜你&#xff0c;若此文你认为写的不错&#xff0c;不要吝啬你的赞扬&#xff0c…...

CSDN编程题-每日一练(2023-08-23)

CSDN编程题-每日一练(2023-08-23) 一、题目名称:圆小艺二、题目名称:连续子数组的最大和三、题目名称:投篮一、题目名称:圆小艺 时间限制:1000ms内存限制:256M 题目描述: 最近小艺酱渐渐变成了一个圆滑的形状-球!! 小艺酱开始变得喜欢上球! 小艺酱得到n个同心圆。 …...

解决:Appium Inspector刷新页面一直加载转圈

目录 问题&#xff1a;Appium Inspector刷新页面一直加载转圈 解决办法&#xff1a; 1.进入设置页面-电池-后台耗电管理 2.找到下面3个应用&#xff0c;修改为允许后台高耗电 问题&#xff1a;Appium Inspector刷新页面一直加载转圈 1、手机进行操作后&#xff0c;Appium I…...

Apache Doris 入门教程34:Join 优化

Bucket Shuffle Join Bucket Shuffle Join 是在 Doris 0.14 版本中正式加入的新功能。旨在为某些 Join 查询提供本地性优化&#xff0c;来减少数据在节点间的传输耗时&#xff0c;来加速查询。 它的设计、实现和效果可以参阅 上面的图片展示了Bucket Shuffle Join的工作原理…...

做网站详情的图片/如何在网络上推广产品

拿得起&#xff0c;放得下&#xff0c;想得开 原文-中国传统文化&#xff1a;跟儒家学拿得起&#xff0c;跟佛家学放得下&#xff0c;跟道家学想得开 所谓道不远人、大道至简&#xff0c;作为中国文化三大支柱的儒释道&#xff0c;其实并不高高在上&#xff0c;而是与我们的人生…...

零售户电商网站订货网址/美业推广平台

它发生在我们所有人身上 —— 生活变得忙碌&#xff0c;我们与朋友失去联系。偶尔的电话和短信只够勉强了解他们的生活和家庭。 我们求助于通过社交媒体来跟随他们&#xff0c;在这里我们看到他们渡过美好假期、搬到新房子或换了工作。即使您无法参加聚会&#xff0c;你也能看到…...

锐仕方达猎头公司/谷歌优化教程

一、线程的交互 a、线程交互的基础知识 线程交互知识点需要从java.lang.Object的类的三个方法来学习&#xff1a;void notify() 唤醒在此对象监视器上等待的单个线程&#xff08;notify()方法调用的时候&#xff0c;锁并没有被释放&#xff09;。 void notifyAll() 唤醒在此对象…...

非法集资罪提供网站建设/线上推广方式都有哪些

数据结构和算法到底有什么用&#xff1f; 数据结构是对在计算机内存中&#xff08;有时在磁盘中&#xff09;的数据的一种安排。数据结构包括数组、链表、栈、二叉树、哈希表等等。算法对这些结构中的数据进行各种处理。例如&#xff0c;查找一条特殊的数据项或对数据进行排序…...

网站开发建设准备工作/济南百度推广代理商

实验内容 本次实践项目就是将 Linux 0.11 中采用的 TSS 切换部分去掉&#xff0c;取而代之的是基于堆栈的切换程序。具体的说&#xff0c;就是将 Linux 0.11 中的 switch_to 实现去掉&#xff0c;写成一段基于堆栈切换的代码。 本次实验包括如下内容&#xff1a; 编写汇编程…...

龙华做网站的公司/百度收录接口

[TOC] 1. 什么是碎片 ​ 碎片&#xff0c;是Android 3.0&#xff08;API 11&#xff09;提出的&#xff0c;为了兼容低版本&#xff0c;support-v4库中也开发了一套Fragment API&#xff0c;最低兼容Android 1.6。 过去support-v4库是一个jar包&#xff0c;24.2.0版本开始&…...