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

Redis(5,jedis和spring)

在前面的学习中,只是学习了各种redis的操作,都是在redis命令行客户端操作的,手动执行的,更多的时候就是使用redis的api(),进一步操作redis程序。

在java中实现的redis客户端有很多,接下来我们将使用jedis,在maven仓库下载jedis。

在depency这里引入依赖。并且需要修改外网ip连接到云服务器并且开启6379端口。

不能开放6379端口因为容易被黑客入侵,所以我们需要配置ssh端口转发,把云服务器的redis端口映射到本地主机。

ssh端口转发的配置

相当于通过ssh的22来传递其他端口的数据,比如本身想要访问6379,我们就构造一个ssh的数据报,就要把访问redis请求放在数据报中,通过比较安全的22端口交给云服务器,服务器的程序就能解析该数据报然后交给6379端口。

但是这时候我们会在本地创建一个端口比如8888,映射6379这个端口,类似于在本地设立一个办事处,我们访问8888也就是访问Linux的6379(访问本地就是访问远程窗口)。

话不多说我们进行一个简单的配置,就可以把本地端口当成远程用。

打开属性,点击添加,在redis中进行如下配置,最后点击连接。

最后在cmd中输入netstat -ano | findstr 8888,查看是否连接好了。

接下来通过我们自己的127.0.0.1:8888就能操作redis了。

通过下列代码连接redis。

JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");

接着再从池子中获取连接,连接用完之后要记得关闭(close),此处的释放是把redis的连接放回池子中。

try(Jedis jedis=jedisPool.getResource()){//接下来的命令就对应到redis的客户端操作了System.out.println(jedis.ping());}

在这里我们之前配置好了redis.conf的配置项。

get和set方法:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.params.SetParams;public class RedisDemo {public static void test(Jedis jedis){jedis.flushAll();jedis.set("key","111");jedis.set("key1","222");SetParams setParams=new SetParams();setParams.ex(10);setParams.nx();jedis.set("key3","333",setParams);String key3 = jedis.get("key3");System.out.println(key3);}public static void main(String[] args) {//连接redis服务器上面,redis连接池。JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");try(Jedis jedis=jedisPool.getResource()){//接下来的命令就对应到redis的客户端操作了/*System.out.println(jedis.ping());*/test(jedis);}}
}

在这个test()方法中,通过set和get方法,创建和使用key,并且我们还可以给key设定setParams,可以设置其超时时间等。

exist和del:

public static void test2(Jedis jedis){jedis.flushAll();jedis.set("key","111");jedis.set("key2","222");boolean result = jedis.exists("key");System.out.println("result ="+result);long delnum = jedis.del("key2");System.out.println(delnum);}public static void main(String[] args) {//连接redis服务器上面,redis连接池。JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");try(Jedis jedis=jedisPool.getResource()){//接下来的命令就对应到redis的客户端操作了/*System.out.println(jedis.ping());*//*test1(jedis);*/test2(jedis);}}

通过test2调用,来获取key数据书否存在,以及删除元素的操作,来删除以及存在的元素,返回的结果是删除的个数。

keys方法:

public static void test3(Jedis jedis){jedis.set("key","111");jedis.set("key1","111");jedis.set("key2","111");jedis.set("key3","111");Set<String> keys = jedis.keys("*");System.out.println(keys);}public static void main(String[] args) {//连接redis服务器上面,redis连接池。JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");try(Jedis jedis=jedisPool.getResource()){//接下来的命令就对应到redis的客户端操作了/*System.out.println(jedis.ping());*//*test1(jedis);*//*test2(jedis);*/test3(jedis);}}

在这里通过接受并且打印set的方式,在控制台打印set,并且这里的key没有顺序。

expire和ttl:

public static void test4(Jedis jedis){jedis.flushAll();jedis.set("key","111");jedis.expire("key",10);try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}long time = jedis.ttl("key");System.out.println(time);}public static void main(String[] args) {//连接redis服务器上面,redis连接池。JedisPool jedisPool=new JedisPool("tcp://127.0.0.1:8888");try(Jedis jedis=jedisPool.getResource()){//接下来的命令就对应到redis的客户端操作了/*System.out.println(jedis.ping());*//*test1(jedis);*//*test2(jedis);*/
//            test3(jedis);test4(jedis);}}

通过expire设置过期时间,以及通过ttl查看过期时间还剩下多少。

type:

public static void test5(Jedis jedis){jedis.flushAll();jedis.set("key","111");String type = jedis.type("key");System.out.println(type);}

通过如上方法打印type的类型到控制台,由于没有过多设置这里默认是String类型。

mset和mget方法:

public static void test(Jedis jedis){jedis.flushAll();jedis.mset("key","000","key1","111","key2","222","key3","333");List<String> list = jedis.mget("key", "key1", "key2");System.out.println(list);}

如果在mgetde过程中查询了一个不存在的key就会出现null的情况。

setrange和getrange方法:

public static void test1(Jedis jedis){jedis.flushAll();jedis.set("key","asdfghjkl");String string = jedis.getrange("key", 2, 5);System.out.println(string);jedis.setrange("key",2,"asasa");String string1 = jedis.get("key");System.out.println(string1);}

getrange获取指定区间的元素,setrange从指定位置开始修改元素。

append:

对key进行字符串拼接。

public static void test2(Jedis jedis){jedis.flushAll();jedis.set("key","111");jedis.append("key","asdfghjkl");String key = jedis.get("key");System.out.println(key);}

incr和decr:

public static void test3(Jedis jedis){jedis.flushAll();jedis.set("key","100");long key = jedis.incr("key");System.out.println(key);long key1 = jedis.decr("key");System.out.println(key1);}

通过incr和decr来对指定的key中的数字加减。

list相关lpush,lrange等操作

public static void test(Jedis jedis){jedis.flushAll();jedis.lpush("key","111","222","333");List<String> list = jedis.lrange("key", 0, -1);System.out.println(list);}

头插法进行对头部插入。 

集合类型(sadd和smembers):

public static void test(Jedis jedis){jedis.flushAll();jedis.sadd("key","111","222","333","444","555");Set<String> set = jedis.smembers("key");System.out.println(set);boolean result = jedis.sismember("key", "111");System.out.println(result);}

哈希类型的使用

public static void test1(Jedis jedis){jedis.flushAll();Map<String,String> field=new HashMap<>();field.put("f1","111");field.put("f2","222");jedis.hset("key",field);String hget = jedis.hget("key", "f1");System.out.println(hget);}

先构造一个哈希类型的field,并且通过jedis来放置field。

Zset有序集合:

public static void test(Jedis jedis){jedis.flushAll();jedis.zadd("key",10,"lisi");Map<String,Double> map=new HashMap<>();map.put("zhangsan",20.0);map.put("lisi",15.0);jedis.zadd("key",map);List<Tuple> key = jedis.zrangeWithScores("key", 0, -1);System.out.println(key);System.out.println(key.get(0).getScore());System.out.println(key.get(0).getElement());}

在spring中配置redis

首先要在yml文件中配置以下配置。

spring:data:redis:port: 8888host: 127.0.0.1

接着在xml文件中导入操作redis的依赖。

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

在controller中注入 StringRedisTemplate,在java中我们是直接使用jedis来操作redis,但是在spring中使用StringRedisTemplate,是专门处理文本数据的。

    @AutowiredStringRedisTemplate stringRedisTemplate;

在StringRedisTemplate中做了进一步的封装,可以得到专门操作某个数据结构的对象,比如获得专门操作哈希的对象。

String(Spring版本)

 通过ops的方法来操作相应的对象。

 @Resourceprivate StringRedisTemplate stringRedisTemplate;@RequestMapping("/test")public String test(){stringRedisTemplate.getConnectionFactory().getConnection().flushAll();stringRedisTemplate.opsForValue().set("key1","111");stringRedisTemplate.opsForValue().set("key2","222");stringRedisTemplate.opsForValue().set("key3","333");String string = stringRedisTemplate.opsForValue().get("key1");System.out.println(string);return "ok";}

执行redis原生命令(excute):

 redis留了一个后手,能让我们随时执行redis原生命令。

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

通过execute方法和lambda表达式来构建connection方法来调用flush方法,就能够做到类似于在控制台上面操作程序。

List(Spring版本)

public String testList(){stringRedisTemplate.execute((RedisConnection connection)->{connection.flushAll();return null;});stringRedisTemplate.opsForList().leftPush("key","111");String string = stringRedisTemplate.opsForList().rightPop("key");System.out.println(string);return "ok";}

Set(Spring版本):

public String testSet(){stringRedisTemplate.execute((RedisConnection connection)->{connection.flushAll();return null;});stringRedisTemplate.opsForSet().add("key","111","222","333");Set<String> key = stringRedisTemplate.opsForSet().members("key");System.out.println(key);Boolean isexist=stringRedisTemplate.opsForSet().isMember("key","111");System.out.println(isexist);return "ok";}

Set操作和前面的List和String操作也很相似。这里我们就快速学习一下。

Hash(Spring版本)

public String testHash(){stringRedisTemplate.execute((RedisConnection connection)->{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);Boolean exist = stringRedisTemplate.opsForHash().hasKey("key", "f1");Long l = stringRedisTemplate.opsForHash().size("key");System.out.println(l);return "ok";}

public String testZSet(){stringRedisTemplate.execute((RedisConnection connection)->{connection.flushAll();return null;});stringRedisTemplate.opsForZSet().add("key","zhangsan",10);stringRedisTemplate.opsForZSet().add("key","lisi",20);stringRedisTemplate.opsForZSet().add("key","wangwu",30);Set<String> key = stringRedisTemplate.opsForZSet().range("key", 0, -1);System.out.println(key);Set<ZSetOperations.TypedTuple<String>> key1 = stringRedisTemplate.opsForZSet().rangeWithScores("key", 0, -1);System.out.println(key1);return "ok";}

相关文章:

Redis(5,jedis和spring)

在前面的学习中&#xff0c;只是学习了各种redis的操作&#xff0c;都是在redis命令行客户端操作的&#xff0c;手动执行的&#xff0c;更多的时候就是使用redis的api&#xff08;&#xff09;&#xff0c;进一步操作redis程序。 在java中实现的redis客户端有很多&#xff0c;…...

Git 小白入门教程

&#x1f3af; 这篇文章详细介绍了版本控制的重要性&#xff0c;特别是通过Git实现的分布式版本控制相对于SVN集中式控制的优势。文章首先解释了版本控制的基本概念&#xff0c;强调了在文档或项目多版本迭代中备份与恢复任意版本的能力。接着&#xff0c;重点阐述了Git的历史背…...

Python从0到100(八十五):神经网络与迁移学习在猫狗分类中的应用

在人工智能的浩瀚宇宙中&#xff0c;深度学习犹如一颗璀璨的星辰&#xff0c;引领着机器学习和计算机视觉领域的前沿探索。而神经网络&#xff0c;作为深度学习的核心架构&#xff0c;更是以其强大的数据建模能力&#xff0c;成为解决复杂问题的重要工具。今天&#xff0c;我们…...

代码随想录刷题day14(2)|(链表篇)02.07. 链表相交(疑点)

目录 一、链表理论基础 二、链表相交求解思路 三、相关算法题目 四、疑点 一、链表理论基础 代码随想录 二、链表相交求解思路 链表相交时&#xff0c;是结点的位置&#xff0c;也就是指针相同&#xff0c;不是结点的数值相同&#xff1b; 思路&#xff1a;定义两个指针…...

C++ 复习总结记录九

C 复习总结记录九 主要内容 1、list 介绍及使用 2、list 剖析及模拟实现 3、list 与 vector 对比 一 list 介绍及使用 List 相关文档 1、List 在任意位置进行插入和删除的序列式容器 O(1) &#xff0c;且该容器可前后双向迭代 2、List 底层是带头双向循环链表&#xff…...

数据库性能优化(sql优化)_SQL执行计划02_yxy

数据库性能优化_SQL执行计划详解02 常用操作符解读1.1 表扫描类型操作符1.1.1 CSCN 聚集索引扫描1.1.2 CSEK 聚集索引数据定位1.1.3 SSEK 二级索引数据定位1.1.4 SSCN 直接使用二级索引进行扫描1.2 其他常见操作符1.2.1 BLKUP 二次扫描1.2.2 SLCT 选择1.2.3 PRJT 投影1.2.4 NSE…...

Vivado生成X1或X4位宽mcs文件并固化到flash

1.生成mcs文件 01.在vivado里的菜单栏选择"tools"工具栏 02.在"tools"里选择"生成内存配置文件" 03.配置参数 按照FPGA板上的flash型号进行选型&#xff0c;相关配置步骤可参考下图。 注意&#xff1a;Flash数据传输位宽如果需要选择X4位宽&am…...

在K8S中使用Values文件定制不同环境下的应用配置详解

在Kubernetes&#xff08;简称K8s&#xff09;环境中&#xff0c;应用程序的配置管理是一项关键任务。为了确保应用程序在不同环境&#xff08;如开发、测试、预发布和生产&#xff09;中都能稳定运行&#xff0c;我们需要为每个环境定制相应的配置。Values文件是在使用Helm管理…...

边缘网关具备哪些功能?

边缘网关&#xff0c;又称边缘计算网关&#xff0c;部署在网络边缘&#xff0c;它位于物联网设备与云计算平台之间&#xff0c;充当着数据流动的“守门员”和“处理器”。通过其强大的数据处理能力和多样化的通信协议支持&#xff0c;边缘网关能够实时分析、过滤和存储来自终端…...

ThinkPHP 8 操作JSON数据

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…...

环境变量配置与问题解决

目录 方法 配置了还是运行不了想要的东西 解决方案 为什么 解决方案 方法 方法一&#xff1a;此电脑右击-属性-相关链接-高级系统设置-环境变量&#xff08;N&#xff09;-系统变量里面找到Path-三个确定】 方法二&#xff1a;winr cmd 黑框输入sysdm.cpl&#xff0c;后面…...

pytorch2.5实例教程

以下是再次为你提供的一个详细的PyTorch使用教程&#xff1a; 一、安装PyTorch 环境准备 确保系统已安装合适版本的Python&#xff08;推荐3.10及以上&#xff09;。 安装方式 CPU版本 对于Linux和macOS&#xff1a; 使用命令 pip install torch torchvision torchaudio。 对…...

【开源免费】基于SpringBoot+Vue.JS智慧图书管理系统(JAVA毕业设计)

本文项目编号 T 152 &#xff0c;文末自助获取源码 \color{red}{T152&#xff0c;文末自助获取源码} T152&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

基于自然语言处理的垃圾短信识别系统

基于自然语言处理的垃圾短信识别系统 &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 设计题目设计目的设计任务描述设计要求输入和输出…...

Node.js HTTP模块详解:创建服务器、响应请求与客户端请求

Node.js HTTP模块详解&#xff1a;创建服务器、响应请求与客户端请求 Node.js 的 http 模块是 Node.js 核心模块之一&#xff0c;它允许你创建 HTTP 服务器和客户端。以下是一些关键知识点和代码示例&#xff1a; 1. 创建 HTTP 服务器 使用 http.createServer() 方法可以创建…...

Day 17 卡玛笔记

这是基于代码随想录的每日打卡 654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组…...

深圳大学-智能网络与计算-实验一:RFID原理与读写操作

实验目的与要求 掌握超高频RFID标签的寻卡操作。掌握超高频RFID标签的读写操作。掌握超高频RFID标签多张卡读取时的防冲突机制。 方法&#xff0c;步骤 软硬件的连接与设置超高频RFID寻卡操作超高频RFID防冲突机制超高频RFID读写卡操作 实验过程及内容 一&#xff0e;软硬…...

⚡C++ 中 std::transform 函数深度解析:解锁容器元素转换的奥秘⚡【AI 润色】

在 C 编程的世界里&#xff0c;我们常常需要对容器中的元素进行各种转换操作。无论是将数据进行格式调整&#xff0c;还是对元素进行数学运算&#xff0c;高效的转换方法都是提升代码质量和效率的关键。std&#xff1a;&#xff1a;transform函数作为 C 标准库<algorithm &g…...

【miniconda】:langraph的windows构建

langraph需要python3.11 langraph强烈建议使用py3.11 默认是3.12 官方 下载仓库 下载老版本的python (后续发现新版miniconda也能安装老版本的python) 在这里...

(k8s)k8s部署mysql与redis(无坑版)

0.准备工作 在开始之前&#xff0c;要确保我们的节点已经加入网络并且已经准备好&#xff0c;如果没有可以去看我前面发表的踩坑与解决的文章&#xff0c;希望能够帮到你。 1.k8s部署redis 1.1目标 由于我们的服务器资源较小&#xff0c;所以决定只部署一个redis副本&#x…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...