Redis客户端-引入jedis

news2024/11/26 21:26:24

ssh端口转发

Redis服务器在官网公开了使用的协议(RESP),此时任何一个第三方都可以通过上述协议,来实现出一个和redis服务器通信的客户端程序.

现在,已经有很多库可以让我们直接调用,就不必关注redis协议的细节了.

在java的生态中,封装了RESP协议,实现的redis客户端有很多,我们此处使用的是jedis,jedis中提供的api和redis命令是高度一致的.

jedis也可以通过maven仓库来引入我们的maven项目.

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

引入好了之后,下一个问题就是如何使我们的windows电脑上的redis客户端能够访问到linux云服务器上的redis服务器.

此时只知道云服务器的外网IP是不够的,我们知道我们的redis服务器是绑定在云服务器的6379端口上的,而此端口默认是被云服务器的防火墙保护起来的.此时这个端口是不能被外界访问的,防火墙一旦保护,不仅黑客访问不了,我们自己跨主机通过外网也是访问不了.

那么,如果在云服务器后台,将6379端口对应的防火墙打开,就可以访问了.

但是我们不可以这么做,非常危险!!!Redis的端口一旦公开到外网上,就特别容易被入侵.

虽然我们的tomcat的8080端口也开放了,但是tomcat的安全系数是比较高的,而redis的安全系数比较低,更加容易被入侵.

那么现在,我们不能开放redis的端口,同时还要能够让自己通过外网访问redis服务器,如何做?

配置ssh端口转发,把云服务器的redis端口,映射到本地主机的端口.

ssh也是一个协议,也是一个运行程序,默认是在云服务器的22端口,ssh的功能非常强大,其中很重要的功能就是能够支持端口的转发.相当于通过ssh的22端口来传递其他端口的数据.

我们要访问linux云服务器上的6379端口,此时就可以通过ssh进行端口的映射,把服务器的6379映射到本地的端口比如8888端口.

现在我们需要通过windows主机,访问云服务器的6379端口,我们就可以构造一个特殊的ssh数据包,就要把访问redis的请求,放到ssh数据报里.

这个数据就会通过22端口发送给服务器,服务器的ssh服务器程序就会解析出上述的数据包,然后把数据交给6379端口的程序.

一个linux主机上,存在的服务器有很多,ssh也可能需要给多个端口来传递数据,这个时候为了区分不同的端口,往往会把服务器的端口在本地用另外一个端口来进行表示.

只需要简单的配置,后续就把云服务器的端口当成一个本地的端口使用即可.

ssh端口转发也叫ssh端口映射也叫做ssh隧道.

当ssh连接上了之后,端口转发才生效,把ssh连接断开了,端口转发就失效了.连接完整之后,使用netstat命令查看本地的8888端口是否启动了.

当配置了端口转发后,一定要断开之前的连接,重新连接才生效.

此时我们的java代码中,通过127.0.0.1:8888就能操作到云服务器的redis了,同时外面的客户端,是无法直接访问云服务器的6379的.

这里我们的程序能跑通,除了配置ssh端口转发之后,还有一个要点,就是我们在最开始安装redis服务器的时候,在配置文件里修改了ip为0.0.0.0以及关闭了保护模式.

默认绑定的ip为127.0.0.1,此时只能本机的客户端访问本机的redis服务器,不能跨主机访问.

默认的保护模式是开启,跨主机也是不能访问的.

这样就又起到了保护作用,也能够让我们访问!!!


jedis下的命令

建立一个redis连接池,从池子中取出一个redis连接.

连接用完之后要记得关闭(close),此处的关闭,不一定是真的关闭tcp连接,而是将连接放回到了池子里.

通过jedis对象就能执行各种各样的方法(命令),jedis对象的方法命名是和redis中的命令高度一致的,所以我们掌握了redis中的命令,在这里使用起来也是非常容易的.

演示一些命令

public static void main(String[] args) {
    JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");
    try(Jedis jedis = jedisPool.getResource()){
        //redis的各种命令就都对应到jedis对象的各种方法
        //test1(jedis);
        //test2(jedis);
        test3(jedis);
    }
}

public static void test1(Jedis jedis){
    System.out.println("get和set");
    //先清空数据库,避免上一组测试的残留数据影响到下一组测试的结果
    jedis.flushAll();
    jedis.set("key1","111");
    jedis.set("key2","222");
    //表示一个set命令的选项部分
    SetParams setParams = new SetParams();
    setParams.ex(10);
    setParams.nx();//不存在才创建
    jedis.set("key3","333",setParams);
    String value = jedis.get("key3");
    System.out.println("value: " + value);
    //mset
    jedis.mset("key1","v1","key2","v2","key3","v3");
    //mget
    List<String> vals =  jedis.mget("key1","key2","key3");
    System.out.println(vals);
    //exists
    Boolean result = jedis.exists("key4");
    System.out.println("result: "+result);
    //del,返回的是删除的元素个数
    Long dels = jedis.del("key3","key2");
    System.out.println("删除的元素个数:"+dels);
}
public static void test2(Jedis jedis){
    System.out.println("keys *");
    jedis.flushAll();
    jedis.mset("key1","v1","key2","v2","key3","v3","key4","v4");
    Set<String> keys =  jedis.keys("*");
    System.out.println(keys);
    System.out.println("expire和ttl");
    jedis.expire("key1",10);
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Long time = jedis.ttl("key1");
    System.out.println(time);
}

public static void test3(Jedis jedis){
    System.out.println("type");
    jedis.flushAll();
    jedis.set("k1","1111");
    String type = jedis.type("k1");
    System.out.println("type:"+type);
    jedis.hset("k2","f1","v1");
    type = jedis.type("k2");
    System.out.println("type:"+type);
    jedis.lpush("k3","11","22");
    type = jedis.type("k3");
    System.out.println("type:"+type);
    jedis.sadd("k4","member1","member2");
    type = jedis.type("k4");
    System.out.println("type:"+type);
    jedis.zadd("k5",10,"m1");
    type = jedis.type("k5");
    System.out.println("type:"+type);
}
public static void test4(Jedis jedis){
     System.out.println("setrange和getrange");
     jedis.flushAll();
     jedis.set("k1","abcdefghi");
     String result = jedis.getrange("k1",0,5);
     System.out.println("result:"+result);
     jedis.setrange("k1",2,"ttt");
     result = jedis.getrange("k1",0,-1);
     System.out.println("result:"+result);
     System.out.println("append");
     jedis.set("k2","aaaa");
     jedis.append("k2","bbb");
     result = jedis.get("k2");
     System.out.println("result:"+result);
     System.out.println("计数相关");
     jedis.set("k3","100");
     Long count = jedis.incr("k3");
     System.out.println("count:"+count);
     count = jedis.decr("k3");
     System.out.println("count:"+count);
     count = jedis.incrBy("k3",50);
     System.out.println("count:"+count);
     count = jedis.decrBy("k3",100);
     System.out.println("count:"+count);
}

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

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

相关文章

亚数受邀参加第六届进博会配套论坛,获评“2023年度上海重点产业提升国际竞争力示范案例”!

11月8日&#xff0c;由上海市商务委指导&#xff0c;上海社科院和临港集团主办&#xff0c;上海社科院应用经济研究所、徐汇虹梅街道和上海市漕河泾新兴技术开发区开发总公司联合承办&#xff0c;长三角产业国际竞争力联盟协办的第六届中国国际进口博览会提升上海产业国际竞争力…

整车级虚拟标定:降本增效

随着社会发展和用户对汽车产品要求的提高&#xff0c;在排放油耗法规逐步加严与新能源汽车凶猛来势的双重夹击下&#xff0c;动力系统配置、车辆配置以及目标市场的多样化正在为汽车产品开发工作带来巨大挑战&#xff0c;也给整车厂研发带来巨大压力。自2005年实施的CAFC&#…

白嫖阿里云服务器教程来了,薅秃阿里云!

白嫖阿里云服务器攻略来了&#xff0c;在阿里云免费试用中心可以申请免费服务器&#xff0c;但是阿里云百科不建议选择免费的&#xff0c;只有3个月使用时长&#xff0c;选择99元服务器不是更香&#xff0c;2核2G配置3M固定带宽&#xff0c;一年99元&#xff0c;重点是新老用户…

操作系统第一次实验——短作业优先调度算法(SJF)

一、实验目的&#xff1a; 目的&#xff1a;了解并掌握作业调度的功能&#xff0c;熟悉并掌握各种作业调度算法。 任务&#xff1a;模拟实现先来先服务或者短作业优先调度算法。 二、实验内容&#xff1a; 1、实验内容 模拟实现SJF调度。 设置作业体&#xff1a;作业名&#x…

解决:Git报错same change IDs

当使用git review的时候&#xff0c;review失败&#xff0c;报错multi commit …same change ids。。 错误&#xff1a; same Change-Id in multiple changes 意思是说&#xff0c;有多个commit记录的change ids是相同的&#xff0c;这change id概念出现在gerrit&#xff0…

将VS工程转为pro工程及VS安装Qt插件后没有create basic .pro file菜单问题解决

目录 1. 前言 2. VS工程转为pro工程 3. 没有create basic .pro file菜单 1. 前言 很多小伙伴包括本人&#xff0c;如果是在Windows下开发Qt程序&#xff0c;偏好用Visual Studio外加装个Qt插件进行Qt开发&#xff0c;毕竟Visual Studio确实是功能强大的IDE&#xff0c;但有时…

国际阿里云:Windows系统ECS实例中CPU使用率较高问题的排查及解决方案!!

问题现象 Windows系统ECS实例中CPU使用率较高&#xff0c;即CPU使用率≥80%。 问题原因 CPU使用率较高可能有以下原因。 ECS实例遭到病毒木马入侵。 ECS实例中第三方杀毒软件运行。 ECS实例中应用程序异常、驱动异常、高I/O使用率或高中断处理的应用程序。 解决方案 步骤…

OAuth2.0和1.0的区别

OAuth2.0的最大改变就是不需要临时token了&#xff0c;直接authorize生成授权code&#xff0c;用code就可以换取accesstoken了&#xff0c;同时accesstoken加入过期&#xff0c;刷新机制&#xff0c;为了安全&#xff0c;要求第三方的授权接口必须是https的。OAuth2.0不能向下兼…

基础课27——人工智能训练师人才画像

1.什么是人工智能训练师 根据《人工智能训练师》国家职业技能标准&#xff08;2021年版&#xff09;&#xff0c;人工智能训练师是指“使用智能训练软件&#xff0c;在人工智能产品使用过程中进行数据库管理、算法参数设置、人机交互设计、性能测试跟踪及其他辅助作业的人员”…

社区治理进化史!拓世法宝化身“虚拟社工”,点亮智能社区的每一个角落

时光流转、技术猛进&#xff0c;社区不再只是在制度层面作为城市治理的最小单元&#xff0c;更是在民生层面成为政府联系、服务群众的“神经末梢”。城市的脚步越来越匆忙&#xff0c;人们对于社区的服务期待也愈发高涨。面对日益复杂的社区治理和服务需求&#xff0c;我们迫切…

建设大型综合运维平台,对接集成多厂商网管系统

当前&#xff0c;云计算、大数据、人工智能等IT技术迅猛发展&#xff0c;企业的信息化步入了一个崭新的时代&#xff0c;企业规模不断壮大&#xff0c;业务不断拓展&#xff0c;企业信息化依赖的网络结构和IT技术越来越复杂。因建设时期等原因&#xff0c;企业网络中分布着不同…

Springboot SpringCloudAlibaba Nacos 项目搭建

依赖版本&#xff1a; spring-boot&#xff1a;2.3.12.RELEASE spring-cloud-alibaba&#xff1a;2.2.7.RELEASE spring-cloud&#xff1a;Hoxton.SR12 nacos&#xff1a;2.0.3 1.部署搭建Nacos注册中心 Linux Nacos 快速启动_nacos linux快速启动-CSDN博客 2.构建项目 源码地…

美国突传两件大事!大饼单日涨跌2500美元,以太走出“独立行情”!

​ 受「比特币ETF正式进入批准窗口期」利好消息刺激&#xff0c;比特币持续攀升&#xff0c;并最终于9日晚间23点突破38000美元关口&#xff0c;创下自2022年5月22日以来最高水平。 据了解&#xff0c;彭博ETF分析师James Seyffart发文称&#xff0c;比特币ETF正式进入批准窗…

mysql的sql_mode参数

msql修改了这个参数&#xff0c;首先mysql需要重新才能生效&#xff0c;还有就是java连接的springboot项目也需要重新启动。之前是遇到了下面的这个报错。只需要把sql_mode设置为空&#xff0c;重启mysql和服务就行 报错 In aggregated query without GROUP BY, expression #1…

网络安全(黑客)自学笔记1.0

前言 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习&#xff0c;最终也只是会无疾而终&#xff01;黑客是一个大的概念&#xff0c;里面包含了许多方向&#xff0c;不同的方向需要学习的内容也不一样。 算上从学校开始学…

NSS [HUBUCTF 2022 新生赛]checkin

NSS [HUBUCTF 2022 新生赛]checkin 判断条件是if ($data_unserialize[username]$username&&$data_unserialize[password]$password)&#xff0c;满足则给我们flag。正常思路来说&#xff0c;我们要使序列化传入的username和password等于代码中的两个同名变量&#xff0…

高斯分布-最大似然估计公式白板推导

由上述推导得出结论&#xff1a; μ M L E 1 N ∑ i 1 N x i \mu_{MLE}\frac{1}{N}\sum\limits _{i1}^{N}x_{i} μMLE​N1​i1∑N​xi​ σ ^ 2 1 N − 1 ∑ i 1 N ( x i − μ ) 2 \hat{\sigma}^{2}\frac{1}{N-1}\sum\limits _{i1}^{N}(x_{i}-\mu)^{2} σ^2N−11​i1∑N…

数字滤波器分析---零极点分析

数字滤波器分析---零极点分析 zplane 函数绘制线性系统的极点和零点。 例如&#xff0c;在 -1/2 处为零且在 0.9e−j2π0.3 和 0.9ej2π0.3 处有一对复极点的简单滤波器为 zer -0.5; pol 0.9*exp(j*2*pi*[-0.3 0.3]); 要查看该滤波器的零极点图&#xff0c;您可以使用 z…

需求调研,是做好商业智能BI的第一步

商业智能BI&#xff0c;一个高大上的名字&#xff0c;一直被很多人认为是企业信息化中的“面子工程”。美其名曰“可视化大屏”&#xff0c;什么经营驾驶舱&#xff0c;什么管理仪表盘&#xff0c;都是花里胡哨的东西&#xff0c;老板不会看&#xff0c;企业不会用&#xff0c;…

Python 解决tkinter的Menu菜单command参数与bind方法共用触发事件

用普通函数作为媒介&#xff0c;使用event_generate()方法模拟触发bind()事件来创建一个模拟的event对象&#xff0c;并将其传递给绑定的事件处理函数。 运行结果 示例代码 import tkinter as tk# 菜单事件 def menuEvent(event):print(event.x, event.y)label.config(textf鼠…