在真正的项目中,我们不可能手动的去完成对Redis数据库数据的存取,而是使用代码来完成对数据的存储,如果真的是手动存储的话,就会失去了意义。
如果你现在会没有安装Redis或者安装了不会相关的命令可以去我的另外两个文章去查看
https://blog.youkuaiyun.com/weixin_44007447/article/details/104506806
https://blog.youkuaiyun.com/weixin_44007447/article/details/104522958
好了,接下来我们进入正题,使用Java代码来完成对Redis数据库的操作。
Java连接Redis
1、导入jar包
java程序如果想要完成对Redis数据库的操作必须需要依赖两个jar包,如果没有相应jar包的同学,可以给我评论或者私信我。
2、单实例连接
导入相关jar包以后,我们就可以进行开发了。首先我们完成单例开发
使用Jedis
对象,该对象可以获取和数据的连接
Jedis jedis = new Jedis(host, port);
参数 host : 是你服务器的ip地址;
port : 是Redis数据库的端口号,默认使用 6379;
Jedis jedis = new Jedis("192.168.91.128",6379);
对象创建完成以后,我们就可以使用该对象的set(String key,String values)、get(String key) 方法来完成对Redis数据库的存储了,如果想要存储其他形式的数据可以转成JSON字符串。
jedis.set("addr","中国北京");
System.out.println(jedis.get("addr"));
String username = jedis.get("username");
System.out.println(username);
//通过java程序访问redis
@Test
//获取单一的jedis对象操作
public void test1(){
//1、获取连接对象
Jedis jedis = new Jedis("192.168.91.128",6379);
//获取数据
String username = jedis.get("username");
System.out.println(username);
//3、存储
jedis.set("addr","中国北京");
System.out.println(jedis.get("addr"));
}
3、连接超时
- 如果运行上面的代码时,抛出如下异常
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
at redis.clients.jedis.Connection.connect(Connection.java:154)
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:83)
at redis.clients.jedis.Connection.sendCommand(Connection.java:93)
at redis.clients.jedis.Connection.sendCommand(Connection.java:88)
at redis.clients.jedis.Jedis.get(Jedis.java:97)
at com.haiyang.redis.JedisTest.test1(JedisTest.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at redis.clients.jedis.Connection.connect(Connection.java:148)
... 28 more
- 必须设置linux防火墙
/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
4、连接池连接
现在我们讲一下使用连接池进行对Redis数据库进行连接
首先我们需要一个连接池 他就是我们的 JedisPool
对象
JedisPool pool = new JedisPool(poolConfig, host, port);
参数 poolConfig : 是一个连接池配置对象,等下详细解释
host : 字符串类型,服务器连接ip
port : Redis数据库端口号 ,默认 6379。
在讲解连接池之前我们先讲解下连接池需要的连接池配置对象 JedisPoolConfig
//创建池子的配置对象
JedisPoolConfig jpc = new JedisPoolConfig();
//连接池最大闲置时间
jpc.setMaxIdle(30);
//连接池最小闲置时间
jpc.setMinIdle(10);
//连接池最大连接数
jpc.setMaxTotal(50);
//创建一个redis连接池
JedisPool pool = new JedisPool(jpc,"192.168.91.128",6379);
//从池子中获取资源
Jedis jedis = pool.getResource();
//操作数据库
jedis.set("xxx","yyyy");
System.out.println(jedis.get("xxx"));
//关闭资源
jedis.close();
pool.close();
5、封装成工具类
这里我就不仔细给大家讲解步骤了,只是将该类封装成一个工具类,使用时直接调用方法就可以了
1、首先创建一个文件 如 redis.proterties 用于存储连接池配置数据及服务器ip地址和端口
redis.maxIdle=30
redis.minIdle=10
redis.maxTotal=50
redis.url=192.168.91.128
redis.port=6379
接下来直接上代码
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolUtils {
//创建一个池子
private static JedisPool pool = null;
static{
//加载配置资源
InputStream in = JedisPoolUtils.class.getClassLoader().getResourceAsStream("redis.properties");
Properties pro = new Properties();
try {
pro.load(in);
} catch (IOException e) {
e.printStackTrace();
}
//创建池子的配置对象
JedisPoolConfig jPoolConfig = new JedisPoolConfig();
jPoolConfig.setMaxIdle(Integer.parseInt(pro.get("redis.maxIdle").toString()));//最大闲置数
jPoolConfig.setMinIdle(Integer.parseInt(pro.get("redis.minIdle").toString())); //最小闲置数
jPoolConfig.setMaxTotal(Integer.parseInt(pro.get("redis.maxTotal").toString())); //最大连接数
//创建池子
pool = new JedisPool(jPoolConfig,pro.get("redis.url").toString(),Integer.parseInt(pro.get("redis.port").toString()));
}
//返回操作数据库的对象
public static Jedis getJedis(){
return pool.getResource();
}
public static void closeResource(){
getJedis().close();
pool.close();
}
}
以上就是我的学习心得,希望对大家有用,谢谢大家!