2023.1.13 关于在 Spring 中操作 Redis 服务器

news2025/4/22 10:51:54

目录

引言

前置工作

前置知识

实例演示

String 类型

List 类型

Set 类型

Hash 类型

ZSet 类型


引言

  • 进行下述操作的前提是 你的云服务器已经配置好了 ssh 端口转发
  • 即已经将云服务器的 Redis 端口映射到本地主机

注意:

  • 此处我们配置的端口号为 8888

可点击下方链接了解如何配置 ssh 端口转发 

Java 客户端连接 Redis 服务器

前置工作

1、在 SpringBoot 项目的 pom.xml 文件中添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、编写 application.yml 配置文件

spring:
  redis:
    host: 127.0.0.1
    port: 8888

前置知识

  • 相较于使用 Jedis 库通过 Jedis 对象里的各种方法来操作 Redis 
  • 此处 Spring 则是通过 StringRedistemplate 来操作 Redis 

注意:

  • StringRedistemplate 类提供的方法相较于 Jedis 对象里的各种方法,具有较大差异

  • StringRedistemplate 类将操作 Redis 的方法分成了几个类别,分门别类的来进行组织
  • 即做了进一步的封装!
  • 所以此处提供的一些接口风格和原生 Redis 命令就有一定的差异了
  • 首先其初心是希望通过上述重新的封装,让接口用起来更简单
  • 在我看来其初心并未达成,反而因为和 Redis 原生命令的差异,提高了使用者学习成本

补充:

  • Spring 最原始提供的类是 RedisTemplate
  • StringRedistemplate 类是 RedisTemplate 的子类 专门用来处理 文本数据的

  • 但是 Redistemplate 类留了一个后手,让我们随时能够执行到 Redis 原生的命令
  • 即通过 execute 方法

实例理解

  • 此处我们想要在 Redis 中执行 FLUSHALL 命令
stringRedisTemplate.execute((RedisConnection connection) -> {
//    execute 要求回调方法中必须写 return 语句,返回个东西
//    这个回调返回的对象,就会作为 execute 本身的返回值
    connection.flushAll();
    return null;
});

  • 函数式接口,相当于一个回调函数
  • 就在回调里,写咱们要执行的 redis 命令
  • 这个回调就会被 RedisTemplate 内部进行执行

补充:

  • 当我们点击查看 RedisCallback<T> 的源码

  • 此处的 RedisConnection 就代表了 Redis 链接,对标 Jedis 对象

实例演示

  • 此处 Redis 测试的各种方法,均通过 Controller 提供的 HTTP 接口来触发的
  • 即我们可先创建一个 MyController 类,并在该类中进行测试代码的编写
package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.Set;


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

//   ...
}

String 类型

    @GetMapping("/testString")
    @ResponseBody
    public String testString() {
//        先清除之前的数据
        stringRedisTemplate.execute((RedisConnection connection) -> {
            connection.flushAll();
            return null;
        });

        stringRedisTemplate.opsForValue().set("key","111");
        stringRedisTemplate.opsForValue().set("key2","222");
        stringRedisTemplate.opsForValue().set("key3","333");

        String value = stringRedisTemplate.opsForValue().get("key");
        System.out.println("value = " + value);

        return "OK";
}

运行结果:


List 类型

    @GetMapping("/testList")
    @ResponseBody
    public String testList() {
//        先清除之前的数据
        stringRedisTemplate.execute((RedisConnection connection) -> {
//            execute 要求回调方法中必须写 return 语句,返回个东西
//            这个回调返回的对象,就会作为 execute 本身的返回值
            connection.flushAll();
            return null;
        });

        stringRedisTemplate.opsForList().leftPush("key","111");
        stringRedisTemplate.opsForList().leftPush("key","222");
        stringRedisTemplate.opsForList().leftPush("key","333");

        String value = stringRedisTemplate.opsForList().rightPop("key");
        System.out.println("value = " + value);
        value = stringRedisTemplate.opsForList().rightPop("key");
        System.out.println("value = " + value);
        value = stringRedisTemplate.opsForList().rightPop("key");
        System.out.println("value = " + value);

        return "OK";
    }

运行结果:


Set 类型

    @GetMapping("/testSet")
    @ResponseBody
    public String testSet() {
//        先清除之前的数据
        stringRedisTemplate.execute((RedisConnection connection) -> {
//            execute 要求回调方法中必须写 return 语句,返回个东西
//            这个回调返回的对象,就会作为 execute 本身的返回值
            connection.flushAll();
            return null;
        });

        stringRedisTemplate.opsForSet().add("key","111","222","333");
        Set<String> result = stringRedisTemplate.opsForSet().members("key");
        System.out.println("result = " + result);

        Boolean exists = stringRedisTemplate.opsForSet().isMember("key","111");
        System.out.println("exists = " + exists);

        Long count = stringRedisTemplate.opsForSet().size("key");
        System.out.println("count = " + count);

        stringRedisTemplate.opsForSet().remove("key","111","222");
        result = stringRedisTemplate.opsForSet().members("key");
        System.out.println("result = " + result);

        return "OK";
    }

运行结果:


Hash 类型

    @GetMapping("/testHash")
    @ResponseBody
    public String testHash() {
//        先清除之前的数据
        stringRedisTemplate.execute((RedisConnection connection) -> {
//            execute 要求回调方法中必须写 return 语句,返回个东西
//            这个回调返回的对象,就会作为 execute 本身的返回值
            connection.flushAll();
            return null;
        });

        stringRedisTemplate.opsForHash().put("key","f1","111");
        stringRedisTemplate.opsForHash().put("key","f2","222");
        stringRedisTemplate.opsForHash().put("key","f3","333");

        String value = (String) stringRedisTemplate.opsForHash().get("key","f1");
        System.out.println("value = " + value);

        Boolean exists = stringRedisTemplate.opsForHash().hasKey("key","f1");
        System.out.println("exists = " + exists);

        stringRedisTemplate.opsForHash().delete("key","f1","f2");

        Long size = stringRedisTemplate.opsForHash().size("key");
        System.out.println("size = " + size);

        return "OK";
    }

运行结果:


ZSet 类型

    @GetMapping("/testZSet")
    @ResponseBody
    public String testZSet() {
//        先清除之前的数据
        stringRedisTemplate.execute((RedisConnection connection) -> {
//            execute 要求回调方法中必须写 return 语句,返回个东西
//            这个回调返回的对象,就会作为 execute 本身的返回值
            connection.flushAll();
            return null;
        });

        stringRedisTemplate.opsForZSet().add("key","xxl",10);
        stringRedisTemplate.opsForZSet().add("key","wml",20);
        stringRedisTemplate.opsForZSet().add("key","shw",30);

        Set<String> members = stringRedisTemplate.opsForZSet().range("key",0,-1);
        System.out.println("members = " + members);

        Set<ZSetOperations.TypedTuple<String>> membersWithScore = stringRedisTemplate.opsForZSet().rangeWithScores("key",0,-1);
        System.out.println("membersWithScore = " + membersWithScore);

        Double score = stringRedisTemplate.opsForZSet().score("key","xxl");
        System.out.println("score = " + score);

        stringRedisTemplate.opsForZSet().remove("key","xxl");

        Long size = stringRedisTemplate.opsForZSet().size("key");
        System.out.println("size = " + size);

        Long rank = stringRedisTemplate.opsForZSet().rank("key","wml");
        System.out.println("rank = " + rank);

        return "OK";
    }

运行结果:

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

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

相关文章

C++力扣题目617--合并二叉树

给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1a;如果两个节点重叠&#…

【STM32】FLASH闪存

1 FLASH闪存简介 本节所指STM32内部闪存&#xff0c;即下载程序的时候&#xff0c;程序存储的地方。&#xff08;非易失性&#xff09; STM32F1系列的FLASH包含程序存储器、系统存储器&#xff08;bootloader&#xff0c;不允许修改&#xff09;和选项字节三个部分&#xff0…

JavaScript学习笔记——变量、作用域、var、const和let

JavaScript学习笔记——变量、作用域、var、const和let 学习链接&#xff08;原链接&#xff09;变量变量声明的三种方式 作用域作用域介绍作用域分类全局作用域局部作用域&#xff08;函数作用域&#xff09;块级作用域块级作用域和局部(函数)作用域区别 varvar的作用域(全局函…

【elastic search】详解elastic search集群

目录 1.与集群有关的一些概念 2.集群搭建 3.集群搭建 4.kibana链接集群 5.选举流程 6.请求流程 7.master的作用 1.与集群有关的一些概念 数据分片&#xff1a; 数据分片&#xff08;shard&#xff09;&#xff0c;单台服务器的存储容量是有限的&#xff0c;把一份数据…

LINUX基础培训七之进程管理

前言、本章学习目标 了解LINUX中进程和程序掌握进程管理的作用和方法熟悉进程调度优先级了解LINUX信号 一、了解LINUX进程和程序 进程是正在执行的一个程序或命令&#xff0c;每个进程都是一个运行的实体&#xff0c;都有自己的地址空间&#xff0c;并占用一定的系统资源。 …

【Python学习】Python学习15-模块

目录 【Python学习】Python学习15-模块 前言创建语法引入模块from…import 语句from…import* 语句搜索路径PYTHONPATH 变量-*- coding: UTF-8 -*-导入模块现在可以调用模块里包含的函数了PYTHONPATH 变量命名空间和作用域dir()函数globals() 和 locals() 函数reload() 函数Py…

pytest -- 基本使用详解

1. pytest基本介绍 pytest 是一个功能强大且易于使用的 Python 测试框架&#xff0c;用于编写单元测试、集成测试和功能测试。 它提供了丰富的功能和灵活的用法&#xff0c;使得编写和运行测试变得简单而高效。 --------------->>>>> pytest框架优点&#xff1a…

C语言之字符串和指针

目录 用数组实现的字符串和用指针实现的字符串 █用数组实现的字符串str █用指针实现的字符串ptr 注意 用数组和指针实现字符串的不同点 字符串数组 用数组实现的字符串的数组——二维数组 用指针实现的字符串数组——指针数组 注意 字符串和指针有着紧密的联系&#…

C#中对浮点数NaN,PositiveInfinity,NegativeInfinity的特殊处理

NAN NAN 整体意思为Not a Number 不是一个数&#xff0c; NaN&#xff08;Not a Number&#xff0c;非数&#xff09;是计算机科学中数值数据类型的一类值&#xff0c;表示未定义或不可表示的值。常在浮点数运算中使用。首次引入NaN的是1985年的IEEE 754浮点数标准。 EEE 75…

AI-图片转换绚丽动漫人物-UGATIT

​​​​​​ &#x1f3e1; 个人主页&#xff1a;IT贫道-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;私聊博主加WX好友&#xff0c;获取更多资料哦~ &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 ​​​​…

代码随想录算法训练营第五天天| 总结数组专题

数组&#xff1a;二分查找、双指针&#xff08;包括快慢指针&#xff09;、滑动窗口、模拟 链表&#xff1a;双指针、三指针、虚拟头指针、复杂指针操作画图明确每一步&#xff08;标好次序&#xff09; 数组 代码随想录总结的很好&#xff0c;如下图。我再结合自己的一些理解…

当使用WSL下载运行Docker可视化界面的镜像,使用报错

Traceback (most recent call last): File “app.py”, line 345, in root tk.Tk() File “/usr/lib/python3.8/tkinter/init.py”, line 2270, in init self.tk _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use) _tkinter.T…

java基础知识点系列——运算符(四)

java基础知识点系列——运算符&#xff08;四&#xff09; 算术运算符 运算符和表达式 运算符&#xff1a;对常量或者变量进行操作的符号表达式&#xff1a;用运算符把常量或者变量链接起来符合java语法的式子就可以称为表达式。不同运算符连接的表达式体现的是不同类型的表…

数据结构排序——计数排序和排序总结(附上912. 排序数组讲解)

数据结构排序——计数排序和排序总结 现在常见算法排序都已讲解完成&#xff0c;今天就再讲个计数排序。再总结一下 文章目录 1.计数排序2.排序总结3.排序oj&#xff08;排序数组&#xff09;题目详情代码思路 1.计数排序 计数排序是一种非基于比较的排序算法&#xff0c;它通…

苹果电脑清理内存 怎么清理删不掉的软件

苹果电脑是很多人的首选&#xff0c;因为它有着优秀的性能和设计。但是&#xff0c;随着时间的推移&#xff0c;你可能会发现你的苹果电脑变得越来越慢&#xff0c;或者出现一些奇怪的问题。这可能是因为你的电脑内存不足&#xff0c;或者有一些删不掉的软件占用了你的空间和资…

谷粒商城-缓存使用分布式锁SpringCache(5天)

缓存使用 1.1.1 哪些数据适合放入缓存 即时性、 数据一致性要求不高的 访问量大且更新频率不高的数据&#xff08;读多&#xff0c; 写少&#xff09; 例如&#xff1a;电商类应用&#xff0c; 商品分类&#xff0c; 商品列表等适合缓存 本地缓存 使用Map进行本地缓存 本地缓存…

为了这口醋,包的这饺子。为了Selenium,学有限的CSS,逐步替换XPATH

Learn about CSS rules and pseudo-classes to help you move your XPATH locators to CSS. 1. 最基本IdElement TypeDirect ChildChild or Sub-ChildClass 2. 深入一点Next SiblingAttribute ValuesChoosing a Specific Match Sub-String Matches 3 参考资料 In order for Sel…

java编程解小学生一年级竞赛题

抖音教学视频 目录 1、题目三角形加起来为10 大纲 1、题目三角形加起来为10 连接&#xff1a;小学一年级数学竞赛练习题3套&#xff0c;有点难度&#xff01; 第16题 此方法不是最优解&#xff0c;穷举法&#xff0c;比较暴力解决 主要给大家演示如何用编程去解决我们的实…

格密码基础:SIS问题的定义与理解

目录 一. 介绍 二. SIS问题定义 2.1 直观理解 2.2 数学定义 2.3 基本性质 三. SIS与q-ary格 四. SIS问题的推广 五. Hermite标准型 六. 小结 一. 介绍 short interger solution problem短整数解问题&#xff0c;简称SIS问题。 1996年&#xff0c;Ajtai首次提出SIS问…