在spring中操作Redis

目录

创建项目

​编辑 配置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.hqwc.cn/news/471187.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTF攻防比赛真题详解

0x00 前言 某同学发在群里一道不知道什么ctf的web题 0x01 bypass open_basedir 开始没想那么多&#xff0c;看到了可以执行phpinfo&#xff0c;直接先eval一个一句话上去看看什么情况&#xff1a; 接着发现了没有权限去读取/var/www/html以外的目录&#xff0c;那么我开始想的…

ChatGPT绘图指南:DALL.E3玩法大全(二)

在前一篇文章中&#xff0c;我们介绍了什么是 DALL.E3 模型&#xff0c; DALL.E3 有什么优势&#xff0c;使用DALL.E3 的两种方法&#xff0c;以及DALL.E3 绘图的基本规则&#xff0c; 感兴趣的朋友请前往查看: ChatGPT绘图指南&#xff1a;DALL.E3玩法大全(一). 接下来&#…

Mysql运维篇(四) Xtarbackup--备份与恢复练习

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 前言 xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具&#xff0c;具有…

CSP-201909-1-小明种苹果

CSP-201909-1-小明种苹果 #include <iostream> using namespace std; int main() {long long sumApple 0, maxNum 0, maxAppleNum 0, n, m;cin >> n >> m;for (long long i 0; i < n; i){long long appleNum, delta 0;cin >> appleNum;for (l…

Window+Linux双系统优雅的卸载Linux系统

WindowLinux双系统优雅的卸载Linux系统 那些最好的程序员不是为了得到更高的薪水或者得到公众的仰慕而编程&#xff0c;他们只是觉得这是一件有趣的事情&#xff01; WindowLinux双系统优雅的卸载Linux系统 WindowLinux双系统优雅的卸载Linux系统&#x1f33f;前言&#x1f340…

【二叉树层序遍历】【队列】Leetcode 102 107 199 637 429 515

【二叉树层序遍历】【队列】Leetcode 102 107 199 637 429 515 102. 二叉树的层序遍历解法 用队列实现107. 二叉树的层序遍历 II解法199. 二叉树的右视图 解法637. 二叉树的层平均值 解法429. N叉树的层序遍历515. 在每个树行中找最大值 ---------------&#x1f388;&#x1…

.net和jar包windows服务部署

一.NetCore 1.创建启动脚本run_instal.bat,例如程序文件为ApiDoc.exe set serviceName"Apidoc Web 01" set serviceFilePath%~dp0ApiDoc.exe set serviceDescription"ApiDoc 动态接口服务 web 01"sc create %serviceName% BinPath%serviceFilePath% sc c…

【AIGC】Stable Diffusion的ControlNet插件

ControlNet 介绍 ControlNet 插件是 Stable Diffusion 中的一个重要组件&#xff0c;用于提供对模型的控制和调整。以下是 ControlNet 插件的主要特点和功能&#xff1a; 模型控制&#xff1a; ControlNet 允许用户对 Stable Diffusion 中的模型进行精细的控制和调整。用户可以…

【深度学习每日小知识】交并集 (IoU)

交并集 (IOU) 是一种性能指标&#xff0c;用于评估注释、分割和对象检测算法的准确性。它量化数据集中的预测边界框或分段区域与地面实况边界框或注释区域之间的重叠。 IOU 提供了预测对象与实际对象注释的对齐程度的衡量标准&#xff0c;从而可以评估模型准确性并微调算法以改…

【sgCreateTableColumn】自定义小工具:敏捷开发→自动化生成表格列html代码(表格列生成工具)[基于el-table-column]

源码 <template><!-- 前往https://blog.csdn.net/qq_37860634/article/details/136126479 查看使用说明 --><div :class"$options.name"><div class"sg-head">表格列生成工具</div><div class"sg-container"…

林浩然与杨凌芸的时空约会奇遇记

林浩然与杨凌芸的时空约会奇遇记 The Time-Traveling Love Story of Lin Haoran and Yang Lingyun in the Java World 在那个阳光明媚、Java代码飞舞的日子里&#xff0c;程序员界的“情圣”林浩然和美丽聪明的数据分析师杨凌芸携手演绎了一场跨越时间与空间的爱情故事&#xf…

HGAME2024 WEEK2 wp webmisc

web What the cow say? 进入容器有个输入框&#xff0c;尝试ssti、命令执行、代码执行等&#xff0c;最后发现可使用反引号执行命令&#xff1b; 输入 nl app.py 可查看源代码&#xff0c;有功能具体实现、过滤之类的&#xff1b; flag在 /flag_is_here home/flag_c0w54y 中…