1.Redis是什么
Redis是一個使用ANSI C(C語言) 撰寫的開源的高性能的Key-Value的NoSQL資料庫(非關系型資料庫),2.Redis特點
1.基于記憶體 2.可持久化資料 3.具有豐富的資料結構型別,適應非關系型資料的存盤需求 4.支持絕大多數主流開發語言,如C、C++、Java、Python、R、JavaScript等, 5.支持集群模式,高效、穩定,3.資料模型(A)
1.鍵值對形式, 2.Redis的資料結構型別,指的就是Redis值的結構型別,4.Redis作用
1.本質是資料庫,能存盤資料, Redis能靈活處理非關系型資料的讀、寫問題,是對MySQL等關系型資料庫的補充, 新浪微博就是使用Redis集群做資料庫, 2.快取資料, 所謂快取,就是將資料加載到記憶體中后直接使用,而不是每次都通過IO流從磁盤上讀取,好處:讀寫效率高, 而Redis則是將資料直接存盤在記憶體中,只有當記憶體空間不足時,將部分資料持久化到磁盤上,5.Redis安裝(Linux)
Redis官方只提供了原始碼,并沒有提供經過編譯之后的安裝包,因此,安裝Redis,要先編譯、后安裝,(即原始碼安裝方式)5.1 redis安裝步驟
1.下載,上傳到Linux服務器,并解壓 2.預編譯(實際上是檢查編譯環境的程序) 進入目錄: cd /opt/soft/redis-3.2.9/deps/jemalloc 執行預編譯 ./configure 在預編譯的程序中,會檢測安裝redis所需的相關依賴,依次安裝即可, 如:缺少c編譯環境 yum -y install gcc-c++ 預編譯不是必須的步驟,它只是在檢查編譯程序中需要的環境是否滿足,通常原始碼包中,都有一個可執行的configure腳本,這個腳本執行預編譯的腳本,但是有一些原始碼包中,沒有該檔案,可以省略預編譯步驟, 3.編譯 進入/opt/soft/redis-3.2.9/src make 4.安裝 進入/opt/soft/redis-3.2.9/src make install 5.啟動redis服務端(指定組態檔) 拷貝redis.conf檔案到/etc 目錄下,方便管理, cp /opt/soft/redis-3.2.9/redis.conf /etc/ /usr/local/bin/redis-server /etc/redis.conf6.redis.conf常用配置說明
6.1 requirepass (設定密碼)
給redis設定密碼 在/etc/redis.conf中設定密碼(退出redis登錄用quit)6.2 databases(資料庫)
Redis默認有16個資料庫,尋址角標從0開始, 默認連接db06.3 port(埠)
指定redis的服務埠,默認63796.4 daemonize(后臺行程)
Redis默認關閉后臺行程模式,改成yes,redis服務在后臺啟動,6.5 loglevel(日志級別)
6.6 logfile(日志輸出檔案)
Redis日志輸出目錄,默認不輸出日志到檔案,6.7 dbfilename(持久化檔案名)、 dir(檔案路徑)
指定資料持久化的檔案名及目錄,7.將redis添加為系統服務
7.1 第一步:開啟后臺模式
修改組態檔,將daemonize改為yes7.2 第二步:創建shell腳本
Linux系統服務,在/etc/init.d目錄下創建redis腳本########################### #chkconfig: 2345 10 90 #description: Start and Stop redis PATH=/usr/local/bin:/sbin:/usr/bin:/bin REDISPORT=6379 EXEC=/usr/local/bin/redis-server REDIS_CLI=/usr/local/bin/redis-cli ##判斷redis是否啟動了 PIDFILE=/var/run/redis_6379.pid CONF="/etc/redis.conf" PASSWORD=$(cat $CONF|grep '^\s*requirepass'|awk '{print $2}'|sed 's/"//g') case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi if [ "$?"="0" ] then echo "Redis is running..." fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." if [ -z $PASSWORD ] then $REDIS_CLI -p $REDISPORT shutdown else $REDIS_CLI -a $PASSWORD -p $REDISPORT shutdown fi #$REDIS_CLI -p $REDISPORT SHUTDOWN while [ -x ${PIDFILE} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; restart|force-reload) ${0} stop ${0} start ;; *) echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2 exit 1 esac ##############################
7.3 第三步:添加shell腳本可執行權限
chmod +x /etc/init.d/redis
7.4 第四步:添加Redis開機啟動
7.4 第四步:添加Redis開機啟動
8.Redis的值(value)的資料結構型別
一般說Redis的資料結構型別,指的就是redis的值value的型別; Redis常用的資料結構型別:string、list、set、sortedSet、hash9.Redis的使用
9.1 key的型別
redis的key 值是二進制安全的,這意味著可以用任何二進制序列作為key值,從形如”foo”的簡單字串到一個JPEG檔案的內容都可以,空字串也是有效key值, redis建議使用字串做為key的型別9.2 key取值規范
1.鍵值不需要太長,消耗記憶體,在資料中查找這類鍵值的計算成本較高 2.鍵值不宜過短,可讀性較差,通常建議見名知意, 例:user:id:1:username;user:id:1:password ,通過user:id:1*查詢,這就是一種命名方式(不一定要使用這種方式)9.3 Key命令

9.4 string型別
string型別是redis最常用的資料結構型別,存盤的值為字串,string型別相關命令

String型別的應用場景
1.做與統計有關的業務,如新浪微博(微信朋友圈)中的點贊功能 2.解決多執行緒的執行緒安全問題, Redis的key是單執行緒模式,這就意味一瞬間只有一個執行緒能夠持有這個key,所以可以使用redis解區域分涉及執行緒安全的業務,比如說搶購、秒殺, 再比如學習多執行緒時模擬買票視窗的賣票業務,9.5 List型別
特點:
1.基于Linked List實作 2.元素是字串型別 3.串列頭尾增刪快,中間增刪慢,增刪元素是常態 4.元素可以重復出現 5.最多包含2^32-1元素 串列的索引:從左至右,從0開始;從右至左,從-1開始List型別相關命令

List型別應用場景
1.處理排名類業務,如新浪微博評論、論壇回帖樓層等, 2.聊天室9.6 Hash型別(散列)
特點
Hash相關命令

Hash的作用
節約記憶體空間: redis每創建一個鍵,都會為這個鍵儲存一些附加的管理資訊(比如這個鍵的型別,這個鍵最后一次被訪問的時間等等)可以說redis的key相對于值來說,更珍貴!所以資料庫里面的鍵越多,redis資料庫服務器在儲存附加管理資訊方面耗費的記憶體就越多,在獲取key對應的value值時cpu的開銷也會更多 , Hash結構可以將具有關聯關系的一組key-value,存盤到同一個hash結構中,從而減少key的數量,所以在能使用hash的時候盡量使用hash, 不適合使用Hash的場景 在需要只對hash中某個欄位設定過期時,就不建議使用hash,Redis的key的過期功能只能對鍵操作,而Hash結構不能單獨對某一個filed設定過期功能,9.7 Set型別(集合)
特點
1.無序的、去重的; 2.元素是字串型別; 3.最多包含2^32-1元素,Set相關命令

Set應用場景
新浪微博的共同關注:當用戶訪問另一個用戶的時候,會顯示出兩個用戶共同關注哪些相同的用戶(交集)9.8 SortedSet型別(有序集合)
特點
1.類似Set集合; 2.有序的、去重的; 3.元素是字串型別; 4.每一個元素都關聯著一個浮點分數值(Score),并按照分數值從小到大的順序排列集合中的元素,分數值可以相同,相同時按字典順序排列 5.最多包含2^32-1元素SortedSet型別相關命令

SortedSet型別適用場景
適用于需要有序且唯一的業務或操作: 如,網易音樂排行榜: 每首歌的歌名作為元素(唯一、不重復) 每首歌的播放次數作為分值 用zrevrange來獲取播放次數最多的歌曲(就是最多播放榜了,云音樂熱歌榜,沒有競價,沒有權重)10.使用Jedis連接redis服務器
Jedis是Redis官方推薦的Java連接開發工具,可以通過java代碼操作redis資料庫,就類似于jdbc10.1 使用jedis連接redis可能會出現的問題及解決方案:
1.ip系結問題10.2 Jedis 相關jar包匯入
10.3 Jedis連接redis服務端
package com.gjs.jedis; import org.junit.Test; import redis.clients.jedis.Jedis; public class TestJedis { @Test public void testJedisConnect() throws Exception { //創建客戶端指定連接服務器端主機ip和埠,埠不指定時默認使用6379 Jedis jedis = new Jedis("192.168.192.128", 6379); System.out.println("連接redis服務器端成功!"); jedis.auth("1234"); //登錄驗證 //測驗連接 System.out.println("redis服務器是否運行:"+jedis.ping()); System.out.println("redis服務器資訊:"+jedis.info()); //關閉連接 jedis.close(); } }
10.4 Key測驗
jedis類中大部分方法名都與對應的命令同名@Test public void testKey() throws Exception { //創建客戶端指定連接服務器端主機ip和埠,埠不指定時默認使用6379 Jedis jedis = new Jedis("192.168.192.128", 6379); System.out.println("連接redis服務器端成功!"); //登錄驗證 jedis.auth("1234"); jedis.set("name", "zhangsan");//加入資料 System.out.println("獲取key對應的值:"+jedis.get("name")); Set<String> keys = jedis.keys("*");//使用通配符進行模糊查詢 System.out.println("獲取所有key的值:"+keys); //關閉連接 jedis.close(); }
10.5 List測驗
@Test public void testList() throws Exception { //創建客戶端指定連接服務器端主機ip和埠,埠不指定時默認使用6379 Jedis jedis = new Jedis("192.168.192.128", 6379); System.out.println("連接redis服務器端成功!"); //登錄驗證 jedis.auth("1234"); jedis.lpush("list", new String[] {"a","c","b"});//添加資料 Long len = jedis.llen("list");//獲取長度 System.out.println("list長度:"+len); System.out.println("list元素:"+jedis.lrange("list", 0, len)); System.out.println("指定索引位置的元素:"+jedis.lindex("list", 1)); //關閉連接 jedis.close(); }
10.6 Hash測驗
@Test public void testHash() throws Exception { //創建客戶端指定連接服務器端主機ip和埠,埠不指定時默認使用6379 Jedis jedis = new Jedis("192.168.192.128", 6379); System.out.println("連接redis服務器端成功!"); //登錄驗證 jedis.auth("1234"); //添加資料 jedis.hset("user", "id", "1"); jedis.hset("user", "name", "zhangsan"); jedis.hset("user", "password", "123456"); //獲取所有元素 Map<String, String> user = jedis.hgetAll("user"); System.out.println("獲取hash的所有欄位值:"+user); //關閉連接 jedis.close(); }
10.7 Set測驗
@Test public void testSet() throws Exception { //創建客戶端指定連接服務器端主機ip和埠,埠不指定時默認使用6379 Jedis jedis = new Jedis("192.168.192.128", 6379); System.out.println("連接redis服務器端成功!"); //登錄驗證 jedis.auth("1234"); //添加資料 jedis.sadd("set1",new String[] {"a","s","d","f","g"}); jedis.sadd("set2", new String[] {"a","s","z","x"}); //獲取所有元素 Set<String> set1 = jedis.smembers("set1"); System.out.println("獲取set的所有元素:"+set1); System.out.println("獲取元素數量:"+jedis.scard("set1")); //獲取交并補集,方法引數是可變的 Set<String> inter = jedis.sinter("set1","set2"); System.out.println("獲取交集:"+inter); Set<String> union = jedis.sunion("set1","set2"); System.out.println("獲取并集:"+union); Set<String> diff = jedis.sdiff("set1","set2"); System.out.println("獲取差集:"+diff); //關閉連接 jedis.close(); }
10.8 SortedSet測驗
@Test public void testSortedSet() throws Exception { //創建客戶端指定連接服務器端主機ip和埠,埠不指定時默認使用6379 Jedis jedis = new Jedis("192.168.192.128", 6379); System.out.println("連接redis服務器端成功!"); //登錄驗證 jedis.auth("1234"); //添加資料 Map<String, Double> scoreMembers = new HashMap<>(); scoreMembers.put("a", 1d); scoreMembers.put("b", 3d); scoreMembers.put("c", 2d); jedis.zadd("sortSet", scoreMembers); //獲取資料 //獲取分數值在指定區間的元素并按分數值由小到大排序 Set<String> zrange = jedis.zrange("sortSet", 0, 3); System.out.println(zrange); //關閉連接 jedis.close(); }
11.Redis持久化
Redis持久化,就是將記憶體中的資料,永久保存到磁盤上, Redis持久化有兩種方式:RDB(Redis DB)、AOF(AppendOnlyFile),11.1 RDB(快照模式)
在默認情況下,Redis 將資料庫快照保存在名字為dump.rdb的二進制檔案中,可以在redis.conf組態檔中修改持久化資訊,11.1.1 策略
1.自動:BGSAVE 按照組態檔中的條件滿足就執行BGSAVE;非阻塞,Redis服務正常接收處理客戶端請求; Redis會folk()一個新的子行程來創建RDB檔案,子行程處理完后會向父行程發送一個信號,通知它處理完畢,父行程用新的dump.rdb替代舊檔案, 2.手動:SAVE 由客戶端(redis-cli)發起SAVE命令;阻塞Redis服務,無法回應客戶端請求;創建新的dump.rdb替代舊檔案,11.1.2 優點
1.執行效率高; 2.恢復大資料集速度較AOF快,11.1.3 缺點
1.會丟失最近寫入、修改的而未能持久化的資料; 2.folk程序非常耗時,會造成毫秒級不能回應客戶端請求,11.2 AOF(追加模式、文本重演)
AOF(Append only file),采用追加的方式保存,默認檔案appendonly.aof,記錄所有的寫操作命令,在服務啟動的時候使用這些命令就可以還原資料庫,AOF默認關閉,需要在組態檔中手動開啟,11.2.1 寫入機制
說明:AOF機制,添加了一個記憶體緩沖區(buffer), 1.將內容寫入緩沖區 2.當緩沖區被填滿、或者用戶手動執行fsync、或者系統根據指定的寫入磁盤策略自動呼叫fdatasync命令,才將緩沖區里的內容真正寫入磁盤里, 3.在緩沖區里的內容未寫入磁盤之前,可能會丟失,11.2.2 寫入磁盤的策略
appendfsync選項,這個選項的值可以是always、everysec或者no11.2.3 AOF重寫機制
AOF檔案過大,合并重復的操作,AOF會使用盡可能少的命令來記錄,重寫程序
1.folk一個子行程負責重寫AOF檔案 2.子行程會創建一個臨時檔案寫入AOF資訊 3.父行程會開辟一個記憶體緩沖區接收新的寫命令 4.子行程重寫完成后,父行程會獲得一個信號,將父行程接收到的新的寫操作由子行程寫入到臨時檔案中 5.新檔案替代舊檔案 重寫的本質:就是將操作同一個鍵的命令,合并,從而減小AOF檔案的體積AOF重寫觸發機制
1.手動:客戶端向服務器發送BGREWRITEAOF命令 2.自動:組態檔中的選項,自動執行BGREWRITEAOF命令11.2.4 優點
寫入機制:默認Everysec每秒執行,性能很好不阻塞服務,最多丟失一秒的資料; 重寫機制:優化AOF檔案,如果誤操作了(FLUSHALL等),只要AOF未被重寫,停止服務移除AOF檔案尾部FLUSHALL命令,重啟Redis,可以將資料集恢復到FLUSHALL 執行之前的狀態,11.2.5 缺點
1.相同資料集,AOF檔案體積較RDB大了很多; 2.恢復資料庫速度較RDB慢(文本,命令重演), 原文鏈接:https://www.cnblogs.com/gaojinshun/p/15423790.html 作者:ki16 出處:https://www.cnblogs.com/gaojinshun/ 本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連接,否則保留追究法律責任的權利,轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325255.html
標籤:其他
