端口映射的操作
Redis服务器在官网上公开了RESP,任何一个三方都可以通过上述协议,来实现一个和redis
那么直接放开防火墙可以不呢?不行-一旦Redis端口公布到公网上,特别容易被入侵
tomcat开门了,也不好被黑,redis6379端口门锁-特别好被黑
换个端口名7379可以不呢?(掩耳盗铃,该黑还是被黑)
1.不能开发redis端口
2.我们又想要通过外网访问。
一、直接让java程序,也在linux运行,手动打jar包,然后拷贝到linux服务器上执行~,手工完成麻烦,第三方插件,简化上述步骤
二、配置SSH端口转发,把云服务器redis端口映射本地
通过ssh,把服务器的6379映射到本地的8888
当ssh连接上之后,端口转发才生效(把ssh连接断开,端口转发自然就消息。)
Termius如何进行端口转发
1.点击图中这里
2.第一个是他自己生成的不用管,第二个Local port 本地端口设置为8888,然后地址就写主机地址即可
3.这块依次你的服务器公网ip,服务器的主机,还有他的端口(我要转发redis,所以是6379)
4.点击这三个点
一定要点Connection,这个相当于保存设置
然后我们去终端查看,输入这个指令,查找对应的端口,我的是8888,你们随意啦
sudo lsof -i :8888
后续代码中,通过127.0.0.1:8888即可操作我们云服务器的redis了,同时外面的客户端是无法直接访问云服务器6379的。有人可能好奇redis,Mac又不是没有,直接在本地下一个就好啦-学的是方法(格局要大)
一个简单的demo,发现一个问题,这里对端口地址十分敏感,你写的localhost,就不能127.0.0.1,你要是127.0.0.1就不可以localhost。
当然还有一个要点,开始安装redis的时候,要配置绑定的ip,以及关闭保护模式,
默认的绑定127.0.0.1,此时只能本机和本机访问,不能跨主机访问
protected-mode no :这里默认是yes,开启保护模式,跨主机也是不能访问的。
jedis进行redis中的一些通用命令
1.get/set
2.exists
3.del
4.keys
5.expire/ttl
6.type
接下来介绍redis的命令在代码中的操作,不会覆盖到所有的命令,会挑选一些比较代表的命令去演示。
字符串基本命令使用
get,set-获取,设置
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import java.util.List; public class RedisDemoString { public static void main(String[] args) { JedisPool jedisPool=new JedisPool("tcp://localhost:8888"); try (Jedis jedis=jedisPool.getResource()){ test1(jedis); } } private static void test1(Jedis jedis) { System.out.println("mget和mset"); jedis.flushAll(); jedis.mset("key1","111","key2","222","key3","333"); //此处多个key得到的value顺序都是和key匹配的,如果某个key在redis上不存在,对应的value使用null表示 List<String>values=jedis.mget("key1","key100","key3"); System.out.println("values"+values); } }
getrange,获取区间长度,从offset开始,到endOffset结束
setrange,修改指定区间的值,从下标给出的2开始,往后三位
append-字符串添加操作
incr-对应的值,自增一个,decr-对应值,自减一个
以下是上面完整代码
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.params.SetParams; import java.util.Set; public class RedisDemoGeneric { public static void test1(Jedis jedis){ System.out.println("get和set的使用"); //先去清空数据库,避免上一组残留数据影响下一组测试的结果 jedis.flushAll(); jedis.set("key","111"); jedis.set("key2","222"); //通过这个参数,给set 设置条件 SetParams params=new SetParams();//相当于一个条件的包装类(包装我们需要的条件) //设置超时时间 params.ex(10); //已经存在,才能进行修改 // params.xx(); //不存在,才能够修改 params.nx(); jedis.set("key","333",params); String value=jedis.get("key"); System.out.println("value="+value); } public static void test2(Jedis jedis){ System.out.println("exists和del"); jedis.flushAll(); jedis.set("key","111"); jedis.set("key2","222"); Boolean result=jedis.exists("key"); System.out.println("result:"+result); long result2=jedis.del("key","key2","key3"); System.out.println("result2:"+result2); result=jedis.exists("key"); System.out.println("result:"+result); result=jedis.exists("key2"); System.out.println("result:"+result); } public static void test3(Jedis jedis){ System.out.println("keys"); jedis.flushAll(); jedis.set("key","111"); jedis.set("key2","111"); jedis.set("key3","111"); jedis.set("key4","111"); //redis中的key不能重复!而且也是不在意顺序的,keys * //按照java的写法,分别针对N个服务器,调用N此keys,但是这N此keys的结果,可以使用同一个插入迭代器,往同一个容器中插入。 Set<String> keys=jedis.keys("*"); System.out.println(keys); } public static void test4(Jedis jedis){ System.out.println("expire和ttl"); jedis.flushAll(); jedis.set("key","111"); jedis.expire("key",10); try{ Thread.sleep(3000); }catch (InterruptedException e){ e.printStackTrace(); } long time=jedis.ttl("key"); System.out.println(time); } public static void test5(Jedis jedis){ System.out.println("type"); jedis.flushAll(); jedis.set("key","111"); String type=jedis.type("key"); System.out.println("type:"+type); jedis.lpush("key2","111","222","333"); type=jedis.type("key2"); System.out.println("type::"+type); jedis.hset("key3","f1","111"); type=jedis.type("key3"); System.out.println("type:"+type); jedis.sadd("key4","111","222","333"); type=jedis.type("key4"); System.out.println("type:"+type); jedis.zadd("key5",10,"zhangsan"); //获取value的type type=jedis.type("key5"); System.out.println("type:"+type); } public static void main(String[] args) { //连接到Redis服务器上 JedisPool jedisPool=new JedisPool("tcp://localhost:8888");//基于tcp协议 //从Redis连接池中取一个连接出来,连接用完记得释放。 try(Jedis jedis=jedisPool.getResource()){ //redis各种命令,对应到jedis对象的各种方法。 // String pong=jedis.ping(); // System.out.println(pong); //test1(jedis); test5(jedis); } } }
List基本命令使用
lpush和lrange-左侧插入,给定区间查询
rpush-右侧插入
Lpop-头删
rpop-右侧删除
Blpop-阻塞版本的lpop,返回的我们可以看到0是键 1是值
llen-返回列表长度(注意返回类型是long)
以下是上面完整代码
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import java.util.List; public class RedisDemoList { //列表的操作 /* 1.lpush和lrange 2.rpush,rpop,lpop 3.blpop,brpop 4.llen */ public static void main(String[] args) { JedisPool jedisPool=new JedisPool("tcp://localhost:8888"); try(Jedis jedis=jedisPool.getResource()){ test6(jedis); } } private static void test6(Jedis jedis) { System.out.println("llen"); jedis.flushAll(); jedis.rpush("key","111","222","333"); //注意llen返回值是long long len= jedis.llen("key"); System.out.println(len); } public static void test5(Jedis jedis){ System.out.println("blpop"); jedis.flushAll(); //blpop支持删除多个,所以返回的结果也是多个 List<String> result=jedis.blpop(100,"key"); System.out.println(result.get(0)); System.out.println(result.get(1)); } public static void test4(Jedis jedis){ System.out.println("rpop"); jedis.flushAll(); jedis.rpush("key","111","222","333"); String result=jedis.rpop("key"); System.out.println("result"+result); String result1=jedis.rpop("key"); System.out.println("result1"+result1); String result2=jedis.rpop("key"); System.out.println("result2"+result2); } private static void test3(Jedis jedis) { System.out.println("lpop"); jedis.flushAll(); jedis.rpush("key","111","222","333"); String resultold=jedis.lpop("key"); System.out.println(resultold); String result=jedis.lpop("key"); System.out.println("result:"+result); } public static void test2(Jedis jedis){ System.out.println("rpush"); jedis.flushAll(); jedis.rpush("key","111","222","333"); List<String> result=jedis.lrange("key",0,-1); System.out.println("result: "+result); } private static void test1(Jedis jedis) { System.out.println("lpush和lrange"); jedis.flushAll(); jedis.lpush("key","111","222","333"); List<String>result=jedis.lrange("key",0,-1); System.out.println(result); } }
Set基本命令使用
sadd-往集合中添加元素(返回set)
sismember-判断元素在集合中是否存在。
scard:获取当前元素个数(返回long)
spop-头删,弹出头元素。
sinter-求两个key 交集,返回类型是一个set
sinterstore-把两个集合做交集放到一个集合里面
我们可以用Set来接收smembers("key3")
以下是上面完整代码
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import java.util.Set; public class RedisDemoSet { public static void main(String[] args) { JedisPool jedisPool=new JedisPool("tcp://localhost:8888"); try(Jedis jedis=jedisPool.getResource()){ test6(jedis); } } private static void test6(Jedis jedis) { System.out.println("sinterscore"); jedis.flushAll(); jedis.sadd("key","111","222","333"); jedis.sadd("key2","111","222","444"); //把两个数的交集,存储到一个key中 long len= jedis.sinterstore("key3","key","key2"); System.out.println("len:"+len); Set<String>result=jedis.smembers("key3"); System.out.println("result:"+result); } private static void test5(Jedis jedis) { System.out.println("sinter"); jedis.flushAll(); jedis.sadd("key","111","222","333"); jedis.sadd("key2","111","222","444"); Set<String> result=jedis.sinter("key","key2"); System.out.println("result:"+result); } public static void test4(Jedis jedis){ System.out.println("spop"); jedis.flushAll(); jedis.sadd("key","111","222","333","444","555"); String result=jedis.spop("key"); System.out.println("result:"+result); } private static void test3(Jedis jedis) { System.out.println("scard"); jedis.flushAll(); jedis.sadd("key","111","222","333"); long result=jedis.scard("key"); System.out.println("result:"+result); } private static void test2(Jedis jedis) { System.out.println("sismeber"); jedis.flushAll(); jedis.sadd("key","111","222","333"); boolean result=jedis.sismember("key","111"); System.out.println("result:"+result); } private static void test1(Jedis jedis) { System.out.println("sadd和smembers"); jedis.flushAll(); jedis.sadd("key","111","222","333"); Set<String> result=jedis.smembers("key"); System.out.println("result: "+result); } }
Hash基本命令使用
hget和hset获取哈希表值,设置哈希表值
hexist-根据你的key和field,看是否存在
hdel-删除key对应的field
hkey 和hvals-获取对应的key,获取对应的val,当然他返回的顺序不一定是一一对应的,我们也需要注意。
hmset,hmget-设置多个,获取多个(会按照你给的field的顺序,返回value)
以下是上面完整代码
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; public class RedisDemoHash { //1.hset和hget //2.hexists //3.hdel //4.hkeys和hvals //5.hmget和hmset public static void main(String[] args) { JedisPool jedisPool=new JedisPool("tcp://localhost:8888"); try(Jedis jedis=jedisPool.getResource()){ test5(jedis); } } private static void test5(Jedis jedis) { System.out.println("hmget和hmset"); jedis.flushAll(); Map<String,String> map=new HashMap<>(); map.put("f1","111"); map.put("f2","222"); map.put("f3","333"); jedis.hmset("key",map); List<String>values=jedis.hmget("key","f1","f2","f3"); System.out.println("values:"+values); } private static void test4(Jedis jedis) { System.out.println("hkeys和hvals"); jedis.flushAll(); jedis.hset("key","f1","111"); jedis.hset("key","f2","222"); jedis.hset("key","f3","333"); Set<String>field=jedis.hkeys("key"); List<String>vals=jedis.hvals("key"); System.out.println("field:"+field); System.out.println("vals:"+vals); } private static void test3(Jedis jedis) { System.out.println("hdel"); jedis.flushAll(); jedis.hset("key","f1","111"); jedis.hset("key","f2","222"); jedis.hset("key","f3","333"); long result=jedis.hdel("key","f1","f2"); //返回的是成功删除的个数 System.out.println("result:"+result); boolean exists=jedis.hexists("key","f1"); System.out.println("exists:"+exists); exists=jedis.hexists("key","f2"); System.out.println("exists:"+exists); exists=jedis.hexists("key","f3"); System.out.println("exists:"+exists); } private static void test2(Jedis jedis) { System.out.println("hexists"); jedis.flushAll(); jedis.hset("key","f1","111"); jedis.hset("key","f2","222"); jedis.hset("key","f3","333"); boolean result=jedis.hexists("key","f1"); System.out.println(result); result=jedis.hexists("key","f4"); System.out.println(result); } private static void test1(Jedis jedis) { System.out.println("hset和hget"); jedis.flushAll(); jedis.hset("key","f1","111"); Map<String,String> fields=new HashMap<>(); fields.put("f2","222"); fields.put("f3","333"); jedis.hset("key",fields); String result=jedis.hget("key","f1"); System.out.println("result:"+result); result=jedis.hget("key","f2"); System.out.println("result:"+result); result=jedis.hget("key","f3"); System.out.println("result"+result); } }
zset基本命令使用
zrange和zrangewiehscore查找指定范围。
zcard获取元素个数
zrem-删除指定元素
zscore-获取元素分数
Zrank-获取member的排名(根据分数)。
以下是上述所有代码
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.resps.Tuple; import java.util.HashMap; import java.util.List; import java.util.Map; public class RedisDemoZSet { public static void main(String[] args) { JedisPool jedisPool=new JedisPool("tcp://localhost:8888"); try(Jedis jedis=jedisPool.getResource()){ test5(jedis); } } private static void test5(Jedis jedis) { System.out.println("zrank"); jedis.zadd("key",10,"zhangsan"); jedis.zadd("key",20,"lisi"); jedis.zadd("key",30,"wangwu"); Long rank=jedis.zrank("key","zhangsan"); System.out.println("rank:"+rank); rank=jedis.zrank("key","zhangsan2"); System.out.println(rank); } private static void test4(Jedis jedis) { System.out.println("zscore"); jedis.flushAll(); jedis.zadd("key",10,"zhangsan"); jedis.zadd("key",20,"lisi"); jedis.zadd("key",30,"wangwu"); //包装类,假如是小写,不存在会不方便表示为空(会抛异常) Double score=jedis.zscore("key","zhangsan"); System.out.println("score:"+score); } private static void test3(Jedis jedis) { System.out.println("zrem"); jedis.flushAll(); jedis.zadd("key",10,"zhangsan"); jedis.zadd("key",20,"lisi"); jedis.zadd("key",30,"wnagwu"); long len=jedis.zrem("key","zhangsan"); System.out.println("成功删除的个数:"+len); List<Tuple>result=jedis.zrangeWithScores("key",0,-1); System.out.println("result"+result); } private static void test2(Jedis jedis) { System.out.println("zcard"); jedis.flushAll(); jedis.zadd("key",10,"zhangsan"); jedis.zadd("key",20,"lisi"); jedis.zadd("key",30,"wangwu"); long len=jedis.zcard("key"); System.out.println("len:"+len); } private static void test1(Jedis jedis) { System.out.println("zadd和zrange"); jedis.flushAll(); jedis.zadd("key",10,"zhangsan"); Map<String,Double> map=new HashMap<>(); map.put("lisi",20.0); map.put("wangwu",30.0); jedis.zadd("key",map); //没有分数 List<String> members=jedis.zrange("key",0,-1); System.out.println("member:"+members); //Tuple:一个数据结构,redis提供的,他是一个元祖 List<Tuple>memberWithSocore=jedis.zrangeWithScores("key",0,-1); System.out.println("membersWithScore:"+memberWithSocore); String member=memberWithSocore.get(0).getElement(); System.out.println(member); double score=memberWithSocore.get(0).getScore(); System.out.println(score); } }