您的位置:首页 > 数据库 > Redis

Java中使用Jedis操作redis

2017-08-23 14:40 399 查看
一、下载jar包

可以在MAVEN仓库中下载所需的jar包

http://mvnrepository.com/artifact/redis.clients/jedis这是路径

如果需要使用jedis连接池的话需要commons-pool2,这个是Apache开发的

我是从http://www.mvnjar.com/中下载的,可以在这里下载到源码包,对于一些比较喜欢看源码的小伙伴比较有用

二、操作

public void stringTest() {
Jedis jedis = JedisUtil.getInstance().getJedis();
try {
// 设置指定 key 的值
jedis.set("strTest", "String");
// 获取指定 key 的值
System.out.println(jedis.get("strTest"));
// 将给定 key 的值设为 value ,并返回 key 的旧值(old value)
System.out.println(jedis.getSet("strTest", "Test"));
// 获取所有(一个或多个)给定 key 的值。
System.out.println(jedis.mget("email", "strTest"));
// 对某个键设置过期时间
jedis.expire("strTest", 15);

} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭连接
JedisUtil.getInstance().closeJedis(jedis);
}
}


public void listTest() {
Jedis jedis = JedisUtil.getInstance().getJedis();
try {
// 设置指定 key 的值,将一个或多个值插入到列表头部(没有就创建一个key,有则添加在头部)
jedis.lpush("strList", "String1", "String2", "String3","String4", "String5");
// 获取指定列表长度
System.out.println(jedis.llen("strList"));
// 获取指定 ListKey的值,从开始start开始,向后面取出stop个值
System.out.println(jedis.lrange("strList", 1, 5));
// 若超出则没有数据,不会报错
System.out.println(jedis.lrange("strList", 15, 5));
// 取出第几个索引值(索引从0开始)
System.out.println(jedis.lindex("strList", 0));
// 为第几个索引赋值(替换)
jedis.lset("strList", 3, "three");
// 超出索引的会报错(索引从0开始)
jedis.lset("strList", 9, "ten");// ERR index out of range
// 移出并获取列表的第一个元素
System.out.println(jedis.lpop("strList"));
// 移出并获取列表的最后一个元素
System.out.println(jedis.rpop("strList"));
// 在键的尾部插入值,并返回键的长度
System.out.println(jedis.rpush("strList", "may", "be"));

} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭连接
JedisUtil.getInstance().closeJedis(jedis);
}
}


还有一个map的就不贴出来了,小伙伴自己去研究

下面是Redis连接池:

package com.jie.util;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

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

public class JedisUtil {
/**
* 私有构造器
*/
private JedisUtil() {
}

/**
* 全局的Map
*/
private static Map<String, JedisPool> maps = new HashMap<String, JedisPool>();

/**
* @Description 获取连接池
* @auth weishujie
* @creattime 2017年8月18日上午10:52:30
* @param ip
* @param port
* @return
*/
private static JedisPool getPool(String ip, int port) {
String key = ip + ":" + port;// jedis的地址
JedisPool pool = null;
if (!maps.containsKey(key)) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(GenericObjectPoolConfig.DEFAULT_MAX_TOTAL);
config.setMaxIdle(GenericObjectPoolConfig.DEFAULT_MAX_IDLE);
config.setMaxWaitMillis(GenericObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS);
config.setTestOnBorrow(true);
config.setTestOnReturn(true);
try {
pool = new JedisPool(config, ip, port);
maps.put(key, pool);
} catch (Exception e) {
e.printStackTrace();
}
} else {
pool = maps.get(key);
}
return pool;
}

/**
* @Description 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
*                  没有绑定关系,而且只有被调用到时才会装载,从而实现了延迟加载。
* @author weishujie
* @data 2017年8月18日上午11:54:30
*/
private static class RedisUtilHolder<
b92d
/span> {
/**
* 静态初始化器,由JVM来保证线程安全
*/
private static JedisUtil instance = new JedisUtil();
}

/**
* 当getInstance方法第一次被调用的时候,它第一次读取
* RedisUtilHolder.instance,导致RedisUtilHolder类得到初始化;而这个类在装载并被初始化的时候,会初始化它的静态域,
* 从而创建RedisUtil的实例,由于是静态的域,因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性。
* 这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本。
*/
public static JedisUtil getInstance() {
return RedisUtilHolder.instance;
}

/**
* @Description 获取Jedis
* @auth weishujie
* @creattime 2017年8月18日下午12:06:51
* @param ip
* @param port
* @return
*/
public Jedis getJedis(String ip, int port) {
Jedis jedis = null;
int count = 0;
do {
jedis = getPool(ip, port).getResource();
count++;
} while (jedis == null && count < 3);// 重启三次,三次获取不到就结束
return jedis;
}

/**
* @Description 获取默认的Jedis
* @auth weishujie
* @creattime 2017年8月18日下午2:34:09
* @return
*/
public Jedis getJedis() {
return getJedis(Protocol.DEFAULT_HOST, Protocol.DEFAULT_PORT);
}

/**
* @Description 释放Jdeis到连接池
* @auth weishujie
* @creattime 2017年8月18日下午2:16:55
* @param jedis
* @param ip
* @param port
*/
@SuppressWarnings("deprecation")
public void closeJedis(Jedis jedis, String ip, int port) {
if (jedis != null) {
getPool(ip, port).returnResource(jedis);
}
}

/**
* @Description 直接关闭连接
* @auth weishujie
* @creattime 2017年8月18日下午2:36:57
* @param jedis
*/
public void closeJedis(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jedis redis