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; }