REDIS学习(5)jedis 和 jedis连接池

来源:互联网 发布:java异常分类及处理 编辑:程序博客网 时间:2024/05/16 00:45

一,准备

目前情况是 srping boot中测试代码

mvn的包为:

<dependency><groupId>org.springframework.boot</groupId><!-- 会附带引进jedis-2.7.3的包 --><artifactId>spring-boot-starter-redis</artifactId></dependency>

如果你不是用的spring boot而是其他,则mvn为:

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency>

二,Jedis

测试代码:

public class Test {public static void main(String[] args) {testList();}/** jedis 操作字符串 */public static void test() {try (Jedis jedis = new Jedis("119.29.52.126", 6377);) {jedis.auth("foobared");jedis.select(3);// 选择数据库Logger.getGlobal().info(jedis.select(3));// 增jedis.set("gao", "tian");// 每次都会覆盖旧的key <gao,tian>jedis.append("gao", "yue");// 追加,<gao,tianyue>jedis.mset("a", "A", "b", "B");// 多个增加// 删jedis.del("gao");// 查Logger.getGlobal().info(jedis.get("a"));// 计数Logger.getGlobal().info("" + jedis.decr("count"));Logger.getGlobal().info("" + jedis.incr("num"));} catch (Exception e) {e.printStackTrace();}}/** jedis 操作List */public static void testList() {try (Jedis jedis = new Jedis("119.29.52.126", 6377);) {jedis.auth("foobared");jedis.select(3);// 选择数据库Logger.getGlobal().info(jedis.select(3));// 删jedis.del("list0");// 增加,后来的放在第一个jedis.lpush("list0", "gao");jedis.lpush("list0", "tian");jedis.lpush("list0", "yue");// 增加,后来的放到最后一个jedis.del("list0");jedis.rpush("list0", "1");jedis.rpush("list0", "3");jedis.rpush("list0", "2");// 取List<String> all = jedis.lrange("list0", 0, -1);Logger.getGlobal().info("" + all);//只有当list的值都是数字时,才能排序,而且数据库中的原来的list顺序不变Logger.getGlobal().info(""+jedis.sort("list0"));Logger.getGlobal().info("" + jedis.lrange("list0", 0, -1));} catch (Exception e) {e.printStackTrace();}}/** jedis 操作map */public static void testMap() {try (Jedis jedis = new Jedis("119.29.52.126", 6377);) {jedis.auth("foobared");jedis.select(3);// 选择数据库Logger.getGlobal().info(jedis.select(3));// 存Map<String, String> map = new HashMap<>();map.put("a0", "A0");map.put("a1", "A1");map.put("a2", "A2");jedis.hmset("map0", map);// 多次执行,不会覆盖上一个key下的map,而是相当于对数据库中的一个map做了操作// jedis.del("map0");//删掉整个map// 删除map中某个键的值jedis.hdel("map0", "a2");// 取List<String> list = jedis.hmget("map0", "a0", "a1", "a2", "a3");// 如果map不存在也不会报错而是返回[null,  null, null, null]Logger.getGlobal().info("" + list);// [A0, A1, null, null]Logger.getGlobal().info("" + jedis.hmget("map0", "a0"));Logger.getGlobal().info("" + jedis.hexists("map0", "a0"));// 判断此map是否有这个键Logger.getGlobal().info("" + jedis.hlen("map0"));// key存在的个数Logger.getGlobal().info("" + jedis.hkeys("map0"));// 返回所有的key [a1,// a0]Logger.getGlobal().info("" + jedis.hvals("map0"));// 返回所有的value [A0,// A1]// 输出所有键值jedis.hkeys("map0").forEach(key -> {Logger.getGlobal().info(key + "=" + jedis.hmget("map0", key));});} catch (Exception e) {e.printStackTrace();}}/** jedis 操作Set */public static void testSet() {try (Jedis jedis = new Jedis("119.29.52.126", 6377);) {jedis.auth("foobared");jedis.select(3);// 选择数据库, 返回值是"OK"// 删jedis.del("set0");//增加jedis.sadd("set0", "a");jedis.sadd("set0", "b");jedis.sadd("set0", "c");jedis.sadd("set0", "a");jedis.sadd("set0", "d");jedis.sadd("set0", "e");jedis.sadd("set0", "f");// 删除某个jedis.srem("set0", "e", "f");// 取Logger.getGlobal().info("" + jedis.sismember("set0", "a"));//是否在set中Logger.getGlobal().info("" + jedis.scard("set0"));//所有的set的个数4Logger.getGlobal().info("" + jedis.smembers("set0"));//取出所有的set[c, d, a, b]Logger.getGlobal().info("" + jedis.srandmember("set0", 2));//随机取出2个值} catch (Exception e) {e.printStackTrace();}}}

看图:




三,Jedis连接池

使用连接池可以减少Jedis以及其socket的创建和关闭的资源的消耗。下面是使用方法,采用try-with-resource集中资源管理。自动调用Jedis的close方法,程序会自动判断是否设置了资源池,是的话则放回jedis pool,反之则关闭连接,关闭socket。

下面是Jedis.close()的API


下面是我写的Jedis连接池的代码:

public class JedisPoolTool {private JedisPoolTool() {}private static JedisPoolTool instance = null;public static synchronized JedisPoolTool inst() {if (null == instance) {instance = new JedisPoolTool();}return instance;}JedisPool pool;/** * @param host * @param port * @param timeout *            此参数表示,连接池建立的时候连接redis的时候,如果超过多常见时间没有连接成功则返回失败的异常, *            设置为0则不启用此规则,单位应该是毫秒,设置为10的时候报错java.net.SocketTimeoutException: *            connect timed out * @param psw * @param database */public void init(String host, int port, int timeout, String psw, int database) {JedisPoolConfig poolConfig = new JedisPoolConfig();pool = new JedisPool(poolConfig, host, port, timeout, psw, database);}public Jedis getJedis() {return pool.getResource();}public static void main(String args[]) {JedisPoolTool.inst().init("119.29.111.111", 6377, 10, "foobared", 12);try (Jedis jedis = JedisPoolTool.inst().getJedis()) {String result = jedis.set("b0", "B00");Logger.getGlobal().info(result);Logger.getGlobal().info(jedis.get("b0"));} catch (Exception e) {e.printStackTrace();}}}

0 1