JAVA对Redis的使用

Posted 专注着

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA对Redis的使用相关的知识,希望对你有一定的参考价值。

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的一些基本操作的封装和测试类,仅供参考

以上是关于JAVA对Redis的使用的主要内容,如果未能解决你的问题,请参考以下文章

Redis缓存如何保证一致性

JAVA对Redis的使用

JAVA对Redis的使用

使用Java客户端对Redis进行操作

java数目

算法学习5859. 差的绝对值为 K 的数对数目(java / c / c++ / python / go / rust)