redis緩存

Redis簡介

Redis是一款開源的分佈式緩存與存儲系統,由於它的高性能,數據類型多樣性以及分佈式特性,在各大系統中應用廣泛。本系列一共三篇,本篇主要介紹Redis的安裝及配置,基本數據結構用法,過期設置等;第二篇介紹Java,NodeJS操作Redis;第三篇介紹Redis分佈式集羣。另:Redis推薦的運行環境是Linux,所以下面都以Linux環境進行介紹。

安裝及配置

首先去官網下載redis壓縮包,或者通過如下命令在線下載wget http://download.redis.io/redis-stable.tar.gz


解壓及編譯

tar xzf redis-stable.tar.gz cd redis-stable make

 

配置端口及自動啓動

1,redis源碼目錄下的utils的redis_init_script拷貝/etc/init.d中並改名成redis_端口號,比如redis_6379,並且把REDISPORT改成6379,下面都以這個端口爲例

 2,新建兩個文件夾     /etc/redis  用於存放redis的配置文件     /var/redis/6379  存放redis的持久化文件
 3,把redis跟目錄下的redis.conf文件複製到 /etc/redis中並修改名字爲6379.conf,然後進行如下       編輯     daemonize    yes           #守護進程模式     pidfile           /var/run/redis_6379.pid  #設置pid文件位置     port            6379         設置監聽端口     dir             /var/redis/6379      設置持久化文件存放位置
4,啓動     /etc/init.d/redis_6379 start    centos自動啓動配置
    需要現在redis_6379文件的前面加上如下:    # chkconfig:   2345 90 10    # description:  Redis is a persistent key-value database    然後執行:
    chkconfig --add redis_6379
5,停止redis     redis-cli shutdown

6,客戶端連接     redis-cli -h 127.0.0.1 -p 6379



java代碼

/**
 * RedisUnit
 * @author dsine
 */
public class RedisUnit {
	/**
	 * 服務地址
	 */
	private String host;

	/**
	 * 端口,默認端口是6379
	 */
	private Integer port;
	
	/**
	 * 密碼
	 */
	private String password = "123456";

	/**
	 * 默認key前綴
	 */
	private String defaultKeyPrefix = "";
	
	/**
	 * 最小空閒連接數
	 */
	private Integer minIdle = 5;
	
	/**
	 * 最大空閒連接數
	 */
	private Integer maxIdle = 10;
	
	/**
	 * 最大連接數
	 */
	private Integer maxTotal = 100;
	
	/**
	 * 連接池
	 */
	private JedisPool jedisPool;
	
	/**
	 * 連接池配置,具體參數:
	 * blockWhenExhausted = true;//連接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 默認true
	 * evictionPolicyClassName = "org.apache.commons.pool2.impl.DefaultEvictionPolicy";//設置的逐出策略類名, 默認DefaultEvictionPolicy(當連接超過最大空閒時間,或連接數超過最大空閒連接數)
	 * jmxEnabled = true;// 是否啓用pool的jmx管理功能, 默認true
	 * jmxNamePrefix = "pool";
	 * lifo = true; //是否啓用後進先出, 默認true
	 * minIdle = 5;//最小空閒連接數, 默認0
	 * maxIdle = 10;/最大空閒連接數, 默認8個
	 * maxTotal = 100;//最大連接數, 默認8個
	 * maxWaitMillis = 3000L;//獲取連接時的最大等待毫秒數(如果設置爲阻塞時BlockWhenExhausted),如果超時就拋異常, 小於零:阻塞不確定的時間,默認-1
	 * testOnBorrow = true;//在獲取連接的時候檢查有效性, 默認false
	 * testOnReturn = true;//返回一個jedis實例給連接池時,是否檢查連接可用性
	 * testWhileIdle = true;//在空閒時檢查有效性, 默認false
	 * minEvictableIdleTimeMillis = 1800000L;//逐出連接的最小空閒毫秒,默認1800000毫秒(30分鐘)
	 * softMinEvictableIdleTimeMillis = 1800000L;//對象空閒多久後逐出, 當空閒時間>該值 ,且空閒連接>最大空閒數時直接逐出,不再根據MinEvictableIdleTimeMillis判斷 (默認逐出策略),默認30m
	 * timeBetweenEvictionRunsMillis = 60000L;//逐出掃描的時間間隔(毫秒) 如果爲負數,則不運行逐出線程, 默認-1
	 * numTestsPerEvictionRun = 5;//每次逐出檢查時 逐出的最大數目 如果爲負數就是 : 1/abs(n), 默認3
	 */
	private JedisPoolConfig jedisPoolConfig;
	
	/**
	*初始化啓動,創建連接池
	*可以設置密碼,防止外部操作
	*/
	@PostConstruct
	public void init(){
		jedisPoolConfig = new JedisPoolConfig();
		jedisPoolConfig.setMinIdle(minIdle);
		jedisPoolConfig.setMaxIdle(maxIdle);
		jedisPoolConfig.setMaxTotal(maxTotal);
		if( password != null && !"".equals( password.trim() ) ){
			jedisPool = new JedisPool( jedisPoolConfig, this.host, this.port, Protocol.DEFAULT_TIMEOUT, this.password );
		}else{
			jedisPool = new JedisPool( jedisPoolConfig, this.host, this.port, Protocol.DEFAULT_TIMEOUT );
		}
	}
	
	@PreDestroy銷燬
	public void destroy(){
		jedisPool.destroy();
	}
	
	private Jedis getJedis(){
		Jedis jedis = jedisPool.getResource();
		return jedis;
	}
	
	/**
	 * 驗證key是否爲空
	 */
	private void checkKeyNotBlank( String key ){
		if( key == null || "".equals( key ) ){
			throw new RuntimeException( "key is blank" );
		}
	}
	
	/**
	 * set設置緩存
	 */
	public void set( String keyPrefix, String key, Object value ){
		this.checkKeyNotBlank( key );
		this.getJedis().set( ObjectUtil.toBytes( keyPrefix + key ), ObjectUtil.toBytes( value ) );
	}
	
	/**
	 * set設置緩存
	 */
	public void set( String key, Object value ){
		this.set( defaultKeyPrefix, key, value );
	}
	
	/**
	 * setNoPrefixToString
	 */
	public void setNoPrefixToString(String key, String flag, String value ){
		this.checkKeyNotBlank( key );
		Logger.info("向緩存中添加標誌位"+flag+"的緩存,其中KEY 是"+key+"_"+flag+"VALUE 是"+value);
		this.getJedis().set(key+"_"+flag, value);
	}
	
	
	/**
	 * setex可以設置超時時間
	 */
	public void setex( String keyPrefix, Integer timeOut, String key, Object value ){
		this.checkKeyNotBlank( key );
		this.getJedis().setex( ObjectUtil.toBytes( keyPrefix + key ), timeOut, ObjectUtil.toBytes( value ) );
	}
	
	/**
	 * setex可以設置超時時間
	 */
	public void setex( String key, Integer timeOut, Object value ){
		if(defaultKeyPrefix != null && !"".equals(defaultKeyPrefix)){
			this.setex( defaultKeyPrefix, timeOut, key, value );
		}else{
			this.setexObject(key, timeOut,  value);
		}
	}
	
	/**
	 * setexObject可以設置超時時間
	 */
	public void setexObject( String key, Integer timeOut, Object value ){
		this.checkKeyNotBlank( key );
		String jsonString = JsonUtil.toJson(value);
		this.getJedis().setex(key, timeOut, jsonString);
	}
	
	/**
	 * get單個獲取
	 */
	public <T> T get( String keyPrefix, String key, Class<T> clazz ){
		this.checkKeyNotBlank( key );
		
		Jedis redis = this.getJedis();
		byte[] bs = redis.get( ObjectUtil.toBytes( keyPrefix + key ) );
		if( bs == null || bs.length == 0 ){
			return null;
		}else{
			T value = ObjectUtil.toObject( bs, clazz );
			return value;			
		}
	}
	
	/**
	 * get單個獲取
	 */
	public <T> T get( String key, Class<T> clazz ){
		return this.get( defaultKeyPrefix, key, clazz);
	}
	
	/**
	 * get單個獲取
	 */
	public String getNoPrefixToString( String key ){
		checkKeyNotBlank(key);
		return this.getJedis().get(key);
	}
	
	/**
	 * 獲取所有的key
	 * position 0爲前包含,1位後包含, 2爲所有*
	 * containStr 包含字符串
	 */
	public Map<String, Object> getAllKey(Integer position, String containStr){
		Map<String, Object> map = new HashMap<String, Object>();
		String sourceStr = "*";
		try{   
			if(position == 0){
				sourceStr = containStr + sourceStr;
			}else if(position == 1){
				sourceStr = sourceStr + containStr;
			}
			Jedis redis = this.getJedis();
			Set<String> set = (Set<String>)redis.keys(sourceStr);
			if(!set.isEmpty()){
				for(String i : set){
					String value=this.getNoPrefixToString(i);
					map.put(i, value);
					Logger.info("後綴爲"+containStr+"中的KEY 是"+i+", VALUE 是:"+value);
				}
			}else{
				if(position==1){
					Logger.info("後標誌位爲:"+containStr+"在緩存中沒有數據");
				}else{
					Logger.info("前標誌位爲:"+containStr+"在緩存中沒有數據");
				}
				
			}
			
		}catch(Exception e){
			Logger.error("匹配key爲" + containStr + "異常", e);
		}
		return map;
	}
	
	/**
	 * del刪除
	 */
	public void del( String keyPrefix, String key ){
		Jedis redis = this.getJedis();
		redis.del(key);
	}
	
	/**
	 * del刪除
	 */
	public void del( String key ){
		Jedis redis = this.getJedis();
		redis.del(key);
	}

	public void setHost(String host) {
		this.host = host;
	}

	public void setPort(Integer port) {
		this.port = port;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public void setMinIdle(Integer minIdle) {
		this.minIdle = minIdle;
	}

	public void setMaxIdle(Integer maxIdle) {
		this.maxIdle = maxIdle;
	}

	public void setMaxTotal(Integer maxTotal) {
		this.maxTotal = maxTotal;
	}

	public void setDefaultKeyPrefix(String defaultKeyPrefix) {
		this.defaultKeyPrefix = defaultKeyPrefix;
	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章