三分钟学会一个新技能——使用Java操作Redis

目录

1、前置准备操作

1.1、为什么要进行前置准备操作 

1.2、本地如何访问到云服务上Redis的6379端口号

1.3、配置步骤:

2、配置后本地主机如何操作 

3、常用命令举例

3.1、通用命令举例

3.2、string相关命令举例

3.3、hash相关命令举例

3.4、list相关命令举例

3.5、set相关命令举例

3.6、zset相关命令举例


1、前置准备操作

1.1、为什么要进行前置准备操作 

        我们之前学习Redis命令时,直接在Linux服务器中所提供的redis客户端上使用的,也就是说Redis服务器和客户端在同一台主机上。而现在我们使用Java去操作Redis,一般Java开发都是在Windows上,也就是在自己的电脑上的,就会导致一个问题,客户端和服务器不在同一台主机上。        

        对于这种问题:

  • 第一,我们连接Redis服务器时要修改为外网IP
  • 第二,Redis的默认端口是6379,这个端口是默认会被云服务器的防火墙保护起来,不能从外部进行访问。这里又会导致一个问题,我们自己也访问不了了~

这种情况下,切记可不敢去云服务器上把这个端口开放哈!!!

因为太容易被攻击了~

这个情况,我们有两个解决办法~

1.2、本地如何访问到云服务上Redis的6379端口号

方案一:

        就使用6379端口,但不能在本地运行,将Java程序编写成功后,打成jar部署到云服务器上来运行。这种方法,就会有些复杂,需要我们频繁地打包-部署,太麻烦了~

方案二:【推荐】

        使用SSH来解决——配置SSH端口转发,把云服务器的Redis端口,映射到本地主机~

        例如,我们配置的本地主机端口号:6666 

        当本地主机访问6666端口时【SSH程序是一直在监听6666这个端口,SSH默认端口号是22】,会通过ssh的22端口来将6666的端口数据发送到云服务上,配置时也会让你选组云服务器的端口号,正常情况下,你就选择redis的默认端口6379即可。ssh就会将本地主机端口号6666数据转发到云服务器上的端口号6379的程序~

1.3、配置步骤:

我这里是使用xshell举例:

在此之前,进入Redis自带的客户端,在配置中,修改Redis的绑定的ip和关闭保护模式,具体操作可看我以前的博客:http://t.csdn.cn/OdKZJ

(1):连接回话后,点击属性选项

(2):

(3):

(4):检查是否连接:

看到这句话即可~


2、配置后本地主机如何操作 

第一步:新建一个Maven项目

第二步:去中央仓库搜索jedis,选择【例如我选择的是jedis4.4.2,选稳定的版本~】:

    <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.4.2</version></dependency>

把这段代码放入到pom.xml中~

第三步:新建一个Java文件:

贴上代码:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-09-14* Time:14:28*/
public class redisPing {public static void main(String[] args) {JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:6666");try(Jedis jedis = jedisPool.getResource()) {testPint(jedis);}}private static void testPint(Jedis jedis) {String result = jedis.ping();System.out.println("result:" + result);}
}

 代码解释:

  • jedispool就类似于与线程池,它属于redis的一个连接池,后面的参数,我们能看到是tcp,也就是我们建立的是tcp连接,后面的6666就是我们刚才指定的端口~
  • try后面的括号中,则是从redis连接池中取出一个连接来使用
  • 连接使用完成后需要释放这个连接,但这里的释放并不是说要断开tcp,而是将其放回到池子中~
  • try花括号中便可以开始操作Redis了~
  • 下面这个方法,则是redis中的命令ping,输入ping,返回pong
  • 执行程序,查看结果:

        补充说明:为什么是使用jedis,使用其他工具当然也可以,但jedis中提供的命令几乎和redis的原生命令一样,降低了学习成本~ 


3、常用命令举例

        没有Redis基础的小伙伴可以看看我之前的博客,稍微了解一下Redis中常用的数据类型的常用的命令~ 更有助于后的学习~ 

3.1、通用命令举例

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;import java.util.Set;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-09-14* Time:14:18*/
public class redisCommonDemo {public static void main(String[] args) throws InterruptedException {JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:6666");try(Jedis jedis = jedisPool.getResource()) {System.out.println("set/get举例:");commonDemo1(jedis);System.out.println("exists举例:");commonDemo2(jedis);System.out.println("del举例:");commondemo3(jedis);System.out.println("keys举例:");commondemo4(jedis);System.out.println("expire/ttl举例:");commondemo5(jedis);System.out.println("type举例:");commondemo6(jedis);}}private static void commondemo6(Jedis jedis) {jedis.flushAll();jedis.set("key1","1");String res = jedis.type("key1");System.out.println("key1的类型:" + res);res = jedis.objectEncoding("key1");System.out.println("key1的内部编码:" + res);}private static void commondemo5(Jedis jedis) throws InterruptedException {jedis.flushAll();jedis.set("key1","1");jedis.expire("key1",100);Thread.sleep(1000);Long res = jedis.ttl("key1");System.out.println("剩余时长:" + res);}private static void commondemo4(Jedis jedis) {jedis.flushAll();//删除,避免干扰jedis.mset("key1","1","key2","2","key3","3");Set<String> res = jedis.keys("*");System.out.println(res);}private static void commondemo3(Jedis jedis) {Long res = jedis.del("key1");System.out.println("成功删除key的个数:" + res);Boolean result = jedis.exists("key1");System.out.println("key1已经不存在了:" +result);}private static void commonDemo2(Jedis jedis) {Boolean res = jedis.exists("key1");System.out.println("res存在:" + res);res = jedis.exists("key10000");System.out.println("res不存在:"+ res);}private static void commonDemo1(Jedis jedis) {//先清空,避免干扰//jedis.flushAll();String result = jedis.set("key1","111");System.out.println("result:" + result);String res = jedis.get("key1");System.out.println("key1-value:"+res);}
}

小技巧,你不知返回值有什么来接收时,将鼠标放在函数上:

结果:

3.2、string相关命令举例

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;import java.util.List;
import java.util.Set;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-09-14* Time:15:36*/
public class redisStringDemo {public static void main(String[] args) {JedisPool jedispool = new JedisPool("tcp://127.0.0.1:6666");try(Jedis jedis = jedispool.getResource()) {System.out.println("get/set举例");stringDemo1(jedis);System.out.println("mget/mset举例:");stringDemo2(jedis);System.out.println("getrange/setrange");stringdemo3(jedis);System.out.println("append举例:");stringDemo4(jedis);System.out.println("incr举例:");stringDemo5(jedis);}}private static void stringDemo5(Jedis jedis) {Long res = jedis.incr("key2");System.out.println("key2自增后:" + res);}private static void stringDemo4(Jedis jedis) {Long result = jedis.append("key1","xxxxx");System.out.println("append的返回值" + result);String res = jedis.getrange("key1",0,-1);System.out.println("key1:" + res);}private static void stringdemo3(Jedis jedis) {//先不删除,使用上一个方法遗留的key1 2 3//jedis.flushAll();String res = jedis.getrange("key1",0,-1);System.out.println("keys:" + res);Long result = jedis.setrange("key1",1,"hhhhhh");System.out.println("setrange的返回值:" + result);res = jedis.getrange("key1",0,-1);System.out.println("keys:" + res);}private static void stringDemo2(Jedis jedis) {jedis.flushAll();String res = jedis.mset("key1","1","key2","2","key3","3");System.out.println("新增是否成功:" + res);//取出当中key,检查对应值是否正确List<String> result = jedis.mget("key1","key2","key3","key4");System.out.println("result" + result);}private static void stringDemo1(Jedis jedis) {//先清空,避免干扰jedis.flushAll();String result = jedis.set("key1","111");System.out.println("result:" + result);String res = jedis.get("key1");System.out.println("key1-value:"+res);}
}

结果:

3.3、hash相关命令举例

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-09-14* Time:15:57*/
public class redisHashDemo {public static void main(String[] args) {JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:6666");try(Jedis jedis = jedisPool.getResource()) {System.out.println("hset/hget举例:");hashDemo1(jedis);System.out.println("hexists举例:");hashDemo2(jedis);System.out.println("hdel举例:");hashDemo3(jedis);System.out.println("hkeys/hvals");hashDemo4(jedis);}}private static void hashDemo4(Jedis jedis) {jedis.flushAll();jedis.hset("key1","f1","111");jedis.hset("key1","f2","222");jedis.hset("key2","f1","333");Set<String> res = jedis.hkeys("key1");System.out.println("hkeys的返回值:" + res);List<String> list = jedis.hvals("key1");System.out.println("hvals的返回值:" + list);}private static void hashDemo3(Jedis jedis) {Long res = jedis.hdel("key1","f1");System.out.println("hdel的返回值:" + res);}private static void hashDemo2(Jedis jedis) {Boolean res = jedis.hexists("key1","f1");System.out.println("key1的f1存在:" + res);}private static void hashDemo1(Jedis jedis) {jedis.flushAll();Long res = jedis.hset("key1","f1","111");System.out.println("hset的返回值:" + res);String result = jedis.hget("key1","f1");System.out.println("key1的f1对应的value值:" + result);}
}

结果:

3.4、list相关命令举例

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import sun.rmi.runtime.Log;import java.util.List;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-09-14* Time:16:26*/
public class rediListDemo {public static void main(String[] args) {JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:6666");try(Jedis jedis = jedisPool.getResource()) {System.out.println("lpsuh/rpush举例:");listDemo1(jedis);System.out.println("lrange举例:");listDemo2(jedis);System.out.println("rpop/lpop举例:");listDemo3(jedis);System.out.println("blpop/brpop举例:");listDemo4(jedis);System.out.println("llen举例:");listDemo5(jedis);}}private static void listDemo5(Jedis jedis) {Long res = jedis.llen("key1");System.out.println("key1此时的长度:" + res);}private static void listDemo4(Jedis jedis) {//这里具体使用可以看我以前的文章,这里不详细阐述List<String> res = jedis.blpop(1000,"key1","key2");System.out.println("key左:" + res);res = jedis.brpop(1000,"key1","key2");System.out.println("key右:" + res);}private static void listDemo3(Jedis jedis) {//继续使用第一个方法的残留String res = jedis.lpop("key1");System.out.println("key1左侧弹出:" + res);res = jedis.rpop("key1");System.out.println("key2右侧弹出:" + res);}private static void listDemo2(Jedis jedis) {//使用上一个方法中新增的list//1 2 3 4是lpush,5 6 7 是rpush 因此列表的顺序为:4 3 2 1 5 6 7List<String> res = jedis.lrange("key1",0,-1);System.out.println("key1:" + res);}private static void listDemo1(Jedis jedis) {//  清理数据jedis.flushAll();Long res = jedis.lpush("key1","1","2","3","4");System.out.println("lpush的返回值:" + res);res = jedis.rpush("key1","5","6","7");System.out.println("rpush的返回值:" + res);}
}

结果:

3.5、set相关命令举例

import com.sun.org.apache.xpath.internal.operations.Bool;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;import java.util.Set;
import java.util.Stack;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-09-14* Time:22:18*/
public class redisSetDemo {public static void main(String[] args) {JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:6666");try(Jedis jedis = jedisPool.getResource()) {System.out.println("sadd/smembers举例");setDemo1(jedis);System.out.println("sismember举例:");setDemo2(jedis);System.out.println("scard举例:");setDemo3(jedis);System.out.println("spop举例:");setDemo4(jedis);System.out.println("sinter/sinterstore举例:");setDemo5(jedis);}}private static void setDemo5(Jedis jedis) {//取交集//清理数据jedis.flushAll();jedis.sadd("key1","1","2","3");jedis.sadd("key2","1","2","4");Set<String> res = jedis.sinter("key1","key2");System.out.println("交集:" + res);jedis.sinterstore("key","key1","key2");res = jedis.smembers("key");System.out.println("交集"+ res);}private static void setDemo4(Jedis jedis) {//随机删除一个值String res = jedis.spop("key1");System.out.println("key1中删除:" + res);}private static void setDemo3(Jedis jedis) {//获取长度Long res = jedis.scard("key1");System.out.println("key1长度:" + res);}private static void setDemo2(Jedis jedis) {Boolean res = jedis.sismember("key1","2");System.out.println("key1中存在2:" + res);res = jedis.sismember("key1","100");System.out.println("key1中存在100:" + res);}private static void setDemo1(Jedis jedis) {//清除数据jedis.flushAll();Long res = jedis.sadd("key1","1","2","3","4");System.out.println("sadd的返回值:" + res);Set<String> result = jedis.smembers("key1");System.out.println("key1:" + result);}
}

结果:

3.6、zset相关命令举例

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** Created with IntelliJ IDEA.* Description:* User:龙宝* Date:2023-09-14* Time:22:42*/
public class redisZsetDemo {public static void main(String[] args) {JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:6666");try(Jedis jedis = jedisPool.getResource()) {System.out.println("zadd/zrange举例:");zsetDemo1(jedis);System.out.println("zcard举例:");zsetDemo2(jedis);System.out.println("zrem举例:");zsetDemo3(jedis);System.out.println("zscore举例:");zsetDemo4(jedis);System.out.println("zrank举例:");zsetDemo5(jedis);}}private static void zsetDemo5(Jedis jedis) {//zrank:jedis.flushAll();Map<String,Double> map = new HashMap<>();map.put("zhangsan",100.0);map.put("lisi",95.0);map.put("wangwu",90.0);Long res = jedis.zadd("key1",map);Long result = jedis.zrank("key1","lisi");System.out.println("key1中lisi的排名:" + result);}private static void zsetDemo4(Jedis jedis) {//zscore:Double res = jedis.zscore("key1","lisi");System.out.println("key1的lisi的分数:" + res);}private static void zsetDemo3(Jedis jedis) {//zrem:Long res = jedis.zrem("key1","zhangsan");System.out.println("key1删除成功?" + res);}private static void zsetDemo2(Jedis jedis) {//zcard:Long res = jedis.zcard("key1");System.out.println("key1长度:" + res);}private static void zsetDemo1(Jedis jedis) {//清理数据jedis.flushAll();Map<String,Double> map = new HashMap<>();map.put("zhangsan",100.0);map.put("lisi",95.0);Long res = jedis.zadd("key1",map);System.out.println("zadd的返回值:" + res);List<String> list = jedis.zrange("key1",0,-1);System.out.println("key1:" + list);}
}

结果:

先介绍这些啦,下期见~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/78689.shtml

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

相关文章

80. 删除有序数组中的重复项 II

Powered by:NEFU AB-IN Link 文章目录 80. 删除有序数组中的重复项 II题意思路代码 80. 删除有序数组中的重复项 II 题意 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长…

道可云元宇宙每日资讯|第二届世界元宇宙大会将在嘉定安亭举行

道可云元宇宙每日简报&#xff08;2023年9月6日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 第二届世界元宇宙大会将于9月20日在嘉定安亭举行 元起嘉定&#xff0c;虚实相生&#xff0c;产业赋能。由中国仿真学会、中国指挥与控制学会和北京理工大学共同主办&a…

配置Vite获取内网IP(Vue3项目​ts版本获取本机局域网IP地址)

参考文章&#xff1a;vue项目获取本机局域网IP地址&#xff08;vue.config.js版本) 在Vite中&#xff0c;没有vue.config.js文件&#xff0c;而是使用vite.config.js&#xff08;或vite.config.ts&#xff0c;如果项目使用TypeScript&#xff09;来配置项目&#xff1b; 1.获…

【修复】centos定时任务python top不能输出

问题 用python监控进程占用硬件资源时&#xff0c;手动执行正常运行&#xff0c;定时任务执行出错 在centos的定时任务中&#xff0c;用python的os模块执行top命令时终端没有输出 cmd top -d 1 -n 1 -p {} | grep -E "PID|{}|%Cpu|buff/cache" .format(process_id…

JavaScript中var,let,const 的区别

JavaScript中var&#xff0c;let&#xff0c;const 的区别 一、前言二、使用var声明变量1、var 声明的变量是函数作用域2、var声明的变量会有变量提升3、全局作用域中声明的变量会被挂载到全局对象的window中4、同一作用域下&#xff0c;可以重复声明相同的变量名 三、使用let声…

Unity下如何实现RTMP或RTSP播放端录像?

好多开发者问我们&#xff0c;Unity环境下&#xff0c;除了RTSP或RTMP的播放&#xff0c;如果有录像诉求&#xff0c;怎么实现&#xff1f;实际上录像相对播放来说&#xff0c;更简单一些&#xff0c;因为不涉及到绘制&#xff0c;只要拉流下来数据&#xff0c;直接写mp4文件就…

云原生Kubernetes:pod资源管理与配置

目录 一、理论 1.pod 2.pod容器分类 3.镜像拉取策略 4.pod 的重启策略 二、实验 1.Pod容器的分类 2.镜像拉取策略 三、问题 1.apiVersion 报错 2.pod v1版本资源未注册 3.格式错误 4.取行显示指定pod信息 四、总结 一、理论 1.pod (1) 概念 Pod是kubernetes中…

【LeetCode-中等题】78. 子集

文章目录 组合并集问题汇总&#xff1a;题目方法一&#xff1a;动态规划方法二&#xff1a;递归加回溯(关键----startIndex) 组合并集问题汇总&#xff1a; 1、子集去重版本 2、组合非去重版本 3、组合去重版本 题目 注意&#xff1a;这里的nums数组里面的元素是各不相同的&a…

(文末赠书)我为什么推荐应该人手一本《人月神话》

能点进来的朋友&#xff0c;说明你肯定是计算机工作的朋友或者对这本书正在仔细琢磨着的朋友。 文章目录 1、人人都会编程的时代&#xff0c;我们如何留存?2、小故事说明项目管理着为什么必看这本书3、如何评价《人月神话&#xff1a;纪念典藏版》4、本书的目录&#xff08;好…

【操作系统】进程的通信IPC

进程通信是指进程之间的信息交换。 低级通信方式&#xff1a;PV操作 高级通信方式&#xff1a;1.共享存储2.消息传递3.管道通信 共享存储 低级数据结构共享&#xff0c;高级存储区共享。 对共享空间进行读写操作时&#xff0c;需要用到互斥工具。 消息传递 利用发送消息和…

如何选择安全稳定的大文件传输软件平台,企业传输必看

在当今的信息时代&#xff0c;大文件传输是企业间合作、项目交付、数据备份等场景中不可或缺的需求。然而&#xff0c;大文件传输也面临着诸多挑战&#xff0c;比如速度慢、不稳定、不安全等&#xff0c;给企业带来了不少困扰和风险。那么&#xff0c;如何选择一款安全稳定的大…

自然语言处理应用(一):情感分析

情感分析 随着在线社交媒体和评论平台的快速发展&#xff0c;大量评论的数据被记录下来。这些数据具有支持决策过程的巨大潜力。 情感分析&#xff08;sentiment analysis&#xff09;研究人们在文本中 &#xff08;如产品评论、博客评论和论坛讨论等&#xff09;“隐藏”的情…

echarts静态饼图

<div class"cake"><div id"cakeChart"></div></div> import * as echarts from "echarts";mounted() {this.$nextTick(() > {this.getCakeEcharts()})},methods: {// 饼状图getCakeEcharts() {let cakeChart echart…

『力扣每日一题07』字符串最后一个单词的长度

气死我啦&#xff0c;今天这道题花了快一个小时&#xff0c;我学完了答案的解法&#xff0c;放上去在线 OJ &#xff0c;一直报错&#xff0c;找来找去都找不到自己错在哪&#xff0c;明明跟答案一模一样。后来还是学了另一种解法&#xff0c;才跑出来的(̥̥̥̥̥̥̥̥o̥̥…

UE5 Foliage地形植被实例删不掉选不中问题

目前问题测试发生在5.2.1上 地形上先填充后刷的植被删不掉 首先这个就是bug&#xff0c;大概看到说是5.3上能解决了&#xff0c;对此我只能吐槽ue5上地形植被bug太多了 什么nanite还能产生bug&#xff0c;不过这次又不是&#xff0c;整个删掉instance可以删除所有植被&#…

【踩坑纪实】URL 特殊字符 400 异常

URL 特殊字符 400 异常 笔者之前在写后端或者前端时&#xff0c;在处理表单时&#xff0c;经常有对特殊字符的检验处理&#xff0c;但自己也不清楚为什么要这么做&#xff0c;浅浅地以为可能是特殊字符不好看或者存取可能会造成异常&#xff1f;不过一直没遇到过问题&#xff…

uniapp微信小程序《隐私保护协议》弹窗处理流程

背景 《关于小程序隐私保护指引设置的公告》 《小程序隐私协议开发指南》 流程 1.第一步 必须设置且审核通过&#xff01;&#xff01;&#xff01; 2.第二步 uniapp在manifest.json中添加&#xff01;&#xff01;&#xff01; /* 在 2023年9月15号之前&#xff0c;在 ap…

玩转Mysql系列 - 第14篇:详解事务

环境&#xff1a;mysql5.7.25&#xff0c;cmd命令中进行演示。 开发过程中&#xff0c;会经常用到数据库事务&#xff0c;所以本章非常重要。 本篇内容 什么是事务&#xff0c;它有什么用&#xff1f; 事务的几个特性 事务常见操作指令详解 事务的隔离级别详解 脏读、不可…

Dockerfile 制作常用命令总结

1.FROM( from ) : FROM : from 表示选择一个镜像作为基础镜像&#xff08;在一个Dockerfile 中可以使用多条from&#xff0c;来构建多个镜像&#xff09; 2.ENV &#xff1a; 用来在镜像创建出的容器中声明环境变量&#xff0c;如&#xff1a; ENV PYTHONIOENCODINGutf-8 …

Leetcode算法入门与数组丨3. 数组基础

文章目录 前言1 数组简介2 数组的基本操作2.1 访问元素2.2 查找元素2.3 插入元素2.4 改变元素2.5 删除元素 3 总结task03task04 前言 Datawhale组队学习丨9月Leetcode算法入门与数组丨打卡笔记 这篇博客是一个 入门型 的文章&#xff0c;主要是自己学习的一个记录。 内容会参…