Redis 的安装 + SpringBoot 集成 Redis

news2024/11/26 4:22:00

1.安装 Redis

此处的 Redis 安装是针对 Linux 版本的安装, 因为 Redis 官方没有提供 Windows 版本, 只提供了 Linux 版本. 但是我们可以通过Windows 去远程连接 Redis.

1.1 使用 yum 安装 Redis

使用如下命令, 将 Redis 安装到 Linux 服务器:

yum -y install redis

1.2 启动 Redis

使用如下命令, 以后台运行的方式启动 Redis:

redis-server /etc/redis.conf &

/etc/redis.conf 表示使用 Redis 默认的配置文件

& 表示后台运行

做了这两个步骤之后, 就可以在本地远程操控 Redis 了, 不过需要修改配置文件, 1.4 演示.

1.3 操作 Redis

使用如下命令启动 Redis 客户端 :

redis-cli

这个操作就相当于在 Linux 上启动数据库客户端的命令 mysql -uroot 一样.

具体操作演示 >>

1.4 设置远程连接

  1. 将 Redis 配置文件下载到本地. 该配置文件为 Linux 下的 /etc/redis.conf.

1. 先 cd 到 Redis 配置文件的路径下.
2. 使用 sz 命令, 将文件下载到本地.
  1. 将 redis.conf 中的 "bind 127.0.0.1" 注释掉.

使用 VSCode 将配置文件打开, Ctrl f 搜索 "bind 127.0.0.1" >>

  1. 将 redis.conf 中的 :"protected-mode yes" 改为 "protected-mode no".

  1. 将修改后的 redis.conf 上传至 Linux 下的 /etc 目录.

1. rm -rf redis.conf -> 删除旧的配置文件
2. 将本地更新的配置文件拖拽到 xshell 中.
  1. 使用命令 "redis-cli shutdown" 先关闭 redis 服务, 再使用 "redis-server /etc/redis.conf &" 启动 redis 服务.

2. 安装 Redis 可视化工具

  1. 下载链接 : AnotherRedisDesktopManager

  1. 安装好了之后, 先把 6379 端口放开 (云服务器里没有值钱的东西) :

  1. 打开可视化工具, 新建一个连接.

1. Host 填自己云服务器的外网IP.
2. Port 填写 6379.

当连接建立成功之后, 我们在 redis 默认的数据库中可以看到刚才创建的键值对 username - zhangsan,

也可以在可视化界面操作 Redis 了.

通过命令操作 Redis 的官方文档 : https://redis.io/commands/

3. Redis 的数据类型和使用

Redis 有 5 大基础类型 >>

1. String - 字符串类型
2. Hash - 字典类型
3. List - 列表类型
4. Set - 集合类型
5. ZSet - 有序集合类型

这其中最常用的就是 字符串类型 和 字典类型.

3.1 字符串类型

Redis 中的字符串类型, 也叫作简单动态字符串, 它是以键值对 key-value 的形式进行存储的.

简单使用示例 >>

使用 ex(expires) 参数设置字符串的过期时间>>

set name zhangsan ex 500 # 设置 name 500s 后过期 (删除)

3.2 字典类型

字典类型 (Hash) 又被成为散列类型或者是哈希表类型,它是将一个键值 (key) 和一个特殊的“哈希表”关联起来,这个“哈希表”表包含两列数据:字段和值,它就相当于 Java 中的 Map<String,Map<String,String>> 结构。

具体结构如下 >>

从图中来看, 使用字典类型来存储键值对信息, 就无须手动序列化和反序列化数据了, 所以使用起来更加高效方便.

简单使用示例 >>

3.3 列表类型

列表类型 (List) 是一个使用链表存储的有序结构, 它元素的插入会按照先后顺序存储到链表结构中, 因此它的插入和删除操作的时间复杂度为 O(1), 当它的查询速度为 O(n).

简单的使用示例 >>

列表的典型使用场景有以下两个:

1. 消息队列:列表类型可以使用 rpush 实现先进先出的功能,同时又可以使用 lpop 轻松的弹出(查询并删除)第一个元素,所以列表类型可以用来实现消息队列;
2. 文章列表:对于博客站点来说,当用户和文章都越来越多时,为了加快程序的响应速度,我们可以把用户自己的文章存入到 List 中,因为 List 是有序的结构,所以这样又可以完美的实现分页功能,从而加速了程序的响应速度。

3.4 集合类型

集合类型 (Set) 是一个无序并唯一的键值集合.

集合类型的简单使用 >>

集合类型(Set)和列表类型(List)的区别:

列表可以存储重复元素,集合只能存储非重复元素;
列表是按照元素的先后顺序存储元素的,而集合则是无序方式存储元素的

3.5 有序集合类型

有序集合类型 (Sort Set) 相比于集合类型多了一个排序属性 score (分数 /权重), 也就是说每个有序集合存储的元素对应两个值, 一个是有序结合的元素值 , 一个是排序值 (权重). 并且有序集合存储的元素也是不能重复的, 但排序值可以重复.

存储结构 >>

4. SpringBoot 集成 Redis

4.1 添加 redis 依赖

4.2 配置 redis

以下是 .properties 的配置.

spring.redis.database=1
spring.redis.port=6379
spring.redis.host=43.139.1.94
spring.redis.lettuce.pool.min-idle=5
spring.redis.lettuce.pool.max-idle=10
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=1ms
spring.redis.lettuce.shutdown-timeout=100ms

4.3 操作 redis

4.3.1 将字符串存储在 redis 中

@RestController
public class MyRedisController {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    // 在 redis 中存储数据
    @RequestMapping("/setstr")
    public String setStr(String key, String value) {
        if(StringUtils.hasLength(key) && StringUtils.hasLength(value)) {
            stringRedisTemplate.opsForValue()
                    .set(key, value);
            return "redis 操作成功.";
        } else {
            return "redis 操作失败.";
        }
    }

    // 从 redis 中读取数据
    @RequestMapping("/getstr")
    public String getStr(String key) {
        String result = null;
        if(StringUtils.hasLength(key)) {
            result = stringRedisTemplate.opsForValue()
                    .get(key);
        }
        return "结果: " + result;
    }
}

验证setstr >> 127.0.0.1:8080/setstr?key=test_redis_1&value=Java

验证 getstr >> 127.0.0.1:8080/getstr?key=test_redis_1

客户端查看数据 >>

此处要注意客户端默认连接 redis 的是 DB0, 而前面在配置文件 中设置的数据库是 DB1, 所以客户端在DB0 中看不到数据的.

如果想要使用命令拿到程序中设置的 value, 使用如下命令 >>

1. select 1 -> 切换数据库
2. get test_redis_1 -> 获取值

4.3.2 将对象以字符串形式存储 redis

创建 User 类:

@Data
public class User {
    private int id;
    private String username;
    private String password;
}

代码示例 >>

@RestController
public class MyRedisController {
    private User user;

    @Autowired
    private ObjectMapper objectMapper;

    private final String object_redis_key = "user_1";

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 使用双重校验锁来构建一个单例 User对象
     * @return
     */
    public User getUser() {
        if(user == null) {
            synchronized (this) {
                if(user == null) {
                    user = new User();
                    user.setId(1);
                    user.setUsername("张三");
                    user.setPassword("123");
                }
            }
        }
        return user;
    }

    /**
     * 将对象存储在 redis 中
     * @return
     * @throws JsonProcessingException
     */
    @RequestMapping("/setobj")
    public String setObj() throws JsonProcessingException {
        User user = getUser();
        String userStr = objectMapper.writeValueAsString(user);
        stringRedisTemplate.opsForValue().set(object_redis_key, userStr);
        return "操作成功! ";
    }

    /**
     * 从 redis 中读取对象
     * @return
     * @throws JsonProcessingException
     */
    @RequestMapping("getobj")
    public User getObj() throws JsonProcessingException {
        String userStr = stringRedisTemplate.opsForValue().get(object_redis_key);
        User user = objectMapper.readValue(userStr, User.class);
        return user;
    }
}

验证 setobj >>

验证 getobj >>

4.3.3 将对象以字典类型存储 redis

// ... 省略相同代码

private final String object_redis_key2 = "user_2";

@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
 * 将对象以字典类型存储 redis
 * @return
 */
@RequestMapping("/sethash")
public boolean setHash() {
    User user = getUser();
    stringRedisTemplate.opsForHash().put(object_redis_key2, "id", String.valueOf(user.getId()));
    stringRedisTemplate.opsForHash().put(object_redis_key2, "username", user.getUsername());
    stringRedisTemplate.opsForHash().put(object_redis_key2, "password", user.getPassword());
    return true;
}

@RequestMapping("/gethash")
public String getHash() {
    return stringRedisTemplate.opsForHash().get(object_redis_key2, "username").toString();
}

验证 setHash >> 127.0.0.1:8080/sethash

验证 getHash >> 127.0.0.1:8080/gethash

以 Hash 的形式存储 redis 的优点 >>

可以单独读取对象中的某一个成员, 不用将整个对象读取出来, 比较节省网络带框.

以 Hash 的形式存储 redis 的缺点 >>

存储对象会非常麻烦, 如果读取数据的时候, 需要将整个对象读出来, 也会非常麻烦.

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

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

相关文章

科技云报道:开源真的香,风险知多少?

科技云报道原创。 过去几年&#xff0c;开源界一片火热&#xff0c;开源软件技术已全面进军操作系统、云原生、人工智能、大数据、半导体、物联网等行业领域。 数据显示&#xff0c;我国超九成企业在使用或正计划使用开源技术。 与此同时&#xff0c;全球各大开源组织相继兴…

苹果手机专用蓝牙耳机有哪些?与iphone兼容性好的蓝牙耳机

蓝牙耳机摆脱了线缆的束缚&#xff0c;在地以各种方式轻松通话。自从蓝牙耳机问世以来&#xff0c;一直是行动商务族提升效率的好工具&#xff0c;苹果产品一直都是受欢迎的数码产品&#xff0c;下面推荐几款与iphone兼容性好的蓝牙耳机。 第一款&#xff1a;南卡小音舱蓝牙耳…

Springboot部署阿里云短信服务

一、阿里云短信模板配置&#xff08;获取SignName[签名名称]、TemplateCode[模板CODE]&#xff09; 1. 进入阿里云首页直接搜索短信服务&#xff0c;并点击国内消息进入国内文本短信管理页面 2. 选择签名管理点击添加签名 填写签名信息并提交 注&#xff1a;下面的签名来源如…

全栈自动化测试技术笔记(一):前期调研怎么做

昨天下午在家整理书架&#xff0c;把很多看完的书清理打包好&#xff0c;预约了公益捐赠机构上门回收。 整理的过程中无意翻出了几年前的工作记事本&#xff0c;里面记录了很多我刚开始做自动化和性能测试时的笔记。 虽然站在现在的角度来看&#xff0c;那个时候无论是技术细…

【Java 面试合集】描述下Objec类中常用的方法(未完待续中...)

描述下Objec类中常用的方法 1. 概述 首先我们要知道Object 类是所有的对象的基类&#xff0c;也就是所有的方法都是可以被重写的。 那么到底哪些方法是我们常用的方法呢&#xff1f;&#xff1f;&#xff1f; cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringw…

你知道 GO 中什么情况会变量逃逸吗?

你知道 GO 中什么情况会变量逃逸吗&#xff1f;首先我们先来看看什么是变量逃逸 Go 语言将这个以前我们写 C/C 时候需要做的内存规划和分配&#xff0c;全部整合到了 GO 的编译器中&#xff0c;GO 中将这个称为 变量逃逸 GO 通过编译器分析代码的特征和代码的生命周期&#x…

在RT-Thread STM32F407平台下配置SPI flash为U盘

记录下SPI Flash U盘实现过程中踩过的坑&#xff0c;与您分享。前提条件是&#xff0c;需要先将SPI Flash 配置到elm fal文件系统&#xff0c;并挂载成功。如下图然后开始配置USB1&#xff0c;在CubeMX&#xff0c;选择SUB_OTG_FS2 选择USB Device3&#xff0c;确认USB时钟为48…

流程控制之循环

文章目录五、流程控制之循环5.1 步进循环语句for5.1.1 带列表的for循环语句5.1.2 不带列表的for循环语句5.1.3 类C风格的for循环语句5.2 while循环语句5.2.1 while循环读取文件5.2.2 while循环语句示例5.3 until循环语句5.4 select循环语句5.5 嵌套循环5.4 利用break和continue…

【八大数据排序法】堆积树排序法的图形理解和案例实现 | C++

第二十一章 堆积树排序法 目录 第二十一章 堆积树排序法 ●前言 ●认识排序 1.简要介绍 2.图形理解 3.算法分析 ●二、案例实现 1.案例一 ● 总结 前言 排序算法是我们在程序设计中经常见到和使用的一种算法&#xff0c;它主要是将一堆不规则的数据按照递增…

BinaryAI全新代码匹配模型BAI-2.0上线,“大模型”时代的安全实践

导语BinaryAI&#xff08;https://www.binaryai.net&#xff09;科恩实验室在2021年8月首次发布二进制安全智能分析平台—BinaryAI&#xff0c;BinaryAI可精准高效识别二进制文件的第三方组件及其版本号&#xff0c;旨在推动SCA&#xff08;Software Composition Analysis&…

网络通信协议是什么?

网络通信基本模式 常见的通信模式有如下2种形式&#xff1a;Client-Server(CS) 、 Browser/Server(BS) 实现网络编程关键的三要素 IP地址&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识。 端口&#xff1a;应用程序在设备中唯一的标识。 协议: 数据在网络中传输的…

7、单行函数

文章目录1 函数的理解1.1 什么是函数1.2 不同DBMS函数的差异1.3 MySQL的内置函数及分类2 数值函数2.1 基本函数2.2 角度与弧度互换函数2.3 三角函数2.4 指数与对数2.5 进制间的转换3 字符串函数4 日期和时间函数4.1 获取日期、时间4.2 日期与时间戳的转换4.3 获取月份、星期、星…

码上掘金实现电子木鱼

前言 前几天在朋友圈看到“敲电子木鱼”的视频&#xff0c;敲一下木鱼就提示“功德 1”&#xff0c;还带有敲击声和念经的声音&#xff0c;感觉挺有意思的。 心血来潮&#xff0c;捣鼓了一晚上&#xff0c;借助码上掘金实现了这个功能。 展示效果 素材 准备素材如下&#…

又一国产开源项目走向世界,百度RPC框架Apache bRPC正式成为ASF顶级项目

2023 年 1 月 26 日&#xff0c;Apache 软件基金会 (ASF) 官方正式宣布Apache bRPC 正式毕业&#xff0c;成为 Apache的顶级项目。 我听到这个消息是挺开心的&#xff0c;毕竟是又一款由国人主导的apche顶级项目&#xff0c;再次证明国内在开源界正在发挥越来越重要的作用。 …

Java的对象和类

名词解释 对象是指由类定义的数据结构&#xff0c;拥有属性和方法。它是运行时实例化的。 类是一种用于描述对象的模板&#xff0c;它定义了对象的属性和方法。类是一种类型&#xff0c;可以用于定义对象&#xff0c;并且可以对对象进行操作。 故事概要 小明是初学者想要学习…

JVM——7JVM调优实战及常量池详解

Arthas工具的使用 阿里巴巴开源的java诊断工具 下载插件 上传至linux环境 在linux跑起来的java项目&#xff0c;可以用Arthas进行查看 项目上线前的时候没问题&#xff0c;上线了就出问题 &#xff0c;用来查看线上代码 jad 项目名 &#xff1a;反编译线上正在运行的代码 用…

SpringCloud-Netflix学习笔记10——Hystrix实现服务熔断

一、概述 1、分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系&#xff0c;每个依赖关系在某些时候将不可避免的失败&#xff01; 2、服务雪崩 多个微服务之间调用的时候&#xff0c;假设微服务A调用微服务B和微服务C&#xff0c;微服务B 和微服务C又…

雁过留痕,竟是病毒的痕迹?

凌恩生物全新升级宏病毒组分析流程&#xff1b;聚焦DNA&#xff0c;RNA病毒组研究热点&#xff1b;高灵敏度检测vOTUs&#xff1b;多软件整合&#xff0c;精准鉴定病毒序列&#xff1b;直击地化循环关键环节&#xff0c;助力宏病毒组科研成功&#xff01;期刊&#xff1a;Micro…

板子登录和挂载问题记录

ubuntu登录板子问题 ssh登录ssh 10.1.3.15&#xff0c;显示No route to host 则尝试在板子上ping 本机ip 试一下 挂载 本地机器vim /etc/export编辑此内容并保存 /exports_0209/tda4_build *(rw,no_root_squash,nohide,insecure,no_subtree_check,async)1.挂载nfs方法 mou…

【PR】零基础快速入门教程

【PR】零基础快速入门教程PR&#xff08;Premiere&#xff09;能做什么&#xff1f;PR欢迎界面及新建项目工作区及窗口说明导入文件建立序列视频剪辑添加字幕导出视频使用软件&#xff1a;Premiere2020新年卷起来&#xff0c;写文章已近不能满足与我了&#xff0c;我要向着更前…