Jedis连接池使用
构建redis连接池,返还到连接池
private static JedisPool jedisPool = null;
private static Jedis jedis; static {
jedis = getJedisPool().getResource();
} /**
* 构建redis连接池
*/
public static JedisPool getJedisPool() {
if (jedisPool == null) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(1024); // 可用连接实例的最大数目,如果赋值为-1,表示不限制.
config.setMaxIdle(5); // 控制一个Pool最多有多少个状态为idle(空闲的)jedis实例,默认值也是8
config.setMaxWaitMillis(1000 * 100); // 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时/如果超过等待时间,则直接抛出异常
config.setTestOnBorrow(true); // 在borrow一个jedis实例时,是否提前进行validate操作,如果为true,则得到的jedis实例均是可用的
jedisPool = new JedisPool(config, "127.0.0.1", 6379);
}
return jedisPool;
} /**
* 释放jedis资源
*/
public static void returnResource(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
jedis使用
- 典型的jedis使用方法
public static String get(String key) {
String value = null;
Jedis jedis = null;
try {
JedisPool pool = getJedisPool();
jedis = pool.getResource();
value = jedis.get(key);
}
catch (Exception e) {
returnResource(jedis);
e.printStackTrace();
}
finally {
returnResource(jedis);
}
return value;
}
这种写法会经常忘记返回jedis到pool.参考Spting JdbcTemplate的实现方式,优化如下
- 优化jedis使用方法
public static String getByTemplate(final String key) {
RedisTemplate redisTemplate = new RedisTemplate(getJedisPool());
String value = redisTemplate.execute(new RedisCallback<String>() {
@Override
public String handle(Jedis jedis) {
return jedis.get(key);
}
});
return value;
}RedisTemplate封装了从JedisPool中取jedis以及返回池中
public class RedisTemplate { private JedisPool jedisPool; public RedisTemplate(JedisPool jedisPool) {
this.jedisPool = jedisPool;
} public <T> T execute(RedisCallback<T> callback) {
Jedis jedis = jedisPool.getResource();
try {
return callback.handle(jedis);
}
catch (Exception e) {
// throw your exception
throw e;
}
finally {
returnResource(jedis);
}
} private void returnResource(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
}
public interface RedisCallback<T> {
public T handle(Jedis jedis);
}
- 常用的jedis方法
字符串
@Test
public void testString() {
jedis.set("name", "webb"); // 添加数据
System.out.println("name -> " + jedis.get("name")); jedis.append("name", " , javaer"); // 拼接
System.out.println("name -> " + jedis.get("name")); jedis.del("name"); // 删除数据
System.out.println("name -> " + jedis.get("name")); jedis.mset("name", "webb", "age", "24"); // 设置多个键值对
jedis.incr("age"); // 进行加1操作 System.out.println("name -> " + jedis.get("name") + ", age -> " + jedis.get("age"));
}
列表
@Test
public void testList() {
String key = "java framework"; jedis.lpush(key, "spring");
jedis.lpush(key, "spring mvc");
jedis.lpush(key, "mybatis"); System.out.println(jedis.lrange(key, 0 , -1)); // -1表示取得所有 jedis.del(key);
jedis.rpush(key, "spring");
jedis.rpush(key, "spring mvc");
jedis.rpush(key, "mybatis"); System.out.println(jedis.lrange(key, 0 , -1)); // -1表示取得所有 System.out.println(jedis.llen(key)); // 列表长度
System.out.println(jedis.lrange(key, 0, 3));
jedis.lset(key, 0 , "redis"); // 修改列表中单个值
System.out.println(jedis.lindex(key, 1)); // 获取列表指定下标的值
System.out.println(jedis.lpop(key)); // 列表出栈
System.out.println(jedis.lrange(key, 0 , -1)); // -1表示取得所有
}
散列
@Test
public void testMap() {
String key = "user"; Map<String, String> map = new HashMap<>();
map.put("name", "webb");
map.put("age", "24");
map.put("city", "hangzhou"); jedis.hmset(key, map); // 添加数据 List<String> rsmap = jedis.hmget(key, "name", "age", "city"); // 第一个参数存入的是redis中map对象的key,后面跟的是放入map中的对象的key
System.out.println(rsmap); jedis.hdel(key, "age"); // 删除map中的某个键值 System.out.println(jedis.hmget(key, "age"));
System.out.println(jedis.hlen(key)); // 返回key为user的键中存放的值的个数
System.out.println(jedis.exists(key)); // 是否存在key为user的记录
System.out.println(jedis.hkeys(key)); // 返回map对象中的所有key
System.out.println(jedis.hvals(key)); // 返回map对象中所有的value Iterator<String> iterator = jedis.hkeys("user").iterator(); while (iterator.hasNext()) {
String key2 = iterator.next();
System.out.print(key2 + " : " + jedis.hmget("user", key2) + "\n");
}
}
集合
@Test
public void testSet() {
String key = "userSet";
String key2 = "userSet2"; jedis.sadd(key, "webb");
jedis.sadd(key, "webb");
jedis.sadd(key, "lebo");
jedis.sadd(key, "lebo0425");
jedis.sadd(key, "who"); jedis.srem(key, "who"); // 删除 System.out.println(jedis.smembers(key)); // 获取所有加入的value
System.out.println(jedis.sismember(key, "who")); // 判断value是否在集合中
System.out.println(jedis.srandmember(key)); // 随机返回一个value
System.out.println(jedis.scard(key)); // 返回集合的元素个数 jedis.sadd(key2, "webb");
jedis.sadd(key2, "ssq"); System.out.println(jedis.sinter(key, key2)); // 交集
System.out.println(jedis.sunion(key, key2)); // 并集
System.out.println(jedis.sdiff(key, key2)); // 差集
}
有序集合
@Test
public void testSortedSet() {
String key = "sortedSet"; jedis.zadd(key, 1999, "one");
jedis.zadd(key, 1994, "two");
jedis.zadd(key, 1998, "three");
jedis.zadd(key, 2000, "four");
jedis.zadd(key, 2017, "five"); Set<String> setValues = jedis.zrange(key, 0 , -1); // score从小到大
System.out.println(setValues);
Set<String> setValues2 = jedis.zrevrange(key, 0, -1); // score从大到小
System.out.println(setValues2); System.out.println(jedis.zcard(key)); // 元素个数
System.out.println(jedis.zscore(key, "three")); // 元素下标
System.out.println(jedis.zrange(key, 0, -1)); // 集合子集
System.out.println(jedis.zrem(key, "five")); // 删除元素
System.out.println(jedis.zcount(key, 1000, 2000)); // score在1000-2000内的元素个数
}
参考文章:
1.https://my.oschina.net/u/866190/blog/389543
2.http://blog.csdn.net/edagarli/article/details/21887111
Jedis连接池使用的更多相关文章
- Java与redis交互、Jedis连接池JedisPool
Java与redis交互比较常用的是Jedis. 先导入jar包: commons-pool2-2.3.jar jedis-2.7.0.jar 基本使用: public class RedisTest ...
- Jedis连接池
jedis是官方首选的java客户端开发包 Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java.C.C#.C++.php.Node.js.Go等. 在官方网站里列一些Ja ...
- 详解Jedis连接池报错处理
在使用Jedis连接池模式下,比较常见的报错如下: redis.clients.jedis.exceptions.JedisConnectionException:Could not get a re ...
- 为什么要用Jedis连接池+浅谈jedis连接池使用
为什么要使用Jedis连接池 Redis作为缓存数据库理论上和MySQL一样需要客户端和服务端建立起来连接进行相关操作,使用MySQL的时候相信大家都会使用一款开源的连接池,例如C3P0.因为直连会消 ...
- Jedis与Jedis连接池
1.Jedis简介 实际开发中,我们需要用Redis的连接工具连接Redis然后操作Redis, 对于主流语言,Redis都提供了对应的客户端: https://redis.io/clients 2. ...
- 三、redis学习(jedis连接池)
一.jedis连接池 二.jedis连接池+config配置文件 三.jedis连接池+config配置文件+util工具类 util类 public class JedisPoolUtils { / ...
- Java Redis系列3(Jedis的使用+jedis连接池技术)
Jedis的使用 什么是Jedis? 一款Java操作redis数据库的工具 使用步骤 1.下载redis所需的java包 2.使用步骤 import org.junit.Test; public c ...
- Jedis 连接池的基本使用
jedis直连 每次操作都会创建一个jedis对象,执行完毕后关闭连接后释放,对应的就是一次Tcp连接. jedis连接池 预先生成一批jedis连接对象放入连接池中,当需要对redis进行操作时从连 ...
- jedis连接池详解(Redis)
转自:http://tianxingzhe.blog.51cto.com/3390077/1684306 原子性(atomicity): 一个事务是一个不可分割的最小工作单位,事务中包括的诸操作要么都 ...
随机推荐
- MapReduce简介以及详细配置
1.MapReduce(一个分布式运算框架)将数据分为数据块,发送到不同的节点,并行方式处理. 2.NodeManager和DataNode在一个节点上,程序与数据在一个节点. 3.内容分为两个部分 ...
- MyBatis 源码分析——映射结果
MyBatis最后一步一定是处理相关的结果——把数据映射成对应的模型对象.事实上在笔者看来如果读者们了解了mybatis如何去执行数据库,又是如何处理数据结果.那么就了解了mybatis的主要路线.因 ...
- Android 中基于 Binder的进程间通信
摘要:对 Binder 工作机制进行了分析. 首先简述 Android 中 Binder 机制与传统的 Linux 进程间的通信比较,接着对基于 Binder 进程间通信的过程分析 最后结合开发实例 ...
- sql语句实现累计数
前言,要实现按某个字段统计,直接用count/sum……group by语句就可以实现,但是要实现累计统计,比如按时间累计统计,从12月3号开始累计数据,比如:4号统计3.4号的数据,5号统计3.4. ...
- 深入探究stm32GPIO口模式(类比51)
关于STM32GPIO口的8种工作模式,我们先引出一些问题? STM32GPIO口如果既要输入又要输出怎么办? 1.浮空输入模式 上图红色的表示便是浮空输入的过程,外部输入时0读出的就是0,外部输入时 ...
- js原生的轮播图
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- [SinGuLaRiTy] ZKW线段树
[SinGuLaRiTy-1007] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. 关于ZKW线段树 Zkw线段树是清华大学张昆玮发明非递 ...
- poptest老李谈分布式与集群
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...
- 用Xamarin + VS 编写Android程序体验及其与Android Studio的比较
昨天看了微软2016Build大会,Xamarin免费了.恩,5亿美刀的家伙,哈哈,我也要体验一下..... 1. 首先在Xamarin官网下载安向导:https://www.xamarin.com/ ...
- python 自动化接口测试(6)
迎接新的一波更新吧,这次是基于图灵机器人的一个api接口的测试. 这是api的接口:http://www.tuling123.com/openapi/api 我们试着通过浏览器直接访问看下 这是反馈的 ...