文章目录
0 环境
- 系统环境: win10
- 编辑器: IDEA
- maven
1 前言
redis不支持远程连接 需手启
- 修改地方(找到config)
- 把bind:127.0.0.1注释掉
- 密码校验开启(去掉requirepass注解 在vim搜索:/requirepass)
- ok后 保存退出启动redis
2 Jedis(maven篇)基本使用
1 创建maven项目 添加依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
2 创建测试方法
// 一旦连接了 API方法和redis命令很相似 即学即用
public class MyJdis {
public static void main(String[] args) {
// 1 new一个jedis对象 默认6379
Jedis jedis = new Jedis("你的host");
// 2 密码认证
jedis.auth("123456");
// 3 测试是否连通
String ping = jedis.ping();
// 4 返回PONG 说明连接成功
System.out.println(ping);
}
}
3 启动
3 Jedis(maven篇)升级
1 连接池简介
一般是使用连接池 首先jedis对象非线程安全 使用jedis对象时 通过连接池获取jedis 用完归还给连接池
2 连接池改进
public class JedisPoolDemo {
public static void main(String[] args) {
// v1版
// test();
// v2版 添加异常(解决v1版 抛出异常时 无法执行的情况)
// test1();
// v3版 语法糖(jdk1.7 try-with-resource) 可在target目录找到相对应的xx.class查看发现还是那套
test2();
}
private static void test2() {
// 1 创建一个连接池
JedisPool jedisPool = new JedisPool("xxx", 6379);
try (Jedis jedis = jedisPool.getResource()) {
jedis.auth("123456");
// 3 jedis操作
String ping = jedis.ping();
System.out.println(ping);
}
}
// 添加异常 确保关闭连接
private static void test1() {
// 1 创建一个连接池
JedisPool jedisPool = new JedisPool("xxx", 6379);
// 2 从连接池中获取一个Jedis
Jedis jedis = jedisPool.getResource();
jedis.auth("123456");
try {
// 3 jedis操作
String ping = jedis.ping();
System.out.println(ping);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 4 关闭连接
if (jedis != null) {
jedis.close();
}
}
}
// 简化代码量
private static void test() {
// 1 创建一个连接池
JedisPool jedisPool = new JedisPool("xxx", 6379);
// 2 从连接池中获取一个Jedis
Jedis jedis = jedisPool.getResource();
jedis.auth("123456");
// 3 jedis操作
String ping = jedis.ping();
System.out.println(ping);
// 4 关闭连接
jedis.close();
}
}
3 对连接池强约束
public interface CallWithJedis {
void call(Jedis jedis);
}
public class CallRedisDemo {
private JedisPool jedisPool;
// 配置
public CallRedisDemo() {
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
// 连接池最大空闲数
config.setMaxIdle(300);
// 最大连接数
config.setMaxTotal(1000);
// 连接最大等待时间 若是-1 则无限制
config.setMaxWaitMillis(200000);
// 在空闲时检查有效性
config.setTestOnBorrow(true);
/*
* GenericObjectPoolConfig poolConfig, String host, int port, int timeout, String password
* 1 redis地址
* 2 redis端口
* 3 连接超时时间
* 4 密码
* */
jedisPool = new JedisPool(config, "xxxx", 6379, 20000, "123456");
}
// 执行
// 执行失败 --> 请求重试(这样语法糖就不能用了 试太多也没意思 估计有问题)
public void execute(CallWithJedis callWithJedis){
try (Jedis jedis = jedisPool.getResource()){
callWithJedis.call(jedis);
}
}
}
// 测试是否连接
public class CallWithJedisDemo {
public static void main(String[] args) {
CallRedisDemo redisDemo = new CallRedisDemo();
redisDemo.execute(jedis -> {
System.out.println(jedis.ping());
});
}
}
4 启动
4 lettuce简介
1 创建maven项目 添加其依赖
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
2 测试
public class LettuceTest {
public static void main(String[] args) {
// 密码和host直接写在一起
RedisClient redisClient = RedisClient.create("redis://密码@你的host");
StatefulRedisConnection<String, String> connect = redisClient.connect();
RedisCommands<String, String> sync = connect.sync();
sync.set("name", "kitty");
String name = sync.get("name");
System.out.println(name);
}
}
3 启动
5 小结
jedis -> 连接池的改进 添加异常 添加语法糖 强约束 通过接口
jedis和lettuce对比
- jedis直接连接redis 线程不安全 多个线程间共享一个jedis实例 想多线程 得加连接池 保证每个线程都有自己的jedis实例
- lettuce由netty nio构建(解决jedis中线程不安全的问题 封装的更凶) 并且支持同步 异步 响应调用 多个线程共享一个实例