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

Spring 框架下 Redis 数据结构的全面解析

Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章给大家带来的是如何通过 Spring 来操作 Redis 中的常见数据结构 , 以及如何通过代码执行 Redis 中的原生命令 .

在这里插入图片描述

本专栏旨在为初学者提供一个全面的 Redis 学习路径,从基础概念到实际应用,帮助读者快速掌握 Redis 的使用和管理技巧。通过本专栏的学习,能够构建坚实的 Redis 知识基础,并能够在实际学习以及工作中灵活运用 Redis 解决问题 .
专栏地址 : Redis 入门实践

一 . 前置操作

1.1 创建项目

我们先来创建一个 Spring Boot 的项目
image.png
image.png
image.png
image.png
然后更改一下配置文件的格式
image.png
image.png

1.2 设置 Redis 的连接信息

在 application.yml 中粘贴下面的代码

spring:redis:host: 127.0.0.1port: 8888

1.3 设置项目分层结构

image.png
image.png
然后在类上面添加 @RestController 注解
那后续我们测试 Redis 的各种方法 , 就通过 Spring Web 中的接口方法来去触发

1.4 注入 Redis

我们要想使用 Redis , 就需要将 Redis 注入到我们的 TestController 中
image.png

package com.example.demo.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {@Autowiredprivate StringRedisTemplate redisTemplate;
}

二 . string 类型

我们通过访问对应的路由 , 来去触发 Redis 的各种操作
image.png

我们只是简单的介绍一下 set 和 get 命令 , 其他命令虽然说跟 Jedis 有一些差别 , 但是仍然可以通过 IDEA 的选项选择出我们需要的方法 , 再按照它的参数要求去编写对应的方法即可
image.png
我们使用 redisTemplate 的时候 , 发现并没有 set / get 相关方法了
这是因为 RedisTemplate 做了进一步的封装
image.png
我们给每个类型设计了不同的对象 , 所以需要我们调用不同的类型来去使用 , 这就跟我们原生的 Jedis 就有一些差异了
我们就可以通过 redisTemplate.opsForValue() 来去操作 string 类型了
image.png

package com.example.demo.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {@Autowiredprivate StringRedisTemplate redisTemplate;@RequestMapping("/testString")public String testString() {// 设置键值对redisTemplate.opsForValue().set("k1", "111");redisTemplate.opsForValue().set("k2", "222");redisTemplate.opsForValue().set("k3", "333");// 获取键值对String value = redisTemplate.opsForValue().get("k1");System.out.println("value = " + value);return value;}
}

然后我们访问 http://127.0.0.1:8080/testString 就可以在控制台看到我们的信息了
image.png

三 . list 类型

我们刚才插入了一些数据 , 那我们要清空一下数据库 .
image.png
但是这并没有 flushdb 这个方法啊 , 而且看了一圈也没提供 flushdb 这个方法啊 .
那 Spring 就提供给我们一个执行原生命令的方法
image.png
那参数里面的 RedisCallback action 就相当于一个回调函数 , 在这个回调函数中写下我们需要执行的 Redis 命令 , 那这个回调函数就会被 RedisTemplate 内部进行执行
我们再来具体看一下 execute 这个方法
image.png
image.png
image.png
image.png
那 RedisConnection 就代表了 Redis 的连接 (就跟 Jedis 对象类似)
那我们也应该传入一个 Redis 连接 , 我们使用 lambda 的方式
现在 execute 的方法中编写一个 lambda 表达式
image.png
然后在 () 中创建 Redis 连接 , 在 {} 中编写要执行的 Redis 语句
image.png
那目前 execute 这个方法还在报错 , 是因为回调函数需要我们返回一个返回值 , 而我们只是清空一下数据库 , 并不需要返回什么 , 所以直接返回一个 null 即可
image.png
然后我们就可以模拟列表的各个方法了

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.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class TestController {@Autowiredprivate StringRedisTemplate redisTemplate;@RequestMapping("/testList")public String testList() {// 清空数据库// 避免上一组的测试数据影响到下一组的测试结果redisTemplate.execute((RedisConnection connection) -> {connection.flushDb();return null;});// 向列表中添加数据// 头插法redisTemplate.opsForList().leftPush("key", "111");// 尾插法redisTemplate.opsForList().rightPush("key", "222");redisTemplate.opsForList().rightPush("key", "333");redisTemplate.opsForList().rightPush("key", "444");// 获取列表中的元素List<String> result = redisTemplate.opsForList().range("key", 0, -1);System.out.println("result = " + result);// 删除操作// 头删法String value1 = redisTemplate.opsForList().leftPop("key");System.out.println("头删法 : " + value1);// 尾删法String value2 = redisTemplate.opsForList().rightPop("key");System.out.println("尾删法 : " + value2);return "OK";}
}

image.png

四 . set 类型

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.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;
import java.util.Set;@RestController
public class TestController {@Autowiredprivate StringRedisTemplate redisTemplate;@RequestMapping("/testSet")public String testSet() {System.out.println("测试 集合 类型");// 清空数据库// 避免上一组的测试数据影响到下一组的测试结果redisTemplate.execute((RedisConnection connection) -> {connection.flushDb();return null;});// 向集合中添加元素redisTemplate.opsForSet().add("key", "111", "222", "333", "444");// 获取集合中的元素Set<String> result = redisTemplate.opsForSet().members("key");System.out.println("集合当中的元素 : " + result);// 判断元素是否在集合中Boolean exists = redisTemplate.opsForSet().isMember("key", "111");System.out.println("该元素是否存在 : " + exists);// 获取集合的元素个数Long len = redisTemplate.opsForSet().size("key");System.out.println("集合的元素个数为 : " + len);// 删除元素Long delNum = redisTemplate.opsForSet().remove("key", "111", "222");System.out.println("删除的元素个数为 : " + delNum);return "OK";}
}

image.png

五 . hash 类型

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.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;
import java.util.Set;@RestController
public class TestController {@Autowiredprivate StringRedisTemplate redisTemplate;@RequestMapping("/testHash")public String testHash() {System.out.println("测试 哈希 类型");// 清空数据库// 避免上一组的测试数据影响到下一组的测试结果redisTemplate.execute((RedisConnection connection) -> {connection.flushDb();return null;});// 添加元素redisTemplate.opsForHash().put("k1", "f1", "111");redisTemplate.opsForHash().put("k1", "f2", "222");redisTemplate.opsForHash().put("k1", "f3", "333");redisTemplate.opsForHash().put("k1", "f4", "444");// 获取元素String value = (String) redisTemplate.opsForHash().get("k1", "f1");System.out.println("value = " + value);// 判断是否存在Boolean isExists = redisTemplate.opsForHash().hasKey("k1", "f1");System.out.println("该元素是否存在 : " + isExists);// 获取哈希个数Long size = redisTemplate.opsForHash().size("k1");System.out.println("集合的元素个数为 : " + size);// 删除元素redisTemplate.opsForHash().delete("key", "f1", "f2");return "OK";}
}

image.png
要注意的是 , 我们在调用 get 方法的时候
image.png
所以我们需要进行强转

六 . zset 类型

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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;
import java.util.Set;@RestController
public class TestController {@Autowiredprivate StringRedisTemplate redisTemplate;@RequestMapping("/testZSet")public String testZSet() {System.out.println("测试 zset 类型");// 清空数据库// 避免上一组的测试数据影响到下一组的测试结果redisTemplate.execute((RedisConnection connection) -> {connection.flushDb();return null;});// 添加元素// 注意: 这里的顺序是先 value 再 scoreredisTemplate.opsForZSet().add("key", "zhangsan", 10.0);redisTemplate.opsForZSet().add("key", "lisi", 20.0);redisTemplate.opsForZSet().add("key", "wangwu", 30.0);// 获取所有元素Set<String> result1 = redisTemplate.opsForZSet().range("key", 0, -1);// 只获取所有的 membersSet<ZSetOperations.TypedTuple<String>> result2 = redisTemplate.opsForZSet().rangeWithScores("key", 0, -1);// 既获取 members, 又获取 scoresSystem.out.println("所有的成员 : " + result1);System.out.println("成员 + 成绩 : " + result2);// 查询某个成员的成绩Double score = redisTemplate.opsForZSet().score("key", "zhangsan");System.out.println("zhangsan 的成绩为 : " + score);// 获取有序集合元素个数Long len = redisTemplate.opsForZSet().size("key");System.out.println("有序集合的元素个数为 : " + len);// 返回指定元素所在成绩排名Long rank = redisTemplate.opsForZSet().rank("key", "zhangsan");System.out.println("该元素成绩所在排名 " + rank);// 删除元素redisTemplate.opsForZSet().remove("key", "zhangsan");return "OK";}
}

image.png
其中 , 要注意的操作是 rangeWithScores 这个方法
我们注意一下他的返回值
image.png
Tuple 很眼熟 , 我们在 Jedis 中介绍过了 , 他是一个元组 , 更通俗来说就是一组打包好的数据 .
那我们只需要按照源码提示我们的方式 , 替换掉泛型即可
image.png


那通过这些简单的命令 , 我们就简单的了解了怎样通过 Spring 来去操作 Redis .
虽然我们并未针对每个数据结构的命令进行详细介绍 , 但是其他方法我们通过 IDEA 的提示也能编写出对应的方法
我们也可以通过 Spring 官网提供的教程来去进行查阅 : https://spring.io/projects/spring-data-redis/

那如果对你产生帮助的话 , 还请一键三连 , 感谢 ~
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Unity小工具】Image组件宽度、高度自适应
  • 【Google Play】X浏览器4.8.1国际版(如何鉴别是否官方?)
  • 掌握 SQL 数据操纵的基础技巧
  • 点亮ESP 32 板载LED 灯
  • Java 入门指南:Java 并发编程 —— 并发容器 PriorityBlockingQueue
  • Spark2.x 入门:逻辑回归分类器
  • 简单的Linux Ftp服务搭建
  • 通过redis-operator 来部署 Redis Cluster 集群
  • 【大数据】Canal实现MySQL数据增量同步至Kafka:原理与配置解析
  • MSSQL数据库安全配置
  • 北京君正低功耗MCU芯片应用在柯氏音法电子血压计
  • 使用 ELK Stack 进行云原生日志记录和监控:AWS 中的开发运营方法
  • Python【1】
  • JS设计模式之“神奇的魔术师” - 简单工厂模式
  • Python3.8绿色便携版嵌入式版制作
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [译]CSS 居中(Center)方法大合集
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Cookie 在前端中的实践
  • DataBase in Android
  • Java Agent 学习笔记
  • Linux各目录及每个目录的详细介绍
  • mysql常用命令汇总
  • Rancher-k8s加速安装文档
  • rc-form之最单纯情况
  • redis学习笔记(三):列表、集合、有序集合
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • windows下使用nginx调试简介
  • 阿里云应用高可用服务公测发布
  • 基于Android乐音识别(2)
  • 树莓派 - 使用须知
  • 携程小程序初体验
  • Java总结 - String - 这篇请使劲喷我
  • 从如何停掉 Promise 链说起
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ###C语言程序设计-----C语言学习(6)#
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (7)STL算法之交换赋值
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (第27天)Oracle 数据泵转换分区表
  • (篇九)MySQL常用内置函数
  • (全注解开发)学习Spring-MVC的第三天
  • (转) Android中ViewStub组件使用
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • /*在DataTable中更新、删除数据*/
  • @Autowired @Resource @Qualifier的区别
  • []新浪博客如何插入代码(其他博客应该也可以)