深入学习 Redis - 基于 Jedis 通过 Java 客户端操作 Redis 和 Redis 集群
目录
一、Jedis 依赖
二、Java 客户端操控 redis
2.1、准备工作(ssh 隧道)
2.2、概要
2.2、string
2.3、hash
2.4、list
2.5、set
2.5、zset
三、访问集群
一、Jedis 依赖
自己去 中央仓库 上面找.
二、Java 客户端操控 redis
2.1、准备工作(ssh 隧道)
想要连接上云服务器上的 redis ,就需要开放 6379 端口,但是一旦开饭这个端口是十分危险的!!!(不出 3 天,你的服务器就会被黑客攻击)
我们有两种办法
- 将 java 程序打包成 jar 包,放到 linux 服务器上执行(过于麻烦,不推荐);
- 匹配 ssh 端口转发,把云服务器的 redis 端口,映射到本地主机(推荐).
因此我们来讲讲第二种办法~
我们在本地 windows 主机上,使用 xshell 连接远程服务器,主要就是通过 ssh 协议(默认走 22 端口)实现通信的,他有一个很重要的特性,就是支持端口转发! 我们只需要配置 ssh 程序监听本地端口,映射到云服务器的端口,就可以实现通过 windows 主机,访问云服务器的 6379 端口.
具体的,我们只需要再 xshell 上配置连接信息即可:
Ps:当配置了端口准发后,一定要断开之前的连接,重新连接才能生效.
2.2、概要
基于前面对 redis 指令的学习,这里使用 jedis 这个库来操控 redis。
Ps:一个优秀的库,一定是非常容易上手的,因此接下来介绍的操作,不会覆盖到所有指令,会挑选出一些重要 / 代表性的命令,来进行演示~
使用 jedis 操控 redis 类似于 JDBC ,我们可以先创建 连接池,然后拿到连接,执行完操作后再释放连接,因此后续讲的所有操作,都是基于以下代码:
public static void main(String[] args) {
//这里只是开发阶段这么写,要是部署到云服务器上,就需要根据实际情况来配置这个的 ip 和端口号.
JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");
//使用 try,出代码块时自动释放 jedis 连接(不是关闭,而是放回到连接池中)
try(Jedis jedis = jedisPool.getResource()) {
// 测试场景:
// ......
test1(jedis);
}
}
2.2、string
public class JedisString {
private static void test1(Jedis jedis) {
System.out.println("------------------------------------");
System.out.println("mget 和 mset");
//这里为了演示效果,使用之前会先释放所有 key
jedis.flushAll();
jedis.mset("key1", "value1", "key2", "value2", "key3", "value3");
List<String> values = jedis.mget("key1", "key2", "key3", "key100");
System.out.println(values);
}
private static void test2(Jedis jedis) {
System.out.println("------------------------------------");
System.out.println("getrange 和 setrange");
jedis.flushAll();
jedis.set("key", "helloworld");
String value1 = jedis.getrange("key", 2, 5);
System.out.println("value1: " + value1);
jedis.setrange("key", 2, "cykkk");
String value2 = jedis.get("key");
System.out.println("value2: " + value2);
}
private static void test3(Jedis jedis) {
System.out.println("------------------------------------");
System.out.println("append");
jedis.flushAll();
jedis.set("key1", "hello");
jedis.append("key1", " world");
String value1 = jedis.get("key1");
System.out.println("value1: " + value1);
}
private static void test4(Jedis jedis) {
System.out.println("------------------------------------");
System.out.println("incr 和 decr");
jedis.flushAll();
jedis.set("key1", "10");
jedis.incr("key1");
System.out.println("inct key1: " + jedis.get("key1"));
jedis.set("key1", "10");
jedis.decr("key1");
System.out.println("decr key2: " + jedis.get("key1"));
}
public static void main(String[] args) {
//这里只是开发阶段这么写,要是部署到云服务器上,就需要根据实际情况来配置这个的 ip 和端口号.
JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");
//使用 try,出代码块时自动释放 jedis 连接(不是关闭,而是放回到连接池中)
try(Jedis jedis = jedisPool.getResource()) {
// 测试场景:
// ......
test1(jedis);
test2(jedis);
test3(jedis);
test4(jedis);
}
}
}
2.3、hash
public class JedisHash {
private static void test1(Jedis jedis) {
System.out.println("-----------------------------------");
System.out.println("hset 和 hget");
jedis.flushAll();
jedis.hset("key1", "f1", "v1");
String result = jedis.hget("key1", "f1");
System.out.println("result: " + result);
Map<String, String> map = new HashMap<>();
map.put("f1", "v1");
map.put("f2", "v2");
map.put("f3", "v3");
jedis.hset("key2", map);
System.out.println("key2: " + jedis.hgetAll("key2"));
}
private static void test2(Jedis jedis) {
System.out.println("-----------------------------------");
System.out.println("hexists");
jedis.flushAll();
jedis.hset("key1", "f1", "v1");
boolean result1 = jedis.hexists("key1", "f1");
boolean result2 = jedis.hexists("key1", "f2");
System.out.println("result1: " + result1);
System.out.println("result2: " + result2);
}
private static void test3(Jedis jedis) {
System.out.println("-----------------------------------");
System.out.println("hdel");
jedis.flushAll();
jedis.hset("key1", "f1", "v1");
jedis.hset("key1", "f2", "v2");
jedis.hset("key1", "f3", "v3");
long result = jedis.hdel("key1", "f1");
System.out.println("result: " + result);
System.out.println("f1: " + jedis.hget("key1", "f1"));
System.out.println("f2: " + jedis.hget("key1", "f2"));
System.out.println("f3: " + jedis.hget("key1", "f3"));
}
private static void test4(Jedis jedis) {
System.out.println("-----------------------------------");
System.out.println("hkeys 和 hvals");
jedis.flushAll();
Map<String, String> map = new HashMap<>();
map.put("f1", "v1");
map.put("f2", "v2");
map.put("f3", "v3");
jedis.hmset("key1", map);
Set<String> set = jedis.hkeys("key1");
List<String> list = jedis.hvals("key1");
System.out.println("key1 -> field:" + set);
System.out.println("key2 -> value:" + list);
}
public static void main(String[] args) {
JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");
try(Jedis jedis = jedisPool.getResource()) {
test1(jedis);
test2(jedis);
test3(jedis);
test4(jedis);
}
}
}
2.4、list
public class JedisList {
private static void test1(Jedis jedis) {
System.out.println("---------------------------");
System.out.println("lpush 和 lrange");
jedis.flushAll();
jedis.lpush("key1", "value1", "value2", "value3");
List<String> result = jedis.lrange("key1", 0 ,-1);
System.out.println(result);
}
private static void test2(Jedis jedis) {
System.out.println("---------------------------");
System.out.println("rpush");
jedis.flushAll();
jedis.rpush("key1", "value1", "value2", "value3");
List<String> result = jedis.lrange("key1", 0 ,-1);
System.out.println(result);
}
private static void test3(Jedis jedis) throws InterruptedException {
System.out.println("---------------------------");
System.out.println("blpop");
jedis.flushAll();
List<String> result = jedis.blpop(100, "key1");
System.out.println(result.get(0));
System.out.println(result.get(1));
}
public static void main(String[] args) throws InterruptedException {
JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");
try(Jedis jedis = jedisPool.getResource()) {
test1(jedis);
test2(jedis);
test3(jedis);
}
}
}
2.5、set
public class JedisSet {
private static void test1(Jedis jedis) {
System.out.println("-------------------------");
System.out.println("sadd 和 smembers");
jedis.flushAll();
jedis.sadd("key1", "m1", "m2", "m3");
Set<String> set = jedis.smembers("key1");
System.out.println(set);
}
private static void test2(Jedis jedis) {
System.out.println("-------------------------");
System.out.println("sismember");
jedis.flushAll();
jedis.sadd("key1", "m1", "m2", "m3");
boolean result1 = jedis.sismember("key1", "m2");
boolean result2 = jedis.sismember("key1", "m100");
System.out.println("result1: " + result1);
System.out.println("result2: " + result2);
}
private static void test3(Jedis jedis) {
System.out.println("-------------------------");
System.out.println("scard");
jedis.flushAll();
jedis.sadd("key1", "m1", "m1", "m3");
long result = jedis.scard("key1");
System.out.println("result: " + result);
}
private static void test4(Jedis jedis) {
System.out.println("-------------------------");
System.out.println("spop");
jedis.flushAll();
jedis.sadd("key1", "m1", "m1", "m3");
String result = jedis.spop("key1");
System.out.println("result: " + result);
}
private static void test5(Jedis jedis) {
System.out.println("-------------------------");
System.out.println("sinter");
jedis.flushAll();
jedis.sadd("key1", "m1", "m2", "m3");
jedis.sadd("key2", "m2", "m3", "m4");
Set<String> set = jedis.sinter("key1", "key2");
System.out.println(set);
}
private static void test6(Jedis jedis) {
System.out.println("-------------------------");
System.out.println("sinter");
jedis.flushAll();
jedis.sadd("key1", "m1", "m2", "m3");
jedis.sadd("key2", "m2", "m3", "m4");
long len = jedis.sinterstore("keyStore", "key1", "key2");
System.out.println("len: " + len);
System.out.println("keyStore: " + jedis.smembers("keyStore"));
}
public static void main(String[] args) {
JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");
try(Jedis jedis = jedisPool.getResource()) {
test1(jedis);
test2(jedis);
test3(jedis);
test4(jedis);
test5(jedis);
test6(jedis);
}
}
}
2.5、zset
public class JedisZset {
private static void test1(Jedis jedis) {
System.out.println("-----------------------------");
System.out.println("zadd 和 zrange");
jedis.flushAll();
jedis.zadd("key1", 10, "aaa");
Map<String, Double> map = new HashMap<>();
map.put("bbb", 20.0);
map.put("ccc", 30.0);
jedis.zadd("key1", map);
List<String> list = jedis.zrange("key1", 0 ,-1);
System.out.println(list);
}
private static void test2(Jedis jedis) {
System.out.println("-----------------------------");
System.out.println("zcard");
jedis.flushAll();
jedis.zadd("key1", 10, "aaa");
jedis.zadd("key1", 20, "bbb");
jedis.zadd("key1", 30, "ccc");
long len = jedis.zcard("key1");
System.out.println(len);
}
private static void test3(Jedis jedis) {
System.out.println("-----------------------------");
System.out.println("zrem");
jedis.flushAll();
jedis.zadd("key1", 10, "aaa");
jedis.zadd("key1", 20, "bbb");
jedis.zadd("key1", 30, "ccc");
long count = jedis.zrem("key1", "aaa", "bbb", "xxx");
System.out.println(count);
}
private static void test4(Jedis jedis) {
System.out.println("-----------------------------");
System.out.println("zscore 和 zrank");
jedis.flushAll();
jedis.zadd("key1", 10, "aaa");
jedis.zadd("key1", 20, "bbb");
jedis.zadd("key1", 30, "ccc");
Double score = jedis.zscore("key1", "bbb");
Long rank = jedis.zrank("key1", "bbb");
System.out.println("score: " + score);
System.out.println("rank: " + rank);
}
public static void main(String[] args) {
JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");
try(Jedis jedis = jedisPool.getResource()) {
test1(jedis);
test2(jedis);
test3(jedis);
test4(jedis);
}
}
}
三、访问集群
使⽤ JedisCluster 类代替 Jedis 类即可.
需要在创建实例的时候, 把多个节点的地址, 都设置进去.
JedisCluster 提供的⽅法和 Jedis 基本⼀致,都和 Redis 命令是对应的(上面已经演示过了,这里就不过多演示了).
public class JedisClusterDemo {
public static void main(String[] args) {
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("172.30.0.101", 6379));
nodes.add(new HostAndPort("172.30.0.102", 6379));
nodes.add(new HostAndPort("172.30.0.103", 6379));
nodes.add(new HostAndPort("172.30.0.104", 6379));
nodes.add(new HostAndPort("172.30.0.105", 6379));
nodes.add(new HostAndPort("172.30.0.106", 6379));
nodes.add(new HostAndPort("172.30.0.107", 6379));
nodes.add(new HostAndPort("172.30.0.108", 6379));
nodes.add(new HostAndPort("172.30.0.109", 6379));
try (JedisCluster jedisCluster = new JedisCluster(nodes)) {
jedisCluster.set("k1", "111");
String val = jedisCluster.get("k1");
System.out.println("k1: " + val);
}
}
}
注意!由于此处我们的代码是需要访问整个 redis 集群, 因此不能直接在 windows 上运⾏程序了. (上述 docker 容器的 ip 都是 windows 主机上⽆法直接访问的).
需要把整个程序打成 jar 包, 上传到 Linux 中, 并通过下列⽅式运⾏.
java -jar [jar包名]
还没有评论,来说两句吧...