在spring中操作Redis

news/2024/2/28 0:59:01

目录

创建项目

​编辑 配置Redis

创建类

StringRedisTemplate

 set / get

list

set 

Hash 

zset


新年快乐!!!!

创建项目

        选中maven项目,然后选择java8,输入名称之后,点击next。

        随后选择依赖:

 配置Redis

        找到配置文件 application.properties:

当然你也可以将其改为yml:

这里我们使用yml文件:

添加配置:

spring:redis:host: 127.0.0.1port: 8888

这里通过ssh转发,来实现连接服务器上的Redis服务器。

创建类

        创建一个MyController类

 

        spring中使用StringRedisTemplate来操作Redis,其实最原始的提供的类是RedisTemplate,但是太麻烦了,现在的StringRedisTemplate是RedisTemplate的子类,专门用来处理 文本数据的。

        MyController内容如下:

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

         后续将在这个类中进行Redis的操作。

StringRedisTemplate

        通过在一个请求方法中进行对象.的操作,发现好像和我们预想的不一样:

        通过这个类的实例对象,并没有发现很直观的有get和set方法,但是似乎他们的前面都加上了posFor。这是为什么?

        其实,此处的Template就是把这些操作Redis的方法,分成了几个类别,例如,操作list的是一个类,他就是opsForList(),以此类推做了进一步封装:

        后续的stringRedisTemplate是StringRedisTemplate的子类。 

        在进行jedis集成spring的测试代码中,需要清除干扰项目,也就是里面可能已经存在一些key,对我们后面的测试造成影响,需要使用flashAll来清除所有的key。

         但是我们翻阅了stringRedisTemplate的方法,发现没有flashall操作:

        RedisTemplate留了一个后手,让我们随时可以执行到Redis的原生命令。Redis集成spring中有一个 execute方法,用来执行Redis的原生命令。

        里面有一个RedisCallBack是一个回调函数:

public interface RedisCallback<T> {@NullableT doInRedis(RedisConnection connection) throws DataAccessException;
}

         输入相关参数就可以进行执行Redis原生命令了:

        redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();});

         但是有个问题,就是这段代码的execute会报错:

        这是什么回事?这是因为当前的execute方法会有一个返回结果,但是当前不需要返回什么,就返回一个null即可:

        redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});

 

 set / get

        使用StringRedisTemplate的实例中的方法来 进行set和get方法操作Redis。

package com.example.redisbyspring;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {@Autowiredprivate StringRedisTemplate redisTemplate;@GetMapping("/testString")@ResponseBodypublic String testString() {redisTemplate.opsForValue().set("key1","value1");redisTemplate.opsForValue().set("key2","value2");redisTemplate.opsForValue().set("key3","value3");String ret1 = redisTemplate.opsForValue().get("key1");System.out.println(ret1);String ret2 = redisTemplate.opsForValue().get("key2");System.out.println(ret2);String ret3 = redisTemplate.opsForValue().get("key3");System.out.println(ret3);return "ok";}}

        浏览器访问接口:

        返回:

        控制台输出:

 

list

    @GetMapping("/testList")@ResponseBodypublic String testList() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});// list的lpushredisTemplate.opsForList().rightPush("key","111");// list一次性添加多个元素redisTemplate.opsForList().rightPushAll("key","222","333","444");// 此时的列表内容为[111,222,333,444]// popredisTemplate.opsForList().leftPop("key");redisTemplate.opsForList().rightPop("key");// 此时list表的内容为[222,333]// list的lrangeList<String> list = redisTemplate.opsForList().range("key",0, -1);System.out.println(list);return "listOk";}

 访问对应的链接,输出:

set 

    @GetMapping("/testSet")@ResponseBodypublic String testSet() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});// set的saddredisTemplate.opsForSet().add("key","111","222","333");// set的smembersSet<String> set = redisTemplate.opsForSet().members("key");System.out.println(set);// set的sismemberBoolean bool = redisTemplate.opsForSet().isMember("key","111");System.out.println(bool);// set中的scardLong count = redisTemplate.opsForSet().size("key");System.out.println(count);// set中sremcount = redisTemplate.opsForSet().remove("key","111");System.out.println("删除的个数:" + count);set = redisTemplate.opsForSet().members("key");System.out.println(set);return "setOk";}

         访问此链接,输出:

Hash 

    @GetMapping("/testHash")@ResponseBodypublic String testHash() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll(); // 刷新Redis数据return null;});// hash中的hsetredisTemplate.opsForHash().put("key","f1","v1");// hmsetMap<String,String> map = new HashMap<>();map.put("f2","v2");map.put("f3","v3");redisTemplate.opsForHash().putAll("key",map);// hgetString ret = (String) redisTemplate.opsForHash().get("key","f1");System.out.println(ret);// hexistsBoolean exists = redisTemplate.opsForHash().hasKey("key","f1");System.out.println(exists);// hdelLong numsOfDel = redisTemplate.opsForHash().delete("key","f1");System.out.println(numsOfDel);// hlenLong len = redisTemplate.opsForHash().size("key");System.out.println(len);// hkeysSet<Object> set = redisTemplate.opsForHash().keys("key");System.out.println(set);// hvalList<Object> list =  redisTemplate.opsForHash().values("key");System.out.println(list);Map<Object,Object> map1 = redisTemplate.opsForHash().entries("key");System.out.println(map1);return "hashOK";}

 输出:

zset

 

    @GetMapping("/testZset")@ResponseBodypublic String testZset() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll(); // 刷新Redis数据return null;});// zaddredisTemplate.opsForZSet().add("key","zhangsan",10.2);redisTemplate.opsForZSet().add("key","lisi",11.3);redisTemplate.opsForZSet().add("key","wangwu",12.4);// zrangeSet<String> set = redisTemplate.opsForZSet().range("key",0, -1);System.out.println(set);// zrangewithScoresSet<ZSetOperations.TypedTuple<String>> setWithScores = redisTemplate.opsForZSet().rangeWithScores("key",0,-1);System.out.println(setWithScores);// zscoreDouble scoreOfLisi = redisTemplate.opsForZSet().score("key","lisi");System.out.println(scoreOfLisi);// zremredisTemplate.opsForZSet().remove("key","lisi");setWithScores = redisTemplate.opsForZSet().rangeWithScores("key",0,-1);System.out.println(setWithScores);// zrankLong rank = redisTemplate.opsForZSet().rank("key","lisi");System.out.println(rank);rank = redisTemplate.opsForZSet().rank("key","wangwu");System.out.println(rank);return "zsetOK";}

输出:

更多详细内容可以查阅spring官方文档:
Spring BootLevel up your Java code and explore what Spring can do for you.icon-default.png?t=N7T8https://spring.io/projects/spring-boot


http://www.ppmy.cn/news/1350311.html

相关文章

大数据的基础探索之大数据时代

前言&#xff1a;大数据已经是大势所趋&#xff0c;在这个网络时代能够不断地整合资源的人本身也是一种能力拥有者&#xff0c;在这个时代&#xff0c;如果一个人可以掌握数据分析工具&#xff0c;利用好云计算的能力&#xff0c;对于自己的个人而言来说都是一个极其重要的参与…

Day45- 动态规划part13

一、最长递增子序列 题目一&#xff1a;300. 最长递增子序列​​​​​​​ ​​​​​​​300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数…

【微信小程序】微信小程序开发:从入门到精通

微信小程序开发&#xff1a;从入门到精通 一、开发准备二、小程序开发流程1、注册与创建项目2、开发页面3、配置4、调试与预览5、发布与审核 随着移动互联网的普及&#xff0c;微信小程序成为了越来越多企业和个人开发者的首选。小程序是一种无需下载安装即可使用的应用&#x…

MATLAB实现随机森林回归算法

随机森林回归是一种基于集成学习的机器学习算法&#xff0c;它通过组合多个决策树来进行回归任务。随机森林的基本思想是通过构建多个决策树&#xff0c;并将它们的预测结果进行平均或投票来提高模型的准确性和鲁棒性。 以下是随机森林回归的主要特点和步骤&#xff1a; 决策树…

Oracle中怎么设置时区和系统时间

在Oracle数据库中&#xff0c;设置时区和系统时间可以通过多种方法实现。下面是一些常见的方法&#xff1a; 1. 设置数据库的时区 Oracle数据库允许你为每个会话或整个数据库设置时区。 a. 为整个数据库设置时区 你可以使用ALTER DATABASE语句为整个数据库设置时区。例如&a…

JVM相关-JVM模型、垃圾回收、JVM调优

一、JVM模型 JVM内部体型划分 JVM的内部体系结构分为三部分&#xff0c;分别是&#xff1a;类加载器&#xff08;ClassLoader&#xff09;子系统、运行时数据区&#xff08;内存&#xff09;和执行引擎 1、类加载器 概念 每个JVM都有一个类加载器子系统&#xff08;class l…

【手写数据库toadb】数据字典的内容结构,它的生成,避免鸡生蛋蛋生鸡的问题,高频访下的性能应对

411 数据字典的作用 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方…

Centos 7系统安装proftpd-1.3.8过程

一、下载安装&#xff1a; 1、网站中能够下载到profptd源码&#xff1a; http://www.proftpd.org/ 这个是软件源码ftp地址&#xff1a; ftp://ftp.proftpd.org/distrib/source/ 2、进入目录/root/download解压&#xff1a; tar -zxvf proftpd-1.3.8.tar.gz #将源码压缩包解压…

【小沐学GIS】基于WebGL绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

自动驾驶轨迹规划之kinodynamic planning

欢迎大家关注我的B站&#xff1a; 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 本文PPT来自深蓝学院《移动机器人的运动规划》 目录 1.kinodynamic的背景 2. old-school pipline 3.example 1.kinodynamic的背景 kinodynami…

状态模式:灵活管理对象状态的设计策略

状态模式&#xff1a;灵活管理对象状态的设计策略 在软件开发的过程中&#xff0c;我们经常会遇到对象根据其内部状态的改变而改变其行为的场景。传统的处理方式可能会使用大量的条件判断语句来处理不同的状态转换以及相应的行为&#xff0c;这不仅使得代码难以维护&#xff0…

常见的物联网操作系统介绍

物联网&#xff08;Internet of Things&#xff0c;IoT&#xff09;是指将各种物理设备、车辆、家用电器、工业设备等通过网络连接起来&#xff0c;实现数据交换和通信的技术。物联网操作系统是管理这些设备并使其能够相互通信的软件平台。以下是一些常见的物联网操作系统&…

刘知远LLM——神经网络基础

文章目录 神经网络基础基本构成如何训练&#xff1f; Word2Vec例子负采样&#xff1a; 循环神经网络 RNN门控计算单元 GRU长短时记忆网络 LSTM遗忘门输入门输出门双向RNN卷积神经网络 CNNpytorch实战 神经网络基础 基本构成 全称&#xff1a;人工神经网络。启发于生物神经细胞…

一周学会Django5 Python Web开发-Django5操作命令

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

力扣题目训练(8)

2024年2月1日力扣题目训练 2024年2月1日力扣题目训练404. 左叶子之和405. 数字转换为十六进制数409. 最长回文串116. 填充每个节点的下一个右侧节点指针120. 三角形最小路径和60. 排列序列 2024年2月1日力扣题目训练 2024年2月1日第八天编程训练&#xff0c;今天主要是进行一些…

2.10

头文件&#xff1a; #include <sqlite3.h> 编译时候要加上-lsqlite3 gcc a.c -lsqlite3 1&#xff09;sqlite3_open 打开一个数据库&#xff0c;如果数据库不存在&#xff0c;则创建一个数据库 2&#xff09;sqlite3_close 关闭数据库&#xff0c;断开句柄所拥有的资…

牛客周赛 Round 32 F.小红的矩阵修改【三进制状态压缩dp】

原题链接&#xff1a;https://ac.nowcoder.com/acm/contest/75174/F 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 小红拿到了一个字符矩阵&#xff0c;矩阵中仅包含&q…

springboot175图书管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

android 音频调试技巧

常用命令 查看当前声卡信息 cat proc/asound/cards bengal_515:/ # cat /proc/asound/cards0 [bengalidpsndcar]: bengal-idp-snd- - bengal-idp-snd-cardbengal-idp-snd-card1 [Loopback ]: Loopback - LoopbackLoopback 1查看PCM设备列表 cat proc/asound/pcm ben…

MongoDB聚合:$densify

$densify阶段可以为文档序列中字段缺失的某些值创建新文档。其主要的用途有&#xff1a; 补齐时间序列数据。为分组数据添加缺失值。为指定的值范围填充数据。 语法 $densify阶段的语法&#xff1a; {$densify: {field: <fieldName>,partitionByFields: [ <field …
最新文章