认识Redis

news2024/11/17 3:29:06

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这个名字不然乱码
    @Autowired
    private RedisTemplate stringRedisTemplate;

    @RequestMapping("/setStr")
    public String setStr(String key,String value){
        if (!StringUtils.hasLength(key) || !StringUtils.hasLength(value)){
            return "failed";
        }

        //string
        stringRedisTemplate.opsForValue().set(key,value);
        
        //hash
        stringRedisTemplate.opsForHash().put("hashKey","k1","v1");
        stringRedisTemplate.opsForHash().put("hashKey","k2","v2");
        
        //list
        stringRedisTemplate.opsForList().leftPush("listKey","l1");
        stringRedisTemplate.opsForList().leftPush("listKey","l2");

        //set
        stringRedisTemplate.opsForSet().add("setKey","s1","s2","s3");
        
        //zset
        stringRedisTemplate.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: redis
    redis:
      flush-mode: on_save       # 会话数据在保存时刷新到 Redis
      namespace: 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 {
        //模拟,不登录,只存Session
        User 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. 消息队列

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

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

相关文章

【李沐3】3.5、图像分类数据集

# %matplotlib inline # 上述代码是一个注释&#xff0c;用于在Jupyter Notebook等环境中显示Matplotlib绘图的结果在单元格内部显示&#xff0c;而不是弹出新的窗口。import torch import torchvision from torch.utils import data from torchvision import transforms from …

A - Bone Collector(01背包)

Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave … The bone collector had a big bag with a volume of V ,and along his tr…

SpringBoot常用注解-@PathVariable、@RequestParam 、@RequestBody

目录 PathVariable RequestParam RequestBody PathVariable PathVariable 获取url中的数据&#xff0c;绑定路径中的占位符参数到方法参数变量中&#xff0c;get或者post方式都可以&#xff0c;如果URL中无参数&#xff0c;将会出错 例如获取/login/id/name中的id值和name值 …

Pytorch建立MyDataLoader过程详解

简介 torch.utils.data.DataLoader(dataset, batch_size1, shuffleNone, samplerNone, batch_samplerNone, num_workers0, collate_fnNone, pin_memoryFalse, drop_lastFalse, timeout0, worker_init_fnNone, multiprocessing_contextNone, generatorNone, *, prefetch_factorN…

attention is all you need 超参数 私自解读

这几个超参数可变&#xff0c;但是也不能变得太多&#xff1b; 语言本身是复杂的&#xff0c;但可以按照多套语法体系来解剖语言现象&#xff0c;所以超参数是有一定可变的范围&#xff1b; 为什么是6层编码器和解码器呢&#xff1f; 人类的语言可以按照六个层次来组织&#…

Day14-2-NodeJS后端开发流程

Day14-NodeJS后端工程化流程 一 apifox工具 apifox是目前最好的接口调试工具 1 环境搭建 安装登录创建项目接口里面创建对应文件夹在指定的文件夹里面创建接口2 GET请求 1 apifox发送GET请求 2 后端接收GET请求 router.get("/getUserinfo"

拼多多商品详情API接入站点,实时数据json格式示例

作为国内最大的电商平台之一&#xff0c;拼多多数据采集具有多个维度。 有人需要采集商品信息&#xff0c;包括品类、品牌、产品名、价格、销量等字段&#xff0c;以了解商品销售状况、热门商品属性&#xff0c;进行市场扩大和重要决策&#xff1b; 商品数据&#xff1a;拼…

Navicat 蝉联 2023年度 DBTA 读者选择奖的“最佳数据库管理员解决方案”奖项和 DBTA 100 强名单

近日&#xff0c;Database Trends and Applications (简称 DBTA) 颁发的“读者选择奖”获奖名单新鲜出炉&#xff0c;Navicat 蝉联 2023 年度 DBTA 读者选择奖的“最佳数据库管理员&#xff08;DBA&#xff09;解决方案”奖项和 DBTA 100 强名单&#xff0c;我们感到无比荣幸和…

自动化编排工具Terraform介绍(一)

Terraform是什么&#xff1f;: Terraform 是 HashiCorp 公司旗下的 Provision Infrastructure 产品, 是 AWS APN Technology Partner 与 AWS DevOps Competency Partner。Terraform 是一个 IT 基础架构自动化编排工具&#xff0c;它的口号是“Write, Plan, and Create …

springMVC 已解密的登录请求

问题描述&#xff1a; 解决方案&#xff1a; 1.对用户所输入的密码在页面进行MD5加密并反馈至密码输入框。 2. 手动生成SSL安全访问证书&#xff1b;在此不做介绍&#xff0c;相关方法可通过网上查找&#xff1b; 3. 将产品HTTP访问方式改为SSL安全访问方式&#xff1b;在Ap…

Fast DDS(1)

1、什么是数据分发服务(DDS)&#xff1a; 数据分发服务 (DDS) 是一种以数据为中心的通信协议&#xff0c;用于分布式软件应用程序通信。它描述了支持数据提供者和数据消费者之间通信的通信应用程序编程接口&#xff08;API&#xff09;和通信语义。 由于它是一个以数据为中心的…

java云智慧工地管理平台系统源码

智慧工地将“互联网”的理念和技术引入建筑工地&#xff0c;从施工现场源头抓起&#xff0c;最大程度地收集人员、安全、环境、材料等关键业务数据&#xff0c;依托物联网、互联网&#xff0c;建立云端大数据管理平台&#xff0c;形成“端云大数据”的业务体系和新的管理模式&a…

toLocaleString()方法

toLocaleString() 可以用来格式化&#xff0c;比如数字的格式化&#xff0c; 整数部分每三位加一个逗号 toLocaleString()还可以将数字转换为百分比 如&#xff1a;

印刷企业应该先部署MES管理系统还是ERP系统

在数字化转型的推动下&#xff0c;印刷企业也需要与时俱进&#xff0c;实现信息化和智能化管理。然而&#xff0c;在部署MES生产管理系统和企业ERP系统时&#xff0c;企业需要首先考虑应该先部署哪一个系统。本文将探讨这个问题&#xff0c;并阐述其原因。 一、印刷企业MES管理…

概念解析 | 雷达层析成像:探索隐形世界的新视角

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:雷达层析成像 (Radar Tomography Imaging)。 雷达层析成像:探索隐形世界的新视角 一、背景介绍 自从雷达(Radio Detection and Ranging)发明以来,它已经成为了我们生活…

二、SQL注入之联合查询

文章目录 1、SQL注入原理2、SQL注入的原因3、SQL注入的危害4、SQL注入基础4.1 MySQL相关4.2 SQL注入流程&#xff1a; 5、联合注入实例基本步骤6、总结 1、SQL注入原理 SQL注入(Sql Injection&#xff09;就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串&…

鉴源论坛 · 观模丨形式化方法的工业应用:航空领域

作者 | 徐奕龙飞 上海控安可信软件创新研究院系统建模组 版块 | 鉴源论坛 观模 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 摘 要 本文主要探讨了形式化方法在航空领域中的工业应用。航空领域作为安全攸关领域&#xff0c;其机载系统软件的开发…

【Unity 实用工具篇】✨ | 二维像素角色创作工具 2D Pixel Unit Maker

前言【Unity 实用工具篇 】 | 二维像素角色创作工具 2D Pixel Unit Maker一、介绍1.1 相关链接1.2 效果展示二、快速使用方法2.1 导入插件2.2 打开动画场景,完成初始化2.3 配置自己想要的二维像素角色三、导出角色动画序列帧四、导入新项目使用4.1 切割序列帧动画4.2 配置角色…

jvm-虚拟机栈

1.栈的存储单位 栈是运行时单位&#xff0c;而堆是存储的单位 栈解决程序的运行问题&#xff0c;即程序如何执行&#xff0c;或者说如何处理数据。堆解决的是数据存储问题&#xff0c;即数据怎么放&#xff0c;放在哪儿 java虚拟机栈 早期也叫java栈&#xff0c;每个线程在创…

电商数据采集和数据分析

不管是做渠道价格的治理&#xff0c;还是做窜货、假货的打击&#xff0c;都需要品牌对线上数据尽数掌握&#xff0c;准确的数据是驱动服务的关键&#xff0c;所以做好电商数据的采集和分析非常重要。 当线上链接较多&#xff0c;品牌又需要监测线上数据时&#xff0c;单靠人工肯…