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

JAVA对Redis的使用

2016-05-26 16:14 447 查看
package com.redis.learn.util;

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

public class RedisTool {

//Redis服务器地址
private static String address = "localhost";
//Redis服务器端口号
private static int port = 6379;
//访问密码
private static String auth = null;
//可用连接实例的最大数目,默认值为8;
//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
//private static final int MAX_ACTIVE = 1024;

//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private static int MAX_IDLE = 10;
//等待可用连接的最大时间,单位毫秒,默认值为-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;

static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
//config.setMaxTotal(MAX_ACTIVE);
jedisPool = new JedisPool(config, address, port, TIMEOUT);
}

/**
* 获取Jedis客户端
* @return
*/
public static Jedis getJedis() {
Jedis jedis = null;
if(null != jedisPool) {
jedis = jedisPool.getResource();
}
return jedis;
}

/**
* 返还资源
* @param jedis
*/
public static void returnResource(Jedis jedis) {
jedisPool.returnBrokenResource(jedis);
}
}

package com.redis.learn.util;

import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;
import java.util.Set;

import redis.clients.jedis.Jedis;

/**
* Redis相关操作
* @author xianglj
*/
public class RedisUtil {

private static final Charset UTF_8 = Charset.forName("utf-8");

/**
* 向redis新增字符串键值对
* @param key
* @param value
*/
public static boolean setString(String key, String value) {
if(null == key || value == null ) {
return false;
}

return setBytes(key.getBytes(UTF_8), value.getBytes(UTF_8));
}

/**
* 向Redis中储存键值对的byte数组,最长不能超过1GB的字节
* @param key 键
* @param value 值
* @return
*/
public static boolean setBytes(byte[] key, byte[] value) {
if(null == key || null == value) {
return false;
}

Jedis jedis = RedisTool.getJedis();
String statusCode = jedis.set(key, value);
System.out.println("状态码:(" + statusCode + ")");
RedisTool.returnResource(jedis);
return true;
}

/**
* 获取String类型的值
* @param key 键的值
* @return
*/
public static String getString(String key) {
if(null == key) {
return null;
}

byte[] val = getBytes(key.getBytes(UTF_8));
if(val == null) {
return null;
}
return new String(val, UTF_8);
}

/**
* 获取Redis中的缓存值
* @param key
* @return
*/
public static byte[] getBytes(byte[] key) {
if(null == key) {
return null;
}

Jedis jedis = RedisTool.getJedis();
byte[] val = jedis.get(key);
RedisTool.returnResource(jedis);
return val;
}

/**
* 删除某个键,如果键被删除,再次请求相同键时,返回null
* @param key
*/
private static boolean del(byte[] key) {
if(null == key) {
return true;
}

Jedis jedis = RedisTool.getJedis();
jedis.del(key);
return true;
}

/**
* 操作字符串类型(String),删除键
* @param key
* @return
*/
public static boolean delString(String key) {
if(null == key) {
return true;
}

byte[] k = key.getBytes(UTF_8);
return del(k);
}

/**
* 批量插入缓存:<br>
* key,value,key,value<br>
* 例如<br>
* name,johnny,age,12<br>
* 则会新增name=johnny,age=12的缓存,如果在缓存中已经存在相同的缓存,则会立即更新。
* @param keyValues
* @return
*/
public static boolean fetchSet(String ... keyValues) {
if(keyValues == null) {
return false;
}

Jedis jedis = RedisTool.getJedis();
jedis.mset(keyValues);
RedisTool.returnResource(jedis);
return true;
}

/**
* 插入一个简单类型的Map
* @param key
* @param map
*/
public static void addMap(String key, Map<String, String> map) {
if(null == key || null == map) {
return;
}

Jedis jedis = RedisTool.getJedis();
jedis.hmset(key, map);
RedisTool.returnResource(jedis);
}

public static void addMapVal(String key, String field, String value) {
if(null == key || field == null || null == value) {
return;
}
Jedis jedis = RedisTool.getJedis();
jedis.hsetnx(key, field, value);
RedisTool.returnResource(jedis);
}

public static void addMapVal(byte[] key, byte[] field, byte[] value) {
if(null == key || field == null || null == value) {
return;
}
Jedis jedis = RedisTool.getJedis();
jedis.hsetnx(key, field, value);
RedisTool.returnResource(jedis);
}

/**
* 向Redis中插入一个Map的值
* @param key
* @param mapByte
*/
public static void addMap(byte[] key, Map<byte[], byte[]> mapByte) {
if(null == key || null == mapByte) {
return;
}

Jedis jedis = RedisTool.getJedis();
//总是会返回OK,并不会执行失败
String status = jedis.hmset(key, mapByte);
System.out.println("执行状态:" + status);
RedisTool.returnResource(jedis);
}

/**
* 获取Map中的值,只能够
* @param key
* @return
*/
public static List<String> getMapVal(String key, String ... fields) {
if(null == key) {
return null;
}

Jedis jedis = RedisTool.getJedis();

List<String> rtnList = null;
if(null == fields || fields.length == 0) {
rtnList = jedis.hvals(key);
} else {
rtnList = jedis.hmget(key, fields);
}

RedisTool.returnResource(jedis);
return rtnList;
}

/**
* 获取Map中的值
* @param key
* @param fields
* @return
*/
public static List<byte[]> getMapVal(byte[] key, byte[] ... fields) {
if(null == key) {
return null;
}
Jedis jedis = RedisTool.getJedis();

if(!jedis.exists(key)) {
return null;
}
List<byte[]> rtnList = null;
if(null == fields || fields.length == 0) {
rtnList = jedis.hvals(key);
} else {
rtnList = jedis.hmget(key, fields);
}

return rtnList;
}

/**
* 向Redis中添加set集合
* @param key
* @param values
*/
public static void addSet(String key, String ... values) {
if(null == key || values == null) {
return;
}
Jedis jedis = RedisTool.getJedis();
jedis.sadd(key, values);
}

public static void delSetVal(String key, String ... fields) {
if(null == key) {
return;
}

if(fields == null || fields.length == 0) {
del(key.getBytes(UTF_8));
return;
}

Jedis jedis = RedisTool.getJedis();
jedis.srem(key, fields);
RedisTool.returnResource(jedis);
}

public static void addSetBytes(byte[] key, byte[]...values) {
if(null == key || values == null) {
return;
}

Jedis jedis = RedisTool.getJedis();
jedis.sadd(key, values);
RedisTool.returnResource(jedis);
}

public static void delSetVal(byte[] key, byte[]...values) {
if(null == key) {
return;
}
if(values == null || values.length == 0) {
del(key);
return;
}
Jedis jedis = RedisTool.getJedis();
jedis.srem(key, values);
RedisTool.returnResource(jedis);
}

/**
* 获取所有的值
* @param key
*/
public static Set<byte[]> getSetVals(byte[] key) {
if(null == key) {
return null;
}
Jedis jedis = RedisTool.getJedis();
Set<byte[]> rtnList = jedis.smembers(key);
return rtnList;
}

public static Set<String> getSetVals(String key) {
if(null == key) {
return null;
}
Jedis jedis = RedisTool.getJedis();
Set<String> rtnSet = jedis.smembers(key);
RedisTool.returnResource(jedis);
return rtnSet;
}

/**
* 判断是否Set集合中包含元素
* @param key
* @param field
* @return
*/
public static boolean isSetContain(String key, String field) {
if(null == key || field == null) {
return false;
}
Jedis jedis = RedisTool.getJedis();
boolean isContain = jedis.sismember(key, field);
RedisTool.returnResource(jedis);
return isContain;
}

public static boolean isSetContain(byte[] key, byte[] field) {
if(null == key || field == null) {
return false;
}
Jedis jedis = RedisTool.getJedis();
boolean isSuccess = jedis.sismember(key, field);
RedisTool.returnResource(jedis);
return isSuccess;
}

/**
* 返回Set集合中的元素个数
* @param key
* @return
*/
public static Long getSetLength(String key) {
if(null == key) {
return 0L;
}
Jedis jedis = RedisTool.getJedis();
Long length = jedis.scard(key);
return length;
}

public static Long getSetLength(byte[] key) {
if(null == key) {
return 0L;
}
Jedis jedis = RedisTool.getJedis();
Long length = jedis.scard(key);
RedisTool.returnResource(jedis);
return length;
}

/**
* 向list集合中添加元素
* @param key
* @param values
*/
public static void addList(String key, String ...values) {
if(null == key || values == null) {
return;
}

Jedis jedis = RedisTool.getJedis();
jedis.rpush(key, values);
RedisTool.returnResource(jedis);
}

/**
* 向list集合中添加元素
* @param key
* @param values
*/
public static void addList(byte[] key, byte[] ...values) {
if(null == key || values == null) {
return;
}

Jedis jedis = RedisTool.getJedis();
jedis.rpush(key, values);
RedisTool.returnResource(jedis);
}

/**
* 获取start到end范围的值,超出list的范围,不会抛出异常
* @param key
* @param start
* @param end
* @return
*/
public static List<String> getListVals(String key, int start, int end) {
if(null == key) {
return null;
}

Jedis jedis = RedisTool.getJedis();
List<String> rtnList = jedis.lrange(key, start, end);
RedisTool.returnResource(jedis);
return rtnList;
}

/**
* 获取start到end范围的值,超出list的范围,不会抛出异常
* @param key
* @param start
* @param end
* @return
*/
public static List<byte[]> getListVals(byte[] key, int start, int end) {
if(null == key) {
return null;
}

Jedis jedis = RedisTool.getJedis();
List<byte[]> rtnList = jedis.lrange(key, start, end);
RedisTool.returnResource(jedis);
return rtnList;
}

public static List<String> getListAll(String key) {
if(null == key) {
return null;
}
return getListVals(key, 0, -1);
}

public static List<byte[]> getListAll(byte[] key) {
if(null == key) {
return null;
}
return getListVals(key, 0, -1);
}

public static String popList(String key) {
if(null == key) {
return null;
}
Jedis jedis = RedisTool.getJedis();
return jedis.lpop(key);
}
public static byte[] popList(byte[] key) {
if(null == key) {
return null;
}
Jedis jedis = RedisTool.getJedis();
return jedis.lpop(key);
}
}

package com.redis.learn.client;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Test;

import com.redis.learn.util.RedisUtil;

public class RedisUtilTest {

private static final Charset UTF_8 = Charset.forName("utf-8");

@Test
public void testString() {
System.err.println("测试String类型开始>>\r\n\t");

String key = "Program Name";
String value = "Redis For Windows";
String value1 = "Input Redis For bytes";
RedisUtil.setString(key, value);
RedisUtil.setBytes(key.getBytes(UTF_8), value1.getBytes(UTF_8));

System.out.println("从Redis中获取name:>>>\r\n\t");
String val = RedisUtil.getString(key);
System.out.println("输出:\r\n\t" + val);

System.out.println("从Redis中获取name bytes:>>>>\r\n\t");
byte[] bytes = RedisUtil.getBytes(key.getBytes(UTF_8));
System.out.println("输出bytes:\r\n\t" + Arrays.toString(bytes));
val = new String(bytes, UTF_8);
System.out.println("转换后String:\r\n\t" + val);

System.out.println("删除name的键:\r\n\t");
RedisUtil.delString(key);
val = RedisUtil.getString(key);
System.out.println("再次获取:" + (val==null?"该键已被删除..":val));
}

@Test
public void testMap() {

System.err.println("测试Redis For Map 开始:>>>>");

//简单的string map
Map<String, String> strMap = new HashMap<String, String>();
//复杂点的map
Map<byte[], byte[]> bytesMap = new HashMap<byte[], byte[]>();

//测试储存新的地址
strMap.put("OS", "Windows 10");
strMap.put("Language", "ch");
strMap.put("Tool", "Redis For Windows");
String skey = "String For Redis";
RedisUtil.addMap(skey, strMap);

//从获取所有的值
List<String> sList = RedisUtil.getMapVal(skey);
System.out.println("所有结果值:" + sList);

//按照给出的field顺序给出值
sList = RedisUtil.getMapVal(skey, "Tool", "OS", "Language", "dd");
//发现取出的值和输入的field的顺序一致
System.out.println("输出值[Tool, OS, Language, dd]:\r\n\t"+ sList);

//尝试在Redis中存储对象
Person person = new Person("Johnny", 23, "男");
//序列化对象
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
ObjectInputStream bis = null;
try {
oos = new ObjectOutputStream(baos);
//创建对象
oos.writeObject(person);
//获取序列化之后的字节码
byte[] bytes = baos.toByteArray();
bytesMap.put(person.getName().getBytes(UTF_8), bytes);
RedisUtil.addMap(person.getName().getBytes(UTF_8), bytesMap);

//从Redis中读取对象
List<byte[]> list= RedisUtil.getMapVal(person.getName().getBytes(UTF_8), person.getName().getBytes(UTF_8));
if(list.size() == 1) {
bytes = list.get(0);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
bis = new ObjectInputStream(bais);
Person p = (Person) bis.readObject();
System.out.println("获取到对象:" + p);

bais.close();
bis.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {

try {
if(baos != null) {
baos.close();
}
if(null != oos) {
oos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}

//向已经存在的key中新增键值对
RedisUtil.addMapVal(person.getName().getBytes(UTF_8), "AddTest".getBytes(UTF_8), "Test Redis Adding A Val For Exist Key".getBytes(UTF_8));
//获取刚插入的值
System.out.println("获取刚插入的值:\r\n\t" +
new String(RedisUtil.getMapVal(person.getName().getBytes(UTF_8), "AddTest".getBytes(UTF_8)).get(0)));

//尝试向不存在的Key中插值
RedisUtil.addMapVal("AddNewKey", "AddNewMapKey", "AddNewMapVal");
//能够获取到值,因此也说明在进行不存在key的插值时,会自动创建对象的键值对以保存。
System.out.println("尝试获取刚插入的值:\r\n\t" + RedisUtil.getMapVal("AddNewKey", "AddNewMapKey"));
}

@Test
public void testSet() {
System.err.println("测试Redis For Set 开始:>>>>>>>");
//向Redis添加元素
RedisUtil.addSet("AddNewSet", "set1", "set2", "set3");
//获取set中的值
System.out.println("Set集合的长度:\r\n\t" + RedisUtil.getSetLength("AddNewSet"));
System.out.println("Set集合元素:\r\n\t" + RedisUtil.getSetVals("AddNewSet"));
//尝试移除元素
RedisUtil.delSetVal("AddNewSet", "set2");
System.out.println("Set集合的长度:\r\n\t" + RedisUtil.getSetLength("AddNewSet"));
System.out.println("Set集合元素:\r\n\t" + RedisUtil.getSetVals("AddNewSet"));

//判断是否包含元素
System.out.println("是否包含set2的值:" + RedisUtil.isSetContain("AddNewSet", "set2"));
System.out.println("是否包含set2的值:" + RedisUtil.isSetContain("AddNewSet", "set3"));
}

@Test
public void testList() {
System.err.println("测试Redis For List 开始:>>>>>>");
//向List中添加元素
RedisUtil.addList("ValList", "List1", "List2", "List3");
//获取List中的值
System.out.println("Redis For List中的值为:" + RedisUtil.getListAll("ValList"));
//弹出list的第一个元素
System.out.println("弹出第一个元素:" + RedisUtil.popList("ValList"));
System.out.println("Redis For List中的值为:" + RedisUtil.getListAll("ValList"));
}
}

class Person implements Serializable {
private static final long serialVersionUID = 8737363017319228700L;
private String name;
private int age;
private String sex;
public Person(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}

}
以上是做了Redis的一些基本操作的封装和测试类,仅供参考
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Redis java