Redis 的 Java API(API应用程序编程接口)
先新建一个项目
进入Maven仓库找一个Redis的依赖(Jedis)
Maven仓库的网址:Maven Repository: Search/Browse/Explore (mvnrepository.com)
找这个
#在Maven项目中的pom.xml文件中添加依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
通过Java代码操作Redis的基本步骤
package com.shujia;
import redis.clients.jedis.Jedis;
public class RedisDemo1 {
/**
* 通过Java代码操作Redis
*/
public static void main(String[] args) {
// 1、建立连接
Jedis jedis = new Jedis("master", 6379);
// 2、测试连通性
System.out.println(jedis.ping());
// 3、通过建立的连接操作Redis
// 通过 jedis 直接 . 就行,这里的方法和Redis中的命令基本上都是一一对应的
String nk3 = jedis.get("nk3");
System.out.println(nk3);
// 关闭Redis连接
jedis.close();
}
}
了解了Java代码操作Redis的基本步骤之后,我们针对Redis中的每一种数据结构都做一次增删改查
在此之前为了方便我们做测试,我们导一下 junit 的依赖
#JUnit 是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架,是一个开放源代码的 Java 测试框架,可以在它的基础上编写和运行可重复的测试。
#导入Junit的依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
</dependency>
String
package com.shujia;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.args.BitOP;
public class RedisString {
Jedis jedis;
@Before
// 会在执行@Test修饰的方法之前执行
public void init() {
jedis = new Jedis("master", 6379);
}
@Test
// 增加一个String类型的value
public void Set() {
jedis.set("j1", "v1");
jedis.set("j2", "v2");
jedis.set("j3", "v3");
}
@Test
// 删除一个K-V
public void DEL() {
jedis.del("j1");
}
@Test
// 根据K获取V
public void GET() {
System.out.println(jedis.get("j1"));
System.out.println(jedis.get("j2"));
System.out.println(jedis.get("j3"));
}
@Test
// 创建一个位图
public void SETBIT() {
jedis.setbit("b1", 1, true);
jedis.setbit("b2", 3, true);
}
@Test
// 获取位图
public void GETBIT() {
System.out.println(jedis.get("b1"));
}
@Test
// 位图的操作
public void BITOPT() {
jedis.bitop(BitOP.AND, "b3", "b1", "b2");
jedis.bitop(BitOP.OR, "b4", "b1", "b2");
jedis.bitop(BitOP.NOT, "b5", "b1");
jedis.bitop(BitOP.XOR, "b6", "b1", "b2");
System.out.println(jedis.get("b3"));
System.out.println(jedis.get("b4"));
System.out.println(jedis.get("b5"));
System.out.println(jedis.get("b6"));
}
@After
// 表示在@Test方法执行完成之后执行
public void closed() {
jedis.close();
}
}
List
package com.shujia;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.List;
public class RedisList {
Jedis jedis;
@Before
// 会在执行@Test修饰的方法之前执行
public void init() {
jedis = new Jedis("master", 6379);
}
@Test
// 创建一个List
public void PUSH() {
jedis.lpush("list1", "1");
jedis.lpush("list1", "2");
jedis.rpush("list1", "3");
jedis.rpush("list1", "4");
jedis.rpush("list1", "5");
}
@Test
// 修改List中的元素
public void LSET() {
jedis.lset("list1", 4, "5.5");
}
@Test
// 获取List中的所有元素
public void LRANGE() {
List<String> l = jedis.lrange("list1", 0, -1);
for (String s : l) {
System.out.println(s);
}
}
@Test
// 删除元素
public void POP() {
System.out.println(jedis.blpop(1000, "list1"));
System.out.println(jedis.rpop("list1"));
System.out.println(jedis.lpop("list1"));
}
@After
// 表示在@Test方法执行完成之后执行
public void closed() {
jedis.close();
}
}
Hash
package com.shujia;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class RedisHash {
Jedis jedis;
@Before
// 会在执行@Test修饰的方法之前执行
public void init() {
jedis = new Jedis("master", 6379);
}
@Test
// 创建一个Hash散列
public void HSET() {
jedis.hset("hash1", "id", "1");
jedis.hset("hash1", "name", "张三");
jedis.hset("hash1", "age", "18");
jedis.hset("hash1", "gender", "男");
jedis.hset("hash1", "clazz", "文科四班");
}
@Test
// 获取Hash所有的key
public void HKEYS() {
Set<String> s = jedis.hkeys("hash1");
for (String s1 : s) {
System.out.println(s1);
}
}
@Test
// 获取Hash所有的Value
public void HVALS() {
List<String> l = jedis.hvals("hash1");
for (String s : l) {
System.out.println(s);
}
}
@Test
// 获取Hash所有的K-V
public void HGETALL() {
Map<String, String> m = jedis.hgetAll("hash1");
for (Map.Entry<String, String> kv : m.entrySet()) {
System.out.println(kv.getKey());
System.out.println(kv.getValue());
}
}
@Test
// 指定Field获取Value
public void HGET() {
System.out.println(jedis.hget("hash1", "name"));
}
@Test
// 根据Field删除Value
public void HDEL() {
jedis.hdel("hash1", "gender");
}
@Test
// 删除整个Hash散列
public void DEL() {
jedis.del("hash1");
}
@After
// 表示在@Test方法执行完成之后执行
public void closed() {
jedis.close();
}
}
Set
package com.shujia;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Set;
public class RedisSet {
Jedis jedis;
@Before
// 会在执行@Test修饰的方法之前执行
public void init() {
jedis = new Jedis("master", 6379);
}
@Test
// 创建Set
public void SADD() {
jedis.sadd("s1", "1", "2", "2", "2", "3", "4", "5", "6");
jedis.sadd("s2", "5", "6", "7", "8", "9");
}
@Test
// 移除元素
public void SREM() {
jedis.srem("s1", "1");
jedis.srem("s1", "4");
}
@Test
// 弹出一个元素,位置不确定
public void SPOP() {
String s1 = jedis.spop("s1");
System.out.println(s1);
}
@Test
// 获取所有的元素
public void SMEMBERS() {
Set<String> s1 = jedis.smembers("s1");
for (String s : s1) {
System.out.println(s);
}
}
@Test
// 集合常见的操作
public void SETOP() {
// 交集
System.out.println(jedis.sinter("s1", "s2"));
// 并集
System.out.println(jedis.sunion("s1", "s2"));
// 差集
System.out.println(jedis.sdiff("s1", "s2"));
}
@After
// 表示在@Test方法执行完成之后执行
public void closed() {
jedis.close();
}
}
#当IDEA出现 cannot download sources(无法下载source) 时
//将下面这行代码粘贴到IDEA的命令行里运行即可
mvn dependency:resolve -Dclassifier=sources
SortedSet
package com.shujia;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.ZParams;
import redis.clients.jedis.resps.Tuple;
import java.util.Set;
public class RedisSortedSet {
Jedis jedis;
@Before
// 会在执行@Test修饰的方法之前执行
public void init() {
jedis = new Jedis("master", 6379);
}
@Test
// 创建一个有序集合
public void ZADD() {
// zs1 表示水果一月份的销量
jedis.zadd("zs1", 10, "西瓜");
jedis.zadd("zs1", 10, "西瓜");
jedis.zadd("zs1", 7, "香蕉");
jedis.zadd("zs1", 7, "香蕉");
jedis.zadd("zs1", 7, "香蕉");
jedis.zadd("zs1", 5, "芒果");
jedis.zadd("zs1", 5, "芒果");
jedis.zadd("zs1", 8, "草莓");
// zs2 表示水果二月份的销量
jedis.zadd("zs2", 9, "哈密瓜");
jedis.zadd("zs2", 6, "西瓜");
jedis.zadd("zs2", 8, "香蕉");
jedis.zadd("zs2", 3, "香蕉");
jedis.zadd("zs2", 5, "香蕉");
jedis.zadd("zs2", 6, "甘蔗");
jedis.zadd("zs2", 7, "芒果");
jedis.zadd("zs2", 8, "草莓");
}
@Test
// 查看水果的累计销量
public void TwoMonthSUM() {
Set<Tuple> s = jedis.zunionWithScores(new ZParams().aggregate(ZParams.Aggregate.SUM), "zs1", "zs2");
System.out.println(s);
}
@After
// 表示在@Test方法执行完成之后执行
public void closed() {
jedis.close();
}
}
HyperLogLog
package com.shujia;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class RedisHyperLogLog {
Jedis jedis;
@Before
// 会在执行@Test修饰的方法之前执行
public void init() {
jedis = new Jedis("master", 6379);
}
@Test
public void PFADD() {
jedis.pfadd("hll1", "1", "1", "2", "3", "4", "4", "5");
jedis.pfadd("hll2", "1", "3", "4", "7", "4", "8", "5");
}
@Test
// 求一组数据(可能重复)的基数
public void PFCOUNT() {
System.out.println(jedis.pfcount("hll1"));
System.out.println(jedis.pfcount("hll2"));
}
@Test
// 合并两个HyperLogLog
public void PFMERGE() {
jedis.pfmerge("hll3", "hll1", "hll2");
System.out.println(jedis.pfcount("hll3"));
}
@After
// 表示在@Test方法执行完成之后执行
public void closed() {
jedis.close();
}
}
IDEA的一些快捷键
//快速复制一行
Ctrl + D
//将一行上下移动
Alt + shift + ↑/↓
//看方法中需要传什么参数
Ctrl + P
Redis连接池
package com.shujia;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class RedisConnectionPool {
// Redis连接池
public static void main(String[] args) {
// 使用默认的配置创建Redis连接池
JedisPool jedisPool = new JedisPool("master", 6379);
// 从连接池中取出一个连接
Jedis jedis = jedisPool.getResource();
// 使用连接进行操作
System.out.println(jedis.lrange("list1", 0, -1));
// 关闭连接
jedis.close();
// 关闭连接池
jedisPool.close();
}
}
Redis集群的连接
package com.shujia;
import redis.clients.jedis.ConnectionPool;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import java.util.HashSet;
import java.util.Map;
public class RedisClusterConn {
public static void main(String[] args) {
// 使用JedisCluster与集群进行通信建立连接
// 这里的端口号只要是Redis集群中的任意一个节点的端口号即可,具体原因参见Redis集群的概述及其搭建
// 因为Redis集群相当于一个整体,你连接一个,就相当于连接Redis集群整体
JedisCluster cluster = new JedisCluster(new HostAndPort("master", 6381));
//通过建立的连接直接 . 就行,这里的方法和Redis中的命令基本上都是一一对应的
cluster.set("cs1", "vv1");
System.out.println(cluster.get("cs1"));
cluster.hset("chs1", "f1", "v1");
cluster.hset("chs1", "f2", "v1");
cluster.hset("chs1", "f3", "v1");
Map<String, String> map = cluster.hgetAll("chs1");
for (Map.Entry<String, String> kv : map.entrySet()) {
System.out.println(kv.getKey());
System.out.println(kv.getValue());
}
//关闭连接
cluster.close();
}
}