redis安装看这里:https://cloud.tencent.com/developer/article/1045316
需要的jar:commons-pool2 ,redis.clients
①. 进入这里查看操作redis的客户端语言及支持的操作方式: https://redis.io/clients
②.我选择的是jedis ,这里对jedis进行了一个小小的封装,经过简单的测试,挺好用的.
这里存储对象基本上都是以字节数组保存的,所以写了个序列化和反序列化的util
/**
* 序列化
* @param t
* @return
* @throws Exception
*/
public static <T> byte[] serializable(T t) throws Exception {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(t);
byte[] b = bos.toByteArray();
bos.close();
oos.close();
return b;
}
/**
* 反序列化
* @param b
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static <T> T unserializable(byte[] b) throws Exception {
ByteArrayInputStream bis = new ByteArrayInputStream(b);
ObjectInputStream ois = new ObjectInputStream(bis);
T t = (T) ois.readObject();
bis.close();
ois.close();
return t;
}
③.连接池创建:
private static final String CACHE_KEY = "cache-";
private static Jedis jedis;
private static JedisPool JEDIS_POOL = null;
static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(RedisConf.MAX_IDLE);
config.setMaxTotal(RedisConf.MAX_TOTAL);
config.setMaxWaitMillis(RedisConf.MAX_WAIT);
config.setMinIdle(RedisConf.MIN_IDLE);
JEDIS_POOL = new JedisPool(config, RedisConf.HOST, RedisConf.PORT, RedisConf.TIMEOUT,
RedisConf.AUTH);
// 获取jredis实例
getJRedis();
}
④.操作key-value键值对
public <K extends Serializable, V extends Serializable> void putMap(String key, Map<K, V> map)
throws Exception {
if (StringUtils.isEmpty(key) || map.size() < 1) {
return;
}
if (jedis == null) getJRedis();
jedis.set((CACHE_KEY + key).getBytes(), SerializableUtil.serializable(map));
// jedis.hmset(key.getBytes(), serializable(map));
}
public <K extends Serializable, V extends Serializable> Map<K, V> getMap(String key)
throws Exception {
if (StringUtils.isEmpty(key)) {
throw new NullPointerException("key empty!");
}
if (jedis == null) getJRedis();
if (!jedis.exists((CACHE_KEY + key).getBytes())) {
return null;
}
return SerializableUtil.unserializable(jedis.get((CACHE_KEY + key).getBytes()));
}
Map map = new HashMap();
map.put("age", 12);
map.put("name", "tony");
redis.put("map", map);
System.out.println(redis.getMap("map"));
//测试结果:
{age=12, name=tony}
⑤.操作一个对象:
/**
* 添加一个对象
*
* @param key
* @param t
* @throws Exception
*/
public <T extends Serializable> void putObject(String key, T t) throws Exception {
if (StringUtils.isEmpty(key) || t == null) {
return;
}
if (jedis == null) getJRedis();
jedis.set((CACHE_KEY + key).getBytes(), SerializableUtil.serializable(t));
}
/**
* 获取对象
*
* @param key
* @return
* @throws Exception
*/
@Deprecated
public <T extends Serializable> T getObject(String key) throws Exception {
if (StringUtils.isEmpty(key)) {
throw new NullPointerException("key empty!");
}
if (jedis == null) getJRedis();
return SerializableUtil.unserializable(jedis.get((CACHE_KEY + key).getBytes()));
}
redis.putObject("person", new Person(1, "timor", 19L, "male", new Date()));
System.out.println(redis.getObject("person"));
//测试结果
Person [id=1, name=timor, age=19, gender=male, birthday=Thu Sep 21 16:00:50 CST 2017]
⑥.操作一个list
/**
* 添加一个List集合
*
* @param key
* @param list
* @throws Exception
*/
@Deprecated
public <S extends Serializable> void putList(String key, List<S> list) throws Exception {
if (StringUtils.isEmpty(key) || list.size() < 1) {
return;
}
if (jedis == null) getJRedis();
jedis.set((CACHE_KEY + key).getBytes(), SerializableUtil.serializable(list));
}
@Deprecated
public <S extends Serializable> List<S> getList(String key) throws Exception {
if (StringUtils.isEmpty(key)) {
throw new NullPointerException("key empty!");
}
if (jedis == null) getJRedis();
return SerializableUtil.unserializable(jedis.get((CACHE_KEY + key).getBytes()));
}
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
redis.putList("my-list", list);
System.out.println(redis.getList("my-list"));
//测试结果
[a, b, c]
⑦.操作set:
/**
* 添加一个Set集合
*
* @param key
* @param set
* @throws Exception
*/
@Deprecated
public <S extends Serializable> void putSet(String key, Set<S> set) throws Exception {
if (StringUtils.isEmpty(key) || set.size() < 1) {
return;
}
if (jedis == null) getJRedis();
jedis.set((CACHE_KEY + key).getBytes(), SerializableUtil.serializable(set));
// for (byte[] b : serializable(set)) {
// jedis.sadd(key.getBytes(), b);
// }
}
@Deprecated
public <S extends Serializable> Set<S> getSet(String key) throws Exception {
if (StringUtils.isEmpty(key)) {
throw new NullPointerException("key empty!");
}
if (jedis == null) getJRedis();
return SerializableUtil.unserializable(jedis.get((CACHE_KEY + key).getBytes()));
}
RedisUtil redis = new RedisUtil();
Set<String> set = new HashSet<String>();
set.add("1");
set.add("2");
set.add("3");
redis.putSet("my-set", set);
System.out.println(redis.getSet("my-set"));
//测试结果
[3, 2, 1]
⑧. 上述写的过于麻烦,这里把上述全部废弃不再使用,下面是完整的代码:
private static final String CACHE_KEY = "cache-";
private static Jedis jedis;
private static JedisPool JEDIS_POOL = null;
static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(RedisConf.MAX_IDLE);
config.setMaxTotal(RedisConf.MAX_TOTAL);
config.setMaxWaitMillis(RedisConf.MAX_WAIT);
config.setMinIdle(RedisConf.MIN_IDLE);
JEDIS_POOL = new JedisPool(config, RedisConf.HOST, RedisConf.PORT, RedisConf.TIMEOUT,
RedisConf.AUTH);
// 获取jredis实例
getJRedis();
}
/**
* 根据key-获取值
* @param key
* @return
* @throws Exception
*/
public <T extends Serializable> T get(String key) throws Exception {
if (StringUtils.isEmpty(key)) return null;
if (jedis == null) getJRedis();
if (!jedis.exists((CACHE_KEY + key).getBytes())) return null;
T t = SerializableUtil.unserializable(jedis.get((CACHE_KEY + key).getBytes()));
return t;
}
/**
* 非持久化操作
* @param <T>
*
* @param key
* @param t
* @param seconds 过期时间
* @throws Exception
*/
public <T> void put(String key, T t ,int seconds) throws Exception {
if (StringUtils.isEmpty(key) || t == null || seconds < 1) {
return;
}
if (jedis == null) getJRedis();
jedis .setex((CACHE_KEY + key).getBytes(), seconds, SerializableUtil.serializable(t));
}
/**
* 持久化操作
* @param key
* @param t
* @throws Exception
*/
public <T> void put(String key, T t) throws Exception {
if (StringUtils.isEmpty(key) || t == null) {
return;
}
if (jedis == null) getJRedis();
jedis.set((CACHE_KEY + key).getBytes(), SerializableUtil.serializable(t));
}
/**
* 删除
* @param key
*/
public void remove(String key) {
jedis.del(key.getBytes());
}
private synchronized static void getJRedis() {
if (JEDIS_POOL == null) {
return;
}
jedis = JEDIS_POOL.getResource();
}
public interface RedisConf {
String HOST = "redis";
Integer PORT = 6379;
String AUTH = "123";// 密码 ,redis-conf文件中的 requirepass属性后的值即为密码
// 连接的最大数目,默认值为8;
// 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
Integer MAX_TOTAL = 100;
// 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。
// 如果超过等待时间,则直接抛出JedisConnectionException;
Integer MAX_WAIT = -1;
// 最大空闲的jedis实例个数,默认值也是8
Integer MAX_IDLE = 30;
// 最小连接数
Integer MIN_IDLE = 50;
// 连接超时时间
Integer TIMEOUT = 5000;
}
转载请注明出处谢谢!