Redis學習與總結
前言
本文為學習Redis的一個總結,包含了資料的整理,Redis的介紹,常用數據類型,常用命令,多數據庫與事務的特性以及持久化的概述;如何在Linux上部署,以及使用Java客戶端開發工具包來連接使用Redis,並記錄了常見的問題,關於Redis的高級特性與使用場景後續開新文章進行補充。
參考資料(記錄與分享)
視頻教程教常用命令、數據類型、Jedis簡單使用、事務與持久化簡單概述,屬於入門級別:
Redis入門【慕課網】
這篇很全的概述,包含特性、場景、還有基本的用法,都是概述性的簡要說明:
Redis從入門到實戰【GitChat技術雜談】
這篇稍微有點高級,哈哈哈:
Redis總結【JavaGuide】
可以在線的測試一些學會的命令:
Redis官方在線測試頁面
redis.conf相關的,懶翻譯配置文件中英語就看他吧 :
Redis配置文件詳解
在Linux上搞Redis的參考:
Redis在linux上的配置
Redis介紹&使用場景&特點&缺點
(參考資料裏,別人總結的很好,過去看看就好了,重要的再粘過來。)
數據類型&常用操作
數據類型
- 字符串 String 【二進制存儲,最大512M】
- 哈希 Hash
- 字符串列表 List
- 字符串集合 Set
- 有序字符串集合(Sorted Set)
命令操作【這塊重點】
Redis從入門到實戰【GitChat技術雜談】
Redis的Java客戶端開發包
Jedis介紹
- Jedis是Redis官方首選的Java客戶開發包
- GitHub地址
- Jedis中的操作方法基本上和Redis的操作命令是一致的
Jedis 代碼測試
Maven&JUint單元測試依賴
<dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
A candy:在線查詢Maven依賴
簡單的連接測試
import org.junit.Test; import redis.clients.jedis.Jedis; public class JedisTest { /** * Jedis的簡單使用 */ @Test public void demo(){ //設置IP地址以及端口 Jedis jedis = new Jedis("192.168.121.128",6379); //保存數據 jedis.set("name","菜鳥"); //獲取數據 String value = jedis.get("name"); //打印數據 System.out.println(value); //釋放資源 jedis.close(); } }
使用連接池
import org.junit.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class JedisTest { /** * 使用連接池 */ @Test public void demoPoll(){ //連接池配置 JedisPoolConfig config = new JedisPoolConfig(); //最大連接數 config.setMaxTotal(30); //最大空余連接數 config.setMaxIdle(10); //根據 config host port 創建連接池 JedisPool jedisPool = new JedisPool(config,"192.168.121.128",6379); //獲取核心對象 Jedis jedis = null; try { jedis = jedisPool.getResource(); //設置數據 jedis.set("name","弱雞"); //獲取數據 String value = jedis.get("name"); System.out.println(value); }catch (Exception e){ e.printStackTrace(); }finally { //釋放資源 if(jedis != null){ jedis.close(); } if(jedisPool != null){ jedisPool.close(); } } } }
問題&解決方案
Linux上安裝啟動問題
Make報錯
直接 make 如果報錯,則執行
make MALLOC=libc
;然後./redis-server
啟動的一個小問題,還是要說一下
教程裏面的redis版本低的原因吧,啟動是
./bin/redis-server
我用的時候都在src目錄下,而非bin,所以不進入目錄情況下帶目錄名啟動應該是./src/redis-server
Jedis連接不上的問題
Jedis連接Linux上的redis出現 DENIED Redis is running in protected mode問題的解決方案
為什麽如上更改了配置還報錯? 啟動的時候記得加載配置文件
./redis-server ./redis.conf
連接超時
原因:Linux 上的6379端口沒有打開,需要在防火墻中打開該端口
設置Linux的端口開放:
(1)vim /etc/sysconfig/iptables
(2)
-A INPUT -m state -- state NEW -m tcp -p --dport 6379 -j ACCEPT
[可以yy復制22端口那行然後,p粘貼]
(3)重啟防火墻設置:
service iptables restart
多數據庫與事務特性
多數據庫
- select 1 選擇數據庫 默認是0庫
- 移動某個key到其他數據庫 move key 1
事務
也就是命令串行化、原子化執行,似的數據具有一致性
- 開啟事務 multi
- 提交事務 exec
- 回滾事務 discard
Redis的持久化
Redis之所以快,就是他的數據存儲在了內存中(難怪多了會崩),為了能夠重啟Redis後數據仍然能夠存在並讀取使用,就需要將數據存儲到磁盤裏。
兩種方式:
- RDB 方式
- AOF 方式
RDB方式
優勢:
- 數據庫只包含一個文件,通過文件備份策略,定期配置,恢復系統災難
- 壓縮文件轉移到其他介質上
- 性能最大化,redis開始持久化時,分叉出進程,由子進程完成持久化的工作
,避免服務器進程執行I/O操作,啟動效率高
劣勢:
- 無法高可用:系統一定在定時持久化之前宕機,數據還沒寫入,數據已經丟失
- 通過fock分叉子進程完成工作,數據集大的時候,服務器需要停止幾百毫秒甚至1秒
配置:
cd /usr/local/redis
vim redis.conf
默認:
save 900 1 #每900秒至少1個key變化,持久化一次,到內存一個快照
save 300 10 #每300秒至少10個key變化,往硬盤寫一次
save 60 10000 #每60秒至少10000個key變化,寫一次
dbfilename dump.rdb #數據的文件名
dir ./ #保存的路徑,redis路徑下
AOF方式
優勢:
同步:
a. 每秒同步:異步完成,效率高,一旦系統宕機,修改的數據丟失 b. 每修改同步:同步持久化,每分鐘發生的變化記錄到磁盤中,效率低,安全c. 不同步
日誌寫入操作追加模式append
a.系統宕機,不影響存在的內容
b.寫入一半數據,若系統崩潰,下次啟動redis,redis-check-aof工具解決數據一致性如果日誌過大,自動重寫機制,修改的數據寫入到到磁盤文件,創建新文件,記錄產生的修改命令,重寫切換時,保證數據安全
格式清晰的日誌文件,完成數據的重建
劣勢:
- 對於相同數據文件,相比RDB,A OF文件較大
- 效率低
配置:
vim redis.conf
默認:
appendonly no #AOF方式默認關閉
appendfilename appendonly.aof #配置文件
appendfsync always #每修改一次,同步到磁盤上
appendsync everysec 每秒同步到磁盤一次
appensync no 不同步
Redis學習與總結