13Spring中使用Jedis操作redis
Redis是一款开源的内存KV存储,相比较于membercached只有一种数据结构,redis支持多种数据结构。
Spring对Redis的支持
Spring中通过Spring Data Redis这个模块实现对Redis的支持。操作Redis的方式有以下几种:
- 支持的客户端 Jedis / Lettuce
- RedisTemplate
- Repository支持
Jedis客户端的简单使用
- Jedis的实例不是线程安全的,也就是在多线程场景下,不能使用同一个Jedis实例。
- 通过JedisPool中维护Jedis实例,当需要使用的时候从JedisPool中获取Jedis实例。
- 获取到Jedis实例之后进行对应业务方法的调用
talk is easy ,show me the code
引入Jedis依赖
redis.clients
jedis
配置创建JedisPoolConfig
由于Jedis实例非线程安全,所以使用JedisPool来创建维护Jedis。先在application.properties
文件中对JedisPool进行配置
redis.host=localhost
#连接池的最大数据库连接数 。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal ,在这之前使用maxActive
redis.maxTotal=5
#控制一个pool最多有多少个状态为空闲(idle)的jedis实例
redis.maxIdle=5
#在调用(borrow)一个jedis实例时,是否提前进行验证操作,如果为true,则得到的jedis实例均是可用的
redis.testOnBorrow=true
使用JedisPool的配置,创建JedisPoolConfig
这个Bean
@Bean
@ConfigurationProperties("redis")
public JedisPoolConfig jedisPoolConfig() {
return new JedisPoolConfig();
}
同样的,为什么是使用maxTotal、maxIdle、testOnBorrow这几个字段,而不是其他的其他名称的字段。首先前缀redis
是我们自己定义的,这个是可以修改的,这个就不多说了。
上图是JedisPoolconfig的类关系图,其父类中定义了maxTotal、maxIdle等字段。至于testOnBorrow这个字段名是在GenericObjectPoolConfig的父类BaseObjectPoolConfig中定义的。
配置创建JedisPool
@Bean(destroyMethod = "close")
public JedisPool jedisPool(@Value("${redis.host}") String host) {
return new JedisPool(jedisPoolConfig(), host);
}
使用自定义的JedisPoolConfig 并传入host信息,来完成JedisPool的创建。
使用Jedis实例操作Redis
try (Jedis jedis = jedisPool.getResource()) {
jedis.set("name", "张三");
log.info("redis value:{}", jedis.get("name"));
}
- 首先通过JedisPool获取Jedis实例
- 通过Jedis实例提供的API进行数据的存取
常用Util
public class RedisPool {
//Redis服务器IP
private static String ADDR = "127.0.0.1";
//Redis的端口号
private static int PORT = 6379;
//访问密码
private static String AUTH = "123456";
//可用连接实例的最大数目,默认值为8;
//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
private static int MAX_ACTIVE = 1024;
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private static int MAX_IDLE = 200;
//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
private static int MAX_WAIT = 10000;
private static int TIMEOUT = 10000;
//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
private static boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
/**
* 初始化Redis连接池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
// config.setMaxActive(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
// config.setMaxWait(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取Jedis实例
* @return
*/
public synchronized static Jedis getJedis() {
try {
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
return resource;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
更多配置信息
#ip地址
redis.hostName=172.20.1.205
#端口号
redis.port=6379
#如果有密码
redis.password=123456
#客户端超时时间单位是毫秒 默认是2000
redis.timeout=10000
#最大空闲数
redis.maxIdle=300
#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
#redis.maxActive=600
#控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
redis.maxTotal=1000
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWaitMillis=1000
#连接的最小空闲时间 默认1800000毫秒(30分钟)
redis.minEvictableIdleTimeMillis=300000
#每次释放连接的最大数目,默认3
redis.numTestsPerEvictionRun=1024
#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
redis.timeBetweenEvictionRunsMillis=30000
#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
redis.testOnBorrow=true
#在空闲时检查有效性, 默认false
redis.testWhileIdle=true