在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.mzph.cn/news/684814.shtml

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

相关文章

C++多重继承

C多重继承 C中的多重继承是指一个类可以从多于一个的基类派生出来&#xff0c;这允许在一个派生类中继承多个基类的特性和行为。多重继承增加了C的灵活性和表达能力&#xff0c;但同时也带来了一些复杂性&#xff0c;如菱形继承问题和潜在的命名冲突。 基本用法 定义一个多重…

C++中类的6个默认成员函数 【拷贝构造函数】

文章目录 拷贝构造函数的使用拷贝构造对于自定义类型【浅拷贝】深拷贝拷贝构造函数典型调用场景 拷贝构造函数的使用 在前几章学习对象的时候&#xff0c;我们有的时候需要一个与已存在对象一某一样的新对象 那在创建对象时&#xff0c;可否创建一个与已存在对象一某一样的新对…

(02)Hive SQL编译成MapReduce任务的过程

目录 一、架构及组件介绍 1.1 Hive底层架构 1.2 Hive组件 1.3 Hive与Hadoop交互过程 二、Hive SQL 编译成MR任务的流程 2.1 HQL转换为MR源码整体流程介绍 2.2 程序入口—CliDriver 2.3 HQL编译成MR任务的详细过程—Driver 2.3.1 将HQL语句转换成AST抽象语法树 词法、语…

C# CAD SelectionFilter下TypedValue数组

SelectionFilter是用于过滤AutoCAD实体的类&#xff0c;在AutoCAD中&#xff0c;可以使用它来选择具有特定属性的实体。构造SelectionFilter对象时&#xff0c;需要传入一个TypedValue数组&#xff0c;它用于定义选择规则。 在TypedValue数组中&#xff0c;每个元素表示一个选…

VScode中配置 C/C++ 环境 | IT拯救者

文章目录 0 引言1. 下载编辑器VScode2. 下载编译器MinGW并解压3. 将MinGW添加至环境变量4. 配置VScode插件5. 运行代码6. 调整和优化7. 提示8. 例行格式条款9. 例行格式条款 0 引言 由于VScode毛毛张使用不习惯&#xff0c;因此配置教程记不住&#xff0c;不过毛毛张看到一篇不…

「递归算法」:两两交换链表中的节点

一、题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xf…

计算机二级数据库之数据模型(三层相关的结构)

数据模型 模型的概念 模型的介绍模型是对现实世界特征的模拟和抽象&#xff0c; 数据模型的概念&#xff1a; 数据模型是对现实世界中数据特征的抽象&#xff0c;描述的是数据的共性。 数据模型是用来在数据库中抽象、表示和处理现实世界中的数据和信凹。 其相关的共同特…

论文阅读:《Deep Learning-Based Human Pose Estimation: A Survey》——Part 1:2D HPE

目录 人体姿态识别概述 论文框架 HPE分类 人体建模模型 二维单人姿态估计 回归方法 目前发展 优化 基于热图的方法 基于CNN的几个网络 利用身体结构信息提供构建HPE网络 视频序列中的人体姿态估计 2D多人姿态识别 方法 自上而下 自下而上 2D HPE 总结 数据集…

Python二级考试笔记

Python二级考试笔记【源源老师】 01. 字符串 1. 常规功能合集 字符串本身有一些功能&#xff0c;有些之前运用过&#xff0c;这里总结如下&#xff1a; # 功能一&#xff1a;判断字符串类型 print(type("Hello")) print(str(123)) # 转换# 功能二&#xff1a;连…

相机图像质量研究(27)常见问题总结:补光灯以及遮光罩对成像的影响--遮光罩

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

[AIGC] 消息积压了,该如何处理?

在构建分布式系统时&#xff0c;开发人员经常会遇到消息积压的问题。当系统的处理能力不足时&#xff0c;消息会在队列中积压&#xff0c;导致系统 slowed down 或 even crashed。为了解决这个问题&#xff0c;我们需要采取一些措施来缓解消息积压。 文章目录 什么是消息积压&…

MyBatis篇----第七篇

系列文章目录 文章目录 系列文章目录前言一、简述 Mybatis 的插件运行原理,以及如何编写一个插件。二、MyBatis实现一对一有几种方式?具体怎么操作的 ?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男…

GoJS可视化JavaScript库讲解

1.简介 GoJS是一个可视化JavaScript库&#xff0c;用于浏览器中创建交互图形&#xff0c;&#xff08;比如流程图&#xff0c;树图&#xff0c;关系图&#xff0c;力导图等等&#xff09;。允许您为用户构建各种图表&#xff0c;从简单的流程图、组织图到图表、SCADA和BPMN图表…

windows 下跑起大模型(llama)操作笔记

原贴地址&#xff1a;https://testerhome.com/topics/39091 前言 国内访问 chatgpt 太麻烦了&#xff0c;还是本地自己搭一个比较快&#xff0c;也方便后续修改微调啥的。 之前 llama 刚出来的时候在 mac 上试了下&#xff0c;也在 windows 上用 conda 折腾过&#xff0c;环…

Docker 镜像是什么?常用的镜像命令有哪些?

docker 镜像仓库相关的命令&#xff1a;Docker 镜像仓库是什么&#xff1f;有哪些镜像仓库命令&#xff1f;-CSDN博客 1. Docker 镜像 Docker 镜像是一个轻量级、独立、可执行的软件包&#xff0c;它包含了运行特定应用程序所需的所有内容&#xff1a;代码、运行时环境、系统工…

OpenAI宣布ChatGPT新增记忆功能;谷歌AI助理Gemini应用登陆多地区

&#x1f989; AI新闻 &#x1f680; OpenAI宣布ChatGPT新增记忆功能&#xff0c;可以自由控制内存&#xff0c;提供个性化聊天和长期追踪服务 摘要&#xff1a;ChatGPT新增的记忆功能可以帮助AI模型记住用户的提问内容&#xff0c;并且可以自由控制其内存。这意味着用户不必…

算法详解(力扣141——环形链表系列)

博主ID&#xff1a;代码小豪 文章目录 环形链表环形链表的性质分析快慢指针法指针的追及相遇问题 环形链表&#xff08;2&#xff09; 环形链表 先来看看环形链表的原题&#xff1a; 中间的部分叙述有点繁杂&#xff0c;简单来概括就是&#xff0c;假如有一个节点&#xff0c…

关于内存相关的梳理

1 关键字 总结 &#xff08;lowmemory&#xff0c;anr in&#xff09; 2 知识储备 虚拟机原理 垃圾回收算法 又包含标记 和清除两种算法 标记&#xff1a;程序计数器-已过时&#xff0c;可达性分析 具体可见 http://help.eclipse.org/luna/index.jsp?topic%2Forg.ec…

vue的网络请求以及封装

①先备好springboot的接口 ②安装依赖 在vue中安装网络请求工具的依赖&#xff1a; npm i axios③简单的demo 直接通过axios请求尝试一下&#xff1a; <script> import axios from "axios";export default {name: HomeView,data() {return {users:[]}}, …

【论文精读】EfficientNet

摘要 以往的卷积网络模型通过缩放深度&#xff0c;宽度和图像大小的其中之一或之二来扩大网络以实现更好的结果&#xff0c;但这种思想下经常产生次优的精度和效率的算法。 本文认为通过同时平衡网络宽度、深度、分辨率的缩放倍数来扩大卷积网络&#xff0c;可以达到更好的精度…