Redis入門筆記
1 為什麼要用Nosql
-
單機效能不夠
-
垂直拆分--快取記憶體
-
水平拆分--伺服器叢集
-
-
not only sql
-
泛指非關係性資料庫
-
方便擴充套件(key,value)
-
大資料量,高效能
-
資料型別多樣,不需要設計資料模式
-
2 NoSQL的四大分類
-
kv鍵值對
-
redis
-
tair
-
Memocache
-
-
文件形資料庫
-
MongoDB(處理文件)
-
-
-
圖關係型資料庫
-
列儲存資料庫
Redis入門
Remote Dictionary Server
1 能做什麼
-
記憶體儲存,持久化儲存
-
效率高,可以用於快取記憶體
-
釋出訂閱系統
-
地圖資訊分析
-
計時器、計數器
2 特性
-
資料型別多樣
-
持久化
-
叢集
-
事務
3 開始
-
redis-server
-
redis-cli -p 6379
-
shutdown
-
redis-benchmark 測試效能,後面可帶引數(併發數等)
4 基礎命令
-
redis預設有16個數據庫,預設使用第0個。
-
select 切換資料庫
-
set key value 新增一條記錄
-
Keys * 檢視當前資料庫所有key
-
dbsize 檢視資料庫大小
-
Flushdb 清空當前資料庫的keys
-
flushall 清除全部資料庫資料
-
EXISTS key 判斷是否存在
-
Move key 1 移除記錄
-
EXPIRE key 10 設定過期時間,單位是秒
-
ttl key 檢視當前key的剩餘時間
-
type key 檢視型別
5 重要知識
-
redis是單執行緒的。redis是基於記憶體操作的,cpu不是redis效能瓶頸。
-
資料全部放在記憶體中,沒有上下文切換,速度很快。
Redis資料型別
1. String
String型別是二進位制安全的,意思是 redis 的 string 可以包含任何資料。如數字,字串,jpg圖片或者序列化的物件。
-
APPEND key "xxx" 增加一串字元
-
STRLEN key 獲取字串長度
-
Incr key 加一操作
-
decr key 減一
-
GETRANGE key 1 3 獲取從一到三的字串
-
SETRANGE key 1 xx 更改字串
-
setex 設定過期時間
-
setnx 如果不存key才設定(分散式鎖)
-
mset 批量操作,是原子性的
-
mget
-
mset user:1:name zhangsan user:1:age2
-
Getset
2. List
實際是一個連結串列,兩邊插入或改動效率較高,中間效率會低一些。
-
在redis裡面可以將list實現成棧,佇列等。
-
LPUSH list value
-
LRANGE list 0 -1 顯示list中所有元素
-
LRANGE list 0 1 顯示指定範圍元素
-
RPUSH value 新增到最下面
-
LPOP
-
RPOP
-
lindex list 1 獲取第一個值(最下面)
-
Llenth list 獲取list長度
-
Lrem list 1 one 移除一個值為one的
-
LTRIM list 1 2 截斷,1之前2之後的元素都沒了
-
RPUSHLPOP list1 list2 移除列表中最後一個元素並且移動到新的列表中
-
LSET list 1 value 更改1號元素的值
-
LINSERT list before "value1" "value2"在value1前面插入value2
-
LINSERT list after
3. SET
-
sadd myset "hello"; 新增元素
-
sismember myset hello; 確認是否存在
-
smenbers myset 返回所有元素
-
srem myset hello 刪除元素
-
srandmember 隨機選擇一個元素
-
spop myset 隨機刪除一些set集合中的元素
-
smove set1 set2 移動元素
-
SDIFF set1 set2 差集 set1-set2
-
sinter set1 set2 交集
-
sunion set1 set2 並集
4. Hash
Map集合,儲存<key,value>
-
Set myhash key value
-
hmset myhash key1 value1 key2 value2
-
hmget myhash key1 key2
-
hgetall myhash
-
hdel myhash key1
-
hlen myhash
-
hexists myhash key1 判斷是否存在
-
hkeys myhash 只獲得所有keys
-
hvals myhash 只獲得所有value
-
hincrby myhash key 1 增一
-
hsetnx myhash key1 hello 如果不存在可以設定
5. Zset(有序集合)
-
zadd myset 1 one
特殊資料型別
1. geospatial
地理位置資料
-
geoadd mygeo 經度 緯度 名稱
-
geodist 計算距離
-
georadius 計算半徑內地點
2. hyperloglog
基數統計,類似set,效能更高,可能有錯誤率但很小
佔用記憶體固定
3. BitMap
所有操作二進位制位來進行記錄,就只有0和1兩個狀態
事務
-
redis單條命令不保證原子性
-
沒有隔離級別的概念
執行順序
-
開啟事務 multi,後面的命令就在事務中了
-
命令入隊
-
執行事務 exec
-
放棄事務 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
-
配置檔案unit單位對大小不敏感。
-
可以包含多個配置檔案+路徑
-
網路配置
-
IP
-
埠號
-
受保護模式
-
daemonize no 以守護程序方式執行,終端視窗關閉就退出了
-
loglevel notice 日誌通知,notice表示日誌級別,還有debug、verhouse、warning
-
logfile 日誌檔名
-
databases 16 資料庫數量預設16個
-
-
快照
持久化,在規定時間內,執行了多少次操作,則會持久化到檔案.rdb.aof
-
save 900 1 如果900秒內至少有一個key進行了修改,就進行持久化操作
-
stop-writes-on-bgsave-error yes 持久化如果出錯,是否還需要繼續工作!
-
rdbcompression yes 預設開啟壓縮rdb檔案
-
rdbchecksum 儲存rdb檔案的時候,進行錯誤的檢查校驗
-
dir ./ rdb檔案目錄
-
-
安全
-
預設沒有密碼
-
config set requirepass 設定密碼
-
auth pass 用密碼登陸
-
-
客戶端限制
-
最大客戶端數 預設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 : 永不過期,返回錯誤
-
-
APPEND ONLY
-
appendonly no 預設是不開啟aof模式的,使用rdb方式持久化。
-
appendfsync everysec 每秒執行一次同步
-
Redis持久化
RDB(Redis DataBase)
-
save 900 1 如果900秒內至少有一個key進行了修改,就進行持久化操作,生成一個dump.rdb檔案。
-
觸發機制:
-
save的規則滿足的情況下,會自動觸發rdb規則。
-
執行flushall命令,也會觸發rdb規則
-
退出redis,也會產生rdb檔案
-
-
啟動就會自動恢復其中的資料
-
優點:適合大規模的資料恢復;對資料一致性要求不高。
缺點:需要一定的時間間隔程序操作,如果redis宕機最後一次資料就沒有了,持久化時會開一個子程序,利用記憶體空間。
AOF (Append Only File)
-
以日誌的形式將所有寫操作記錄下來,需要資料恢復的時候重寫就是了,預設是不開啟的。
-
如果aof檔案有錯誤,這時候redis是啟動不起來的,使用redis-check-aof --fix 修復aof檔案。
優點:
-
每一次修改都同步,檔案的完整性會更好。
-
每秒同步一次,可能丟失一秒資料
-
從不同步,效率最高的!
缺點:
-
資料檔案較大,資料恢復慢
-
執行效率低
-
Redis釋出訂閱
Redis主從複製
1主多從
-
資料複製是單向的,讀寫分離
-
資料冗餘,故障恢復,負載均衡,高可用基石
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 哨兵的配置檔案,需要配置它監聽的主機。
優點:
-
哨兵叢集基於主從複製模式,所有的主從配置優點,有權遊。主從可以切換,故障可以轉移。更加健壯。
-
redis不好線上擴容,叢集數量一旦上線,線上擴容就十分麻煩。
-
配置檔案
-
埠號
-
sentinel.conf工作目錄
-
監視目錄。
-
Redis快取穿透和雪崩
redis快取中沒有的話,請求會到持久層MySQL,請求過多時造成伺服器崩掉。
布隆過濾器
布隆過濾器是一種資料結構,對所有可能差選的引數以hash的形式儲存,在控制層先進行校驗,不符合則丟棄,從而避免了對底層儲存系統的查詢壓力。
快取空物件
熱點資料不過期,設定分散式鎖