/** * */ package com.chamago.cometserver.connection; import java.util.List; import java.util.Map; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; /** * @author Gavin.peng * * Redis 通讯的客户端工具类 * * 2014-3-4 下午05:10:16 × cometserver */ public class RedisClientManager { private static RedisClientManager instance = new RedisClientManager(); private RedisClientManager(){ } public static RedisClientManager getInstance(){ return instance; } /** * 删除redis上,指定客户端对应的消息 * @param appkey * @param msgId */ public void deleteMsg(String appkey,String msgId){ JedisPool pool = RedisClientFactory.getJedisPool(); Jedis jedis = pool.getResource(); try { //从与Key关联的Set中删除参数中指定的成员,不存在的参数成员将被忽略,如果该Key并不存在,将视为空Set处理。 //void srem(final String key, final String... members) //从指定Key的Hashes Value中删除参数中指定的多个字段,如果不存在的字段将被忽略。如果Key不存在,则将其视为空Hashes,并返回0.返回实际删除的Field数量。 //void hdel(final String key, final String... fields) //删除指定客户端连接对应的消息,即客户端已经收到消息。 jedis.hdel(appkey, msgId); } finally { //这里很重要,一旦拿到的jedis实例使用完毕,必须要返还给池中 pool.returnResource(jedis); } } /** * 批量删除redis上,指定客户端对应的消息 * @param appkey * @param msgIds */ public void batchDeleteMsg(String appkey,String msgIds){ JedisPool pool = RedisClientFactory.getJedisPool(); Jedis jedis = pool.getResource(); try { //从与Key关联的Set中删除参数中指定的成员,不存在的参数成员将被忽略,如果该Key并不存在,将视为空Set处理。 //void srem(final String key, final String... members) //从指定Key的Hashes Value中删除参数中指定的多个字段,如果不存在的字段将被忽略。如果Key不存在,则将其视为空Hashes,并返回0.返回实际删除的Field数量。 //void hdel(final String key, final String... fields) //删除指定客户端连接对应的消息,即客户端已经收到消息。 //jedis.hdel(appkey, msgId); String[] fields = msgIds.split(","); jedis.hdel(appkey, fields); } finally { //这里很重要,一旦拿到的jedis实例使用完毕,必须要返还给池中 pool.returnResource(jedis); } } /** * 保存消息到redis上,关系为,一个客户端对应一个map,消息id为key, * value为消息的内容。 * @param appkey * @param msgId * @param msg */ public void saveMsg(String appkey,String msgId,String msg){ //先写到redis, JedisPool pool = RedisClientFactory.getJedisPool(); Jedis jedis = pool.getResource(); try { //为指定的Key设定Field/Value对,如果Key不存在, //该命令将创建新Key以参数中的Field/Value对,如果参数中的Field在该Key中已经存在, //则用新值覆盖其原有值。 jedis.hset(appkey,msgId,msg); //jedis.hsetnx(key, field, value); } finally { //这里很重要,一旦拿到的jedis实例使用完毕,必须要返还给池中 pool.returnResource(jedis); } } /** * 根据appkey查找对应的消息队列 * @param appkey * @return */ public Map<String,String> findDiscardMsg(String appkey){ JedisPool pool = RedisClientFactory.getJedisPool(); Jedis jedis = pool.getResource(); try { //获取该键包含的所有Field/Value。其返回格式为一个Field、一个Value,并以此类推。 Map<String,String> msgMap = jedis.hgetAll(appkey); return msgMap; } finally { //这里很重要,一旦拿到的jedis实例使用完毕,必须要返还给池中 pool.returnResource(jedis); } } }