1. 程式人生 > 其它 >Redis入門筆記

Redis入門筆記

Nosql

1 為什麼要用Nosql

  • 單機效能不夠

    • 垂直拆分--快取記憶體

    • 水平拆分--伺服器叢集

  • not only sql

  • 泛指非關係性資料庫

    • 方便擴充套件(key,value)

    • 大資料量,高效能

    • 資料型別多樣,不需要設計資料模式

2 NoSQL的四大分類

  • kv鍵值對

    • redis

    • tair

    • Memocache

  • 文件形資料庫

    • MongoDB(處理文件)

    • ConthDB

  • 圖關係型資料庫

  • 列儲存資料庫

Redis入門

Remote Dictionary Server

1 能做什麼

  • 記憶體儲存,持久化儲存

  • 效率高,可以用於快取記憶體

  • 釋出訂閱系統

  • 地圖資訊分析

  • 計時器、計數器

2 特性

  • 資料型別多樣

  • 持久化

  • 叢集

  • 事務

3 開始

  • redis-server

  • redis-cli -p 6379

  • shutdown

  • redis-benchmark 測試效能,後面可帶引數(併發數等)

4 基礎命令

  1. redis預設有16個數據庫,預設使用第0個。

  2. select 切換資料庫

  3. set key value 新增一條記錄

  4. Keys * 檢視當前資料庫所有key

  5. dbsize 檢視資料庫大小

  6. Flushdb 清空當前資料庫的keys

  7. flushall 清除全部資料庫資料

  8. EXISTS key 判斷是否存在

  9. Move key 1 移除記錄

  10. EXPIRE key 10 設定過期時間,單位是秒

  11. ttl key 檢視當前key的剩餘時間

  12. type key 檢視型別

5 重要知識

  1. redis是單執行緒的。redis是基於記憶體操作的,cpu不是redis效能瓶頸。

  2. 資料全部放在記憶體中,沒有上下文切換,速度很快。

Redis資料型別

1. String

String型別是二進位制安全的,意思是 redis 的 string 可以包含任何資料。如數字,字串,jpg圖片或者序列化的物件。

  1. APPEND key "xxx" 增加一串字元

  2. STRLEN key 獲取字串長度

  3. Incr key 加一操作

  4. decr key 減一

  5. GETRANGE key 1 3 獲取從一到三的字串

  6. SETRANGE key 1 xx 更改字串

  7. setex 設定過期時間

  8. setnx 如果不存key才設定(分散式鎖)

  9. mset 批量操作,是原子性的

  10. mget

  11. mset user:1:name zhangsan user:1:age2

  12. Getset

2. List

實際是一個連結串列,兩邊插入或改動效率較高,中間效率會低一些。

  1. 在redis裡面可以將list實現成棧,佇列等。

  2. LPUSH list value

  3. LRANGE list 0 -1 顯示list中所有元素

  4. LRANGE list 0 1 顯示指定範圍元素

  5. RPUSH value 新增到最下面

  6. LPOP

  7. RPOP

  8. lindex list 1 獲取第一個值(最下面)

  9. Llenth list 獲取list長度

  10. Lrem list 1 one 移除一個值為one的

  11. LTRIM list 1 2 截斷,1之前2之後的元素都沒了

  12. RPUSHLPOP list1 list2 移除列表中最後一個元素並且移動到新的列表中

  13. LSET list 1 value 更改1號元素的值

  14. LINSERT list before "value1" "value2"在value1前面插入value2

  15. LINSERT list after

3. SET

  1. sadd myset "hello"; 新增元素

  2. sismember myset hello; 確認是否存在

  3. smenbers myset 返回所有元素

  4. srem myset hello 刪除元素

  5. srandmember 隨機選擇一個元素

  6. spop myset 隨機刪除一些set集合中的元素

  7. smove set1 set2 移動元素

  8. SDIFF set1 set2 差集 set1-set2

  9. sinter set1 set2 交集

  10. sunion set1 set2 並集

4. Hash

Map集合,儲存<key,value>

  1. Set myhash key value

  2. hmset myhash key1 value1 key2 value2

  3. hmget myhash key1 key2

  4. hgetall myhash

  5. hdel myhash key1

  6. hlen myhash

  7. hexists myhash key1 判斷是否存在

  8. hkeys myhash 只獲得所有keys

  9. hvals myhash 只獲得所有value

  10. hincrby myhash key 1 增一

  11. hsetnx myhash key1 hello 如果不存在可以設定

5. Zset(有序集合)

  1. zadd myset 1 one

特殊資料型別

1. geospatial

地理位置資料

  1. geoadd mygeo 經度 緯度 名稱

  2. geodist 計算距離

  3. georadius 計算半徑內地點

2. hyperloglog

基數統計,類似set,效能更高,可能有錯誤率但很小

佔用記憶體固定

3. BitMap

所有操作二進位制位來進行記錄,就只有0和1兩個狀態

事務

  1. redis單條命令不保證原子性

  2. 沒有隔離級別的概念

執行順序

  1. 開啟事務 multi,後面的命令就在事務中了

  2. 命令入隊

  3. 執行事務 exec

  4. 放棄事務 discard

正常執行事務

multi
set k1 v1
set k2 v2
get k2
set k3 v3
exec

編譯型異常:所有事務不會執行

執行時異常:1/0 如果事務佇列中存在語法性錯誤,那麼執行命令的時候,其他命令是可以正常執行的,錯誤命令丟擲異常!

悲觀鎖

  • 無論做什麼都加鎖

樂觀鎖

  • watch 監視物件

  • 如果其他執行緒修改了watch的物件,提交事務執行就會出錯,不能執行成功

  • unwatch 解鎖

  • 執行時比較剛監視的時候的值,如果有改變就執行失敗

Jedis

SpringBoot 採用lettuce,使用netty連線,執行緒安全。

Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.set("name","nanxi");
Transaction transaction = jedis.multi();
try{
transaction.set("name","abc");
transaction.exec();
}catch (Exception e){
transaction.discard();
}finally {
System.out.println(jedis.get("name"));
}

SpringBoot

RedisTemplate redistemplate;

redisTemplate opsForList;

lettuce傳輸資料會序列化

// 儲存java物件,序列化
// 配置自定義序列化方法,預設jdk序列化會傳輸亂碼
Student student = new Student();
student.setId(9527L);
student.setName("nanxi");
student.setAge(22);
student.setEmail("[email protected]");
String jsonStudent = new ObjectMapper().writeValueAsString(student);
redisTemplate.opsForValue().set("student",jsonStudent);

redisTemplate.opsForValue().set(key,value);



Set<Object> set1 = new HashSet<>();
Set<Object> set2 = new HashSet<>();
//redis事務
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.set("name","nanxi");
Transaction transaction = jedis.multi();
try{
transaction.set("name","abc");
transaction.exec();
}catch (Exception e){
transaction.discard();
}finally {
System.out.println(jedis.get("name"));
}

Redis.conf

  1. 配置檔案unit單位對大小不敏感。

  2. 可以包含多個配置檔案+路徑

  3. 網路配置

    • IP

    • 埠號

    • 受保護模式

    • daemonize no 以守護程序方式執行,終端視窗關閉就退出了

    • loglevel notice 日誌通知,notice表示日誌級別,還有debug、verhouse、warning

    • logfile 日誌檔名

    • databases 16 資料庫數量預設16個

  4. 快照

    持久化,在規定時間內,執行了多少次操作,則會持久化到檔案.rdb.aof

    • save 900 1 如果900秒內至少有一個key進行了修改,就進行持久化操作

    • stop-writes-on-bgsave-error yes 持久化如果出錯,是否還需要繼續工作!

    • rdbcompression yes 預設開啟壓縮rdb檔案

    • rdbchecksum 儲存rdb檔案的時候,進行錯誤的檢查校驗

    • dir ./ rdb檔案目錄

  5. 安全

    • 預設沒有密碼

    • config set requirepass 設定密碼

    • auth pass 用密碼登陸

  6. 客戶端限制

    • 最大客戶端數 預設1w maxclients

    • maxmemory <byts> 預設最大記憶體配置,64位系統沒有限制記憶體大小

    • maxmemory-policy noeviction 記憶體達到上限後的處理策略

      1、volatile-lru:只對設定了過期時間的key進行LRU(預設值)

      2、allkeys-lru : 刪除lru演算法的key

      3、volatile-random:隨機刪除即將過期key

      4、allkeys-random:隨機刪除

      5、volatile-ttl : 刪除即將過期的

      6、noeviction : 永不過期,返回錯誤

  7. APPEND ONLY

    1. appendonly no 預設是不開啟aof模式的,使用rdb方式持久化。

    2. appendfsync everysec 每秒執行一次同步

Redis持久化

RDB(Redis DataBase)

  1. save 900 1 如果900秒內至少有一個key進行了修改,就進行持久化操作,生成一個dump.rdb檔案。

  2. 觸發機制:

    • save的規則滿足的情況下,會自動觸發rdb規則。

    • 執行flushall命令,也會觸發rdb規則

    • 退出redis,也會產生rdb檔案

  3. 啟動就會自動恢復其中的資料

  4. 優點:適合大規模的資料恢復;對資料一致性要求不高。

    缺點:需要一定的時間間隔程序操作,如果redis宕機最後一次資料就沒有了,持久化時會開一個子程序,利用記憶體空間。

    AOF (Append Only File)

    1. 以日誌的形式將所有寫操作記錄下來,需要資料恢復的時候重寫就是了,預設是不開啟的。

    2. 如果aof檔案有錯誤,這時候redis是啟動不起來的,使用redis-check-aof --fix 修復aof檔案。

    優點:

    • 每一次修改都同步,檔案的完整性會更好。

    • 每秒同步一次,可能丟失一秒資料

    • 從不同步,效率最高的!

    缺點:

    • 資料檔案較大,資料恢復慢

    • 執行效率低

Redis釋出訂閱

Redis主從複製

1主多從

  1. 資料複製是單向的,讀寫分離

  2. 資料冗餘,故障恢復,負載均衡,高可用基石

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0 #沒有從機
master_failover_state:no-failover
master_replid:51e20a80a5cde6f38c457e742fe61c06bed3b3a9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

可以配置單機多叢集,使用不同的配置檔案。

slaveof ipadress port
#配置成主機的從機

在配置檔案中的配置是永久的配置。

從機不能執行寫操作。掉線的從機重連資料會同步。

  • 全量複製

  • 增量複製

層次模式:主--從--從

slaveof no one 從機變成主機

原主機回來也沒用了。

哨兵模式

sentinel.conf 哨兵的配置檔案,需要配置它監聽的主機。

優點:

  1. 哨兵叢集基於主從複製模式,所有的主從配置優點,有權遊。主從可以切換,故障可以轉移。更加健壯。

  2. redis不好線上擴容,叢集數量一旦上線,線上擴容就十分麻煩。

  3. 配置檔案

    1. 埠號

    2. sentinel.conf工作目錄

    3. 監視目錄。

Redis快取穿透和雪崩

redis快取中沒有的話,請求會到持久層MySQL,請求過多時造成伺服器崩掉。

布隆過濾器

布隆過濾器是一種資料結構,對所有可能差選的引數以hash的形式儲存,在控制層先進行校驗,不符合則丟棄,從而避免了對底層儲存系統的查詢壓力。

快取空物件

熱點資料不過期,設定分散式鎖

停掉一些服務,保證主要的服務可用