前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA中使用Jedis操作Redis

JAVA中使用Jedis操作Redis

作者头像
用户1215919
发布2018-02-27 10:18:32
1.6K0
发布2018-02-27 10:18:32
举报
文章被收录于专栏:大大的微笑大大的微笑

redis安装看这里:https://cloud.tencent.com/developer/article/1045316

需要的jar:commons-pool2 ,redis.clients

①. 进入这里查看操作redis的客户端语言及支持的操作方式: https://redis.io/clients

②.我选择的是jedis ,这里对jedis进行了一个小小的封装,经过简单的测试,挺好用的.

这里存储对象基本上都是以字节数组保存的,所以写了个序列化和反序列化的util

代码语言:javascript
复制
	/**
	 * 序列化
	 * @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;
	}

③.连接池创建:

代码语言:javascript
复制
    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键值对

代码语言:js
复制
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()));
	}
代码语言:js
复制
  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}

⑤.操作一个对象:

代码语言:js
复制
/**
	 * 添加一个对象
	 * 
	 * @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()));

	}
代码语言:js
复制
 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

代码语言:js
复制
/**
	 * 添加一个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()));
	}
代码语言:js
复制
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: 

代码语言:js
复制
/**
	 * 添加一个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()));
	}
代码语言:js
复制
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]

⑧. 上述写的过于麻烦,这里把上述全部废弃不再使用,下面是完整的代码:

代码语言:js
复制
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();
	}
代码语言:js
复制
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;
}

转载请注明出处谢谢!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档