redis的安裝(linux,源碼安裝) 一. redis是C語言寫的,因此源碼安裝首先須要配置C語言的編譯環境gcc yum -y install gcc-c++ (-y是指同一全部安裝的要求,反正也得贊成,不如不麻煩) 看到Complete!即爲安裝成功 二. 下載redis wget http://download.redis.io/releases/redis-5.0.0.tar.gz (不必定要選擇5.0版本,但redis的版本是以雙數爲穩定版,單數爲測試版) 能夠在windows下載後經過一些工具複製,這個具體本身百度吧 三. 安裝redis 下載後能夠經過 ll | grep redis查看,這個時候若是發現這個文件沒有可執行權限,那麼須要修改文件的權限 chmod 777 文件名(文件名太長能夠只打一部分而後按Tab鍵進行補全,777表明放開全部的權限) 解壓redis包 tar -zxvf redis.XXX.tar.gz 而後進入解壓後產生的目錄 開始編譯,只須要一個敲make命令便可,而後等待編譯完成 看到make[1]: Leaving directory 'XXXX'就是編譯完成了 開始安裝 make prefix=/usr/local/redis install (prefix指的是安裝的路徑,推薦安裝到這裏) 安裝後進入usr/local/bin目錄下,使用./redis-server命令啓動redis,若是看到一個很簡陋的立體圖形(像一個奶酪),就說明啓動成功了 上邊雖然啓動成功了,可是這種前段啓動方式有很大的缺陷,就是不能關閉!通常咱們用後端啓動,即啓動後在後臺自動運行。 配置後端啓動 回到redis的源碼文件夾,把一個叫redis.conf的文件copy到安裝的bin目錄下 cp redis.conf /usr/local/redis/bin 修改配置文件 vim redis.conf 往下翻,找到daemonize no,把no改成yes。 使用 ./redis-server redis.conf命令後端啓動 啓動後能夠用 ps-aux | grep redis 來查看是否在後臺運行 關閉redis 還須要進入redis的安裝目錄下執行 ./redis-cli shutdown 命令 jedis的使用(關於Jedis本身去百度) jedis的入門程序 若是運行這個程序報錯如:Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException:java.net.ConnectException: Connection refused (Connection refused),緣由是你的端口號或者IP地址錯誤,若是這兩個確認正確,先關閉linux的防火牆(systemctl stop firewalld.service),若是還不行,檢查redis.conf中bind XXX 這一行是否是隻能由某個IP地址訪問,是的話把這一行註釋掉! redis設置密碼仍是在redis.conf中找到requirepass XXX這一行,這一行的本來狀態多是被註釋掉的,你須要取消註釋並修改成如 requirepass "111111" package cn.yangwanhao.redis.test;java
import org.junit.Test;linux
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool;c++
public class Tests {redis
@Test public void run1() { //建立和redis的鏈接 Jedis jedis = new Jedis("192.168.253.131",6379); //提供密碼 jedis.auth("******"); jedis.set("key1", "1"); System.out.println(jedis.get("key1")); jedis.close(); } @Test public void run2() { //獲取Jedis鏈接池 JedisPool pool = new JedisPool("192.168.253.131",6379); //獲取鏈接 Jedis jedis = pool.getResource(); //提供密碼 jedis.auth("******"); jedis.set("key2", "2"); System.out.println(jedis.get("key2")); //使用鏈接池時,鏈接必定要關閉,關閉後鏈接會自動回到鏈接池供別人使用 //若是不關閉鏈接,鏈接耗盡後就會死機 jedis.close(); pool.close(); }
} jedis和spring整合 application-context配置文件 <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!-- 最大鏈接數 --> <property name="maxTotal" value="30" /> <!-- 最大空閒鏈接數 --> <property name="maxIdle" value="10" /> <!-- 每次釋放鏈接的最大數目 --> <property name="numTestsPerEvictionRun" value="1024" /> <!-- 釋放鏈接的掃描間隔(毫秒) --> <property name="timeBetweenEvictionRunsMillis" value="30000" /> <!-- 鏈接最小空閒時間 --> <property name="minEvictableIdleTimeMillis" value="1800000" /> <!-- 鏈接空閒多久後釋放, 當空閒時間>該值 且 空閒鏈接>最大空閒鏈接數 時直接釋放 --> <property name="softMinEvictableIdleTimeMillis" value="10000" /> <!-- 獲取鏈接時的最大等待毫秒數,小於零:阻塞不肯定的時間,默認-1 --> <property name="maxWaitMillis" value="1500" /> <!-- 在獲取鏈接的時候檢查有效性, 默認false --> <property name="testOnBorrow" value="true" /> <!-- 在空閒時檢查有效性, 默認false --> <property name="testWhileIdle" value="true" /> <!-- 鏈接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 默認true --> <property name="blockWhenExhausted" value="false" /> </bean>spring
<!-- redis單機 經過鏈接池 -->數據庫
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close"> <constructor-arg name="poolConfig" ref="jedisPoolConfig"/> <constructor-arg name="host" value="192.168.93.88"/> <constructor-arg name="port" value="6379"/> </bean> spring與jedis整合的測試代碼 package cn.yangwanhao.redis;vim
import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool;windows
public class JedisSpringTest {後端
private ApplicationContext applicationContext; @Before public void setUp() throws Exception{ String configLocation = "classpath:ApplicationContext.xml"; applicationContext = new ClassPathXmlApplicationContext(configLocation); } @Test public void run1() throws Exception{ //獲取鏈接池 JedisPool jedisPool = (JedisPool)applicationContext.getBean("jedisPool"); //獲取鏈接 Jedis jedis = jedisPool.getResource(); //存入 jedis.set("key4", "bbb"); //取出 System.out.println(jedis.get("key4")); }
} redis的數據命令與使用 進入命令行界面的方式 進入到redis的安裝目錄下執行 ./redis-cli命令便可。進入界面後,若是設有密碼,須要執行 auth 密碼命令,例:auth 111111,不然執行任何命令都會出現 error NOAUTH Authentication required。 redis的數據類型(redis裏面 空 不是 null ,而是 nil ) 字符串String 列表list(redis中使用的是雙向循環鏈表實現的list) 散列hash 集合set 有序集合zset redis的命令(分數據類型) redis的數據無法修改,只能經過key來進行覆蓋,有同名的key將會覆蓋,沒有就新增 String類型(用於單個的字符串存儲) set key value 例:set a aaa get key 例:get a (獲得的結果就是aaa) del key 例:del a (獲得的結果是刪除的條數) incr key 使key自增 incrby key num 使key每次自增num decr key 使key自減 hash類型(通常應用於將redis座位分佈式緩存,存儲數據庫中的數據對象) hset key filed value 例:hset user1 name zhangsan執行完再執行hset user1 age 17 ☆hmset key filed name filed name... 例:hmset user2 name lisi age 18 sex nan hget key filed 例:hget user1 name (獲得的結果就是zhangsan) ☆hmget key filed filed... 例:hmget user1 name age sex (可一次性獲得user1的多個指定信息) ☆hgetall key 例:hgetall user1 (便可獲得user1的所有信息) hdel key file 例:hdel user1 name (刪掉了user1的name屬性) list類型 lpush key value value value... 例:lpush list1 1 2 3 4 5 lrange key start stop : start是開始的下標,stop是結束的下標,下標從0開始。例:lrange list1 0 3 (結果就是4 3 2 1),若是想要取出所有,就把stop設爲-1,例:lrange list1 0 -1。 rpush用法同上,只是存取的順序不同 lpop key 例:lpop list1 (每執行一次,會從左邊彈出(去除)一個元素) rpop用法同上,只是它是從右邊彈出一個元素 llen key 例:llen list1 (獲取這個集合的長度) set類型(set中數據是無序的,而且不容許重複) 增長sadd key value value value... 例:sadd set1 1 2 3 4 5 遍歷smembers key 例:smembers set1 (結果是 1 2 3 4 5) 刪除srem key value 例:srem set1 5 (再次執行smembers set1結果是 1 2 3 4) 判斷sismember key value 例:sismember set1 9 (返回結果1是存在0是不存在) 集合的差運算sidff key1 key2 (判斷輸出集合key1和key2之間的差) 集合的交運算sinter key1 key2 集合的並運算sunion key1 key2 zset類型 zadd key score name score name... 例:zadd key1 10 zhangsan 20 lisi zrange key start stop withscores 例:zrange key1 0 -1 withscores (-1仍然表明所有,取出的時候按照從低到高的順序排序,withscores能夠顯示出成績,能夠不寫withscore) zrem key name 例:zrem key1 lisi (就能夠把maliu去掉) zscore key name 例:zscore key1 zhangsan (就能夠顯示出zhangsan的score) zrevrange key start stop withscore 例:zrevrange key1 0 -1 withscore (能夠從高到低的顯示出姓名成績) redis通用命令 keys * 命令能夠查看全部的key keys *1命令能夠查看全部名字帶1的key,其餘的也同樣 rename key newkey (重命名key) type key (查看key的返回值類型) ping 命令 (用於查看服務器是否還在運行,收到pong回覆則還在運轉) redis的持久化 redis的數據都是存在於內存中,這樣存取的速度超級快,可是一旦系統發生故障,好比斷電...redis裏的數據就會所有丟失,爲解決這個問題,就有了redis的持久化方案,即把內存中的數據放在硬盤中。 rdb:能夠設置間隔多長時間保存一次(redis默認的持久化方案(不用任何配置)) 優勢:不影響redis的存取速度 缺點:若是發生故障可能會丟失部分數據(數據的完整性得不到保證) aof:能夠設置實時保存 優勢:持久化良好,能夠保證數據的完整性 缺點:犧牲了存取速度 通常咱們採起第一種方案,使用redis就是爲了保證存取速度,若是使用第二種,redis的存取速度會極大的下降,不符合咱們的初衷。 redis的主從複製(瞭解) 主從複製:redis的持久化保證了數據的完整性,但若是保存數據的硬盤遭到了損壞,那麼數據仍然會遭受損失,解決的辦法就是再用一臺機器對服務器的數據進行實時備份。 使用的是心跳檢測機制 主從複製必須使用rdb持久化方案;從服務器通常設爲只讀,保證主從服務器的數據一致性 具體的主從複製操做本身百度......緩存