zoukankan      html  css  js  c++  java
  • redis的javaclientJedis简单封装

           经过我们团队的一番讨论,终于决定使用redis来进行我们的业务缓存。redis会将数据缓存到内存中,执行效率会非常快。同一时候异步将数据写入到磁盘中。进行持久化。

    且redis支持主从同步,支持分布式部署,支持N多数据结构,这对于我们有着莫大的吸引力。

    參见:http://blog.csdn.net/yichenlian/article/details/27207383

            我们团队讨论的焦点是在于redis的灾备恢复问题。

    因为redis的持久化是异步的。总会有一点时间内存中数据和磁盘数据不同步的情况(当然能够设置成全然同步。那么用redis的意义就大打折扣了)。尽管没有找到尽善尽美的解决的方法。只是有一些网上的处理方式还是能够接受的。

    參见:http://blog.csdn.net/xiangliangyu/article/details/8165644
            随后我使用javaclientJedis对redis相关操作进行了一些系统的简单的封装。使用的是jedis的分布式连接池,这样方便于redis横向扩展,添加高可用性。封装思路:首先定义连接池类,封装连接池获取方式;对外为接口。接口定义的是redis常规操作,定义的方法基本与redis中一致,而且使用接口便于扩展;实现接口,我封装的实现类仅仅使用了分布式的方式(即ShardedJedis),也能够使用别的实现方式,能够自己扩展。


            1.获取连接池:

    简单配置JedisPoolConfig

    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    		jedisPoolConfig.setMaxTotal(maxTotal);//the max number of connection
    		jedisPoolConfig.setMaxIdle(maxIdle);//the max number of free
    		jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);//the longest time of waiting

    设置JedisShardInfo(redis.clients.jedis.JedisShardInfo.JedisShardInfo(String host, int port))

    得到ShardedJedisPool(连接池):redis.clients.jedis.ShardedJedisPool.ShardedJedisPool(GenericObjectPoolConfig poolConfig, List<JedisShardInfo> shards,Hashing algo)

    这样就得到了连接池。

              2.定义接口,简单为上:

    public interface JedisClientInterface {
    
    	/**
    	 * 写入一般的string类型的value
    	 * 
    	 * @param key
    	 * @param value
    	 */
    	void put(String key, String value);
    
    	/**
    	 * 读取String类型的value
    	 * 
    	 * @param key
    	 * @return
    	 */
    	String get(String key);
    }

              3.完毕实现类:

    public class JedisClientShardImpl implements JedisClientInterface {
    @Override
    	public void put(String key, String value) {
    		boolean flag = true;
    		ShardedJedis shardedJedis = pool.getResource();
    		try{
    			if(shardedJedis!=null){
    				shardedJedis.set(key, value);
    			}
    		}catch(Exception e){
    			flag = false;
    			e.printStackTrace();
    		}finally{
    			if (flag){
                               pool.returnResource(shardedJedis);
                            }else{
                               pool.returnBrokenResource(shardedJedis);
                            }
    		}
    	}
    
    	@Override
    	public String get(String key) {
    		boolean flag = true;
    		ShardedJedis shardedJedis = pool.getResource();
    		try{
    			if(shardedJedis!=null){
    				return shardedJedis.get(key);
    			}
    		}catch(Exception e){
    			flag = false;
    			e.printStackTrace();
    		}finally{                      
                            if (flag){
                               pool.returnResource(shardedJedis);
                            }else{
                               pool.returnBrokenResource(shardedJedis);
                            }
                   }
                   return null;
            }
    }
    

    
                 至此,整个封装流程就走通了。

    能够随意向下扩展了。

  • 相关阅读:
    Linux查看文件被哪个进程占用
    命令行启动rstudio server
    Spring Boot配置文件及多环境配置
    Spring Boot yml配置文件
    js实现自定义概率抽奖算法
    Flutter之adb: failed to install apk的解决方法
    Flutter之不简单的搜索条
    git操作之commit规范
    Flutter之毛玻璃效果的实现
    固定定位下div水平居中
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6914999.html
Copyright © 2011-2022 走看看