【springboot学习】集成redis

java连接redis两种方式

方式一

	<dependency>
        <groupId>redis.clientsgroupId>
        <artifactId>jedisartifactId>
        <version>2.9.0version>
    dependency>
import redis.clients.jedis.Jedis;

public class JedisClient {

	public static void main(final String[] args) {
		Jedis jedis = null;
		try {
			jedis = new Jedis("我的阿里云服务器ip", 6379);
            jedis.auth("密码");
			String string = jedis.get("a");
			System.out.println(string);
		} finally {
			if (jedis != null) {
				jedis.close();
			}
		}
	}
}

jedis连接远程redis,连接超时java.net.SocketTimeoutException: connect timed out

Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
	at redis.clients.jedis.Connection.connect(Connection.java:207)
	at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93)
	at redis.clients.jedis.Connection.sendCommand(Connection.java:126)
	at redis.clients.jedis.Connection.sendCommand(Connection.java:117)
	at redis.clients.jedis.BinaryClient.auth(BinaryClient.java:564)
	at redis.clients.jedis.BinaryJedis.auth(BinaryJedis.java:2138)
	at com.study.FirstSpringBoot.service.JedisClient.main(JedisClient.java:12)
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:184)
	... 6 more

原因是远程服务器的6379端口没有对外开放。

firewall-cmd --add-port=6379/tcp --zone=public --permanent #开放6379端口号
firewall-cmd --reload #使上面的端口号立即生效

配置完成后,还是访问不了。原来是因为我的阿里云服务器需要配置安全组规则,在网页配置端口6379以及授权访问的IP地址。配置好了之后,就可以了。

方式二

但是jedis不是线程安全的,在多线程情况下,共享一个jedis实例,会导致java.net.SocketException: Socket closed,因为jedis每次执行命令都会new socket(),而socket在单个jedis实例是共享的。那就需要创建多个jedis实例,一个jedis实例相当于一个redis客户端,因为每个客户端维护一个连接,而socket连接很昂贵,这就需要对连接实例进行池化管理,降低性能消耗。JedisPool就是用来池化jedis.

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class JedisPoolClient {

	public static void main(final String[] args) {
		try {
			jedisPool= new JedisPool(config, "localhost", 6379);
			jedis = jedisPool.getResource();
			String result = jedis.get("a");
			System.out.println(result);
		} finally {
			if (jedis != null) {
				jedis.close();// 关闭连接,释放资源
			}
			if(jedisPool!=null) {
				jedisPool.close();
			}
		}
	}
}

连接池可以设置最大连接数、最大等待时间、最大空闲连接数等配置(连接池的通用配置,原理都一样!)

public class JedisPoolClient {

	public static void main(final String[] args) {
		JedisPoolConfig config=new JedisPoolConfig();
		config.setMaxIdle(10);//最大空闲连接数
		config.setMaxWaitMillis(10000);//最大等待时间
		config.setMaxTotal(30);//最大连接数
		
		try {
			jedisPool= new JedisPool(config, "localhost", 6379);
			jedis = jedisPool.getResource();
			String result = jedis.get("a");
			System.out.println(result);
		} finally {
			if (jedis != null) {
				jedis.close();// 关闭连接,释放资源
			}
			if(jedisPool!=null) {
				jedisPool.close();
			}
		}
	}
}

jedisapi列表

redis数据类型 redis命令 jedis命令 解释
key通用操作 del key del(key) 删除
key通用操作 ttl key ttl(key) 获取过期时间
String set key value set(key,value) 保存
String get key get(key) 获取
String setex key seconds value setex(key,seconds,value) 保存并设置过期时间
Hash hset key field value hset(key,field,value) 保存
Hash hget key field hget(key,field) 获取
Hash hdel key field hdel(key,field) 删除

参考文章

jedis线程安全:https://www.jianshu.com/p/5e4a1f92c88f

你可能感兴趣的:(SpringBoot,spring)