1.开启远程连接
Redis默认不支持远程连接,需要手动开启
修改配置文件 redis.conf
- 注释bind:127.0.0.1
- 启用密码校验,注释掉requirepass
修改完保存,然后使用配置文件启动redis
2.Jedis
创建Maven项目,pom文件里引入Jedis依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.0.0</version>
</dependency>
创建一个测试方法:
public static void main(String[] args) {
//构造一个Jedis对象
Jedis jedis = new Jedis("127.0.0.1",6379);
//校验密码
jedis.auth("qiongmei");
//测试是否连接成功,s返回控制台为pong
String s = jedis.ping();
System.out.println(s);
}
Jedis封装的API方法与Redis命令高度重合,直接使用即可。
2.2 Jedis连接池
Jedis对象本身线程不安全,一般通过连接池获取
public static void main(String[] args) {
Jedis jedis = null;
//构造一个Jedis连接池
JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
//连接池中获取一个Jedis连接
jedis = jedisPool.getResource();
jedis.auth("qiongmei");
try {
//操作数据库
String ping = jedis.ping();
} catch (Exception e) {
e.printStackTrace();
} finally {
//使用完毕后关闭连接
if (jedis != null)
jedis.close();
}
}
利用try-with-resource改进一下
public static void main(String[] args) {
JedisPool jedisPool = new JedisPool("127.0.0.1",6379);
try(Jedis jedis = jedisPool.getResource()) {
jedis.auth("qiongmei");
//操作数据库
String ping = jedis.ping();
}
}
继续改进可以封装成接口,通过调用实现类来操作。
//接口
public interface CallWithJedis {
void call(Jedis jedis);
}
//实现类
public class Redis {
private JedisPool pool;
public Redis() {
//连接池的配置,可以自己设置
GenericObjectPoolConfig config=new GenericObjectPoolConfig();
pool = new JedisPool(config,"127.0.0.1",6379,30000,"qiongmei");
}
public void excute(CallWithJedis callWithJedis) {
try (Jedis jedis = pool.getResource()) {
callWithJedis.call(jedis);
}
}
}
//调用方法
public static void main(String[] args) {
Redis redis = new Redis();
redis.excute(jedis -> {
String ping = jedis.ping();
System.out.println(ping);
});
}
3.Lettuce
Lettuce和Jedis比较:
- Jedis在实现过程中直接连接Redis,在多个线程中共享一个Jedis实例,线程不安全。多线程场景下使用连接池,每个线程获取自己的Jedis实例(消耗较多资源)
- Lettuce 基于Netty NIO 框架,克服了Jedis中线程不安全问题。Lettuce支持同步,异步,响应式调用,多个线程可以共享一个实例。
引入依赖
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.2.5.RELEASE</version>
</dependency>
简单的测试类
public static void main(String[] args) {
//密码写在连接里
RedisClient redisClient = RedisClient.create("redis://qiongmei@127.0.0.1");
StatefulRedisConnection<String, String> connect = redisClient.connect();
RedisCommands<String, String> sync = connect.sync();
sync.set("name","neko");
String name = sync.get("name");
System.out.println("name = " + name);
}