Redis客户端-引入jedis

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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值