redis学习笔记(二)—redis使用中可能遇到的问题与解决方案
一、介绍
redis是基于内存的key-value持久化数据库。value支持string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
为什么要使用redis?
二、简单的redis存取值应用
注意这里首先需要打开redis服务器。
并且需要导入jedis的依赖包。
jedis地址:https://www.mvnjar.com/redis.clients/jedis/2.9.0/detail.html
package com.hx.demo;
import redis.clients.jedis.Jedis;
public class Demo {
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1",6379);
System.out.println("连接成功");
System.out.println("服务器正在运行" + jedis.ping());
jedis.set("hello", "123456");
System.out.println(jedis.get("hello"));
}
}
三、升级成redis连接池
- 配置文件
#主机
host:127.0.0.1
#端口
port:6379
#最大连接数
maxTotal=50
#最大空闲
maxIdle=10
#最小空闲
minIdle=2
##############################################################
#这些是其他配置 用到的时候再解开
#当池内没有返回对象时,最大等待时间
redis.pool.maxWaitMillis=10000
#当调用borrow Object方法时,是否进行有效性检查
redis.pool.testOnBorrow=true
#当调用return Object方法时,是否进行有效性检查
redis.pool.testOnReturn=true
#“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.
redis.pool.timeBetweenEvictionRunsMillis=30000
#向调用者输出“链接”对象时,是否检测它的空闲超时;
redis.pool.testWhileIdle=true
# 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.
redis.pool.numTestsPerEvictionRun=50
- 创建个数据库连接池的提供类
注意这里需要引入commons-pool依赖包
地址:https://www.mvnjar.com/org.apache.commons/commons-pool2/2.4.1/detail.html
package com.hx.utils;
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;
/**
* 加载配置文件,配置连接池参数
* 提供链接
* 关闭连接
* @author Huathy
*/
public class JedisPoolUtil {
private static JedisPool jedisPool;
//当类加载就读取配置文件
static{
//类加载加载配置文件
InputStream is=JedisPoolUtil.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建Properties对象
Properties prop=new Properties();
try {
//关联文件
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
}
//获取数据,设置数据
JedisPoolConfig config=new JedisPoolConfig();
//最大连接数
config.setMaxTotal(Integer.parseInt(prop.getProperty("maxTotal")));
//设置最大的空闲连接
config.setMaxIdle(Integer.parseInt(prop.getProperty("maxIdle")));
//设置保持最小idle状态的对象树
config.setMinIdle(Integer.parseInt(prop.getProperty("minIdle")));
//初始化JedisPool
jedisPool=new JedisPool(prop.getProperty("host"),Integer.parseInt(prop.getProperty("port")));
}
//获取Jedis
public static Jedis getJedis(){
return jedisPool.getResource();
}
//释放资源
public static void closeJedis(Jedis jedis){
if(jedis!=null){
jedis.close();
}
}
}
- 测试类
/**
* 测试redis连接池
* @author Huathy
*/
public class PoolDemo {
public static void main(String[] args) {
Jedis jedis = JedisPoolUtil.getJedis();
//存值
jedis.set("hello", "001");
//取值
System.out.println(jedis.get("hello"));
//删除值
jedis.del("hello");
//判断是否存在
System.out.println(jedis.exists("hello"));
JedisPoolUtil.closeJedis(jedis);
}
}
附录
redis命令参考文档:http://redisdoc.com/