1-1NoSQL的簡述
nosql非關系資料庫(redis mongodb)
優點:
去掉了關系資料庫的"關系特性" 易擴充有非常高的讀寫性能 尤其在大資料量下靈活的資料模型(無需提前履歷字段)高可用
缺點:
沒有統一的标準 層出不窮
四大分類:
一、鍵值對存儲 =>redis
優勢:查找速度比較快
劣勢:存儲資料缺少結構化
二、列存儲
優勢:查找速度比較快 擴充性強
劣勢:功能比較局限性
三、文檔資料庫 =>MongoDB
優勢:資料結構要求不嚴格
劣勢:查詢性能不是特别的高
四、圖形資料庫 =>應用于社交網絡的資料庫
優勢:圖結構的算法
劣勢:不容易分布式叢集方案
2-1Redis概述
redis是用c語言開發的開源的高性能的鍵值對的資料庫,通過提供多種鍵值資料類型來适應不同場景下的需求
redis支援的鍵值對的資料類型:字元串類型、清單類型、有序集合類型、散列類型、集合類型
redis應用場景:緩存(搶購、搶紅包等高并發場景)、任務隊列、應用排行榜、網站通路統
讀取速度能到到11W/S 寫8.1W/S
Jedis
jedis是redis官方首選的java用戶端開發包
單連結模式和連接配接池模式
3-1Redis的資料結構之字元串
Redis中的資料類型
字元串(String),字元串清單(list),有序字元串集合(sorted set),哈希(hash),字元串集合(set)
其中String,hash比較常用
常用指令:
getset 先取值再設定值
incr 數值增加
decr 數值減少
擴充指令 incrby num 5
decrby num 5
append 追加字元串
3-2Redis的資料結構之哈希
存儲hash:類似于hashMap
hset hashname key value:向hashname中存儲一個鍵值對key-value
hset hashname key1 value1 key2 value2...:一次向hashname中存儲對個鍵值對
hget hashname key:擷取hashname中key的值
hmget hashname key1 key2...:一次擷取hashname中多個key的值
hgetall hashname:擷取hashname中所有的key和value
hdel hashname key1 key2:删除hashname中key的值
del hashname:删除hashname
hincryby hashname key value:給hashname中的key的值加上value的值,同理key的值應為int數字類型
hexists hashname key:判斷hashname中是否有key,存在傳回1,不存在傳回0
hlen hashname:傳回hashname中key的個數
hkeys hashname:傳回hashname中的所有key
hvals hashname:傳回hashname中所有的value
3-3Redis的資料結構之List
存儲list:
ArrayList使用數組方式
LinkedList使用雙向連結方式
雙向連結清單中增加資料
雙向連結清單中删除資料
存儲list常用指令:
兩端添加
lpush listname value1 value2 value3:如果listname不存在則建立listname并從左側添加,先添加的元素靠後,下标從0開始。如果listname存在則直接從左側添加
rpush listname value1 value2 value3:從右側添加,先添加的元素靠前,下标從0開始
檢視清單
lrange listname start end:左邊檢視指定範圍内的listname的元素,下标從0開始,如果end為-1代表是最後一個元素
兩端彈出
lpop listname:左邊彈出listname中的第一個元素。如果listname不存在元素則傳回nil,一旦做了彈出操作,被彈出的元素将在listname中消失
rpop listname:尾部(右部)彈出,與lpop同理
擷取清單元素個數
llen listname:擷取listname中元素的個數,如果listname不存在則傳回0
擴充指令
lpushx listname value1 value2...:如果listname存在則進行添加操作,如果listname不存在則添加失敗傳回0
rpushx listname value1 value2...:與lpushx同理
lrem listname count value:如果count大于0,則從左往右删除count個value;如果count小于0,則從右向左删除count個value;如果count等于0則表示删除所有的value
lset listname index value:将listname中下标為index的值修改為value
linsert listname before listvalue value:在listname中的listvalue前插入一個value
linsert listname after listvalue value:在listname中的listvalue之後插入一個value
rpoplpush listname1 listname2:将listname1中右邊的第一個元素進行彈出然後向listname2的左側進行添加彈出的元素
3-4Redis的資料結構之Set
Redis資料結構(Set):List允許出現重複資料,Set不允許出現重複資料;Set最大元素數量是4294967295
指令:
(1)存:sadd 列名 [值...]
(2)删:srem 列名 [值...]
(3)查全:smembers 列名
(4)查是否存在:sismember 列名 值,1表示存在,0表示不存在
(5)差集:sdiff 列名1 列名2 (與順序有關)
(6)交集:sinter 列名1 列名2
(7)并集:sunion 列名1 列名2
(8)查數量:scard 列名
(9)随機查:srandmember 列名
(10)将差集存到新集合中:sdiffstore 新列名 列名1 列名2
(11)将交集存到新集合中:sinterstore 新列名 列名1 列名2
(12)将并集存到新集合中:sunionstore 新列名 列名1 列名2
3-5Redis的資料結構之Sorted Set
Redis資料結構(Sort-set):可存儲有序但不重複的資料,根據分數指定存儲順序
指令:
(1)存:zadd 列名 [分數 值]...
(2)查分數:zscore 列名 值
(3)查數量:zcard 列名
(4)單删:zrem 列名 值...;範圍删除:zremrangebyrank 列名 [begin,end]
(5)升序查值:zrange 列名 [begin,end] <withscores>(兩者可為正負數,負數則從反方向開始計數,正數從0開始,負數從-1開始)(withscores帶分數,可選項)
(6)降序查值:zrevrange 列名 [begin,end] <withscores>(兩者可為正負數,負數則從反方向開始計數,正數從0開始,負數從-1開始)(withscores帶分數,可選項)
(7)分數查值:zrangebyscore 列名 [begin,end] <withscores>
(8)分頁查值:zrangebyscore 列名 [begin,end] <withscores limit [begin,end]>
4-1Redis的Keys通用操作
keys *:查詢所有key
keys str? :查詢以字元串str開頭的key
del key1 key2 key3 ... :删除多個key
exists key:判斷key是否存在,存在傳回1不存在傳回0
rename key newkey :對key進行重命名
expire key times(秒) :設定過期的時間
ttl key:檢視key所剩的時間,若沒有設定,則傳回-1
type key :擷取指定key的類型
5-1Redis特性
Redis特性:
(1)每個Redis執行個體有16個資料庫,角标從0~15,預設為0,也可以通過select來選擇資料庫。比如:select 1,選擇1号資料庫
move用于移動資料庫。比如:move myset 1,表示移動myset這個key到1号資料庫。
(2)開啟事務會将任務放到queue中,當送出事務時逐個執行
指令:
(1)切換資料庫:select [0~15]
(2)開啟事務:multi
(3)送出事務:exec
(4)復原事務:discard
6-1Redis的持久化概述
Redis持久化
資料從記憶體同步到硬碟
兩種持久化方式:
RDB方式
AOF方式
持久化使用的方式:
1.RDB方式:
預設支援,在指定的時間間隔内,将記憶體中的資料集快照寫入到磁盤
2.AOF方式:
日志的形式記錄伺服器處理的每一個操作,伺服器啟動之初,讀取檔案,重新建構資料庫
3.無持久化
通過配置繼用Redis持久化功能,Redis緩存機制
4.同時使用RDB和AOF
6-2Redis的RDB資料持久化方式
RDB
優勢:
1.資料庫隻包含一個檔案,通過檔案備份政策,定期配置,恢複系統災難
2.壓縮檔案轉移到其他媒體上
3.性能最大化,redis開始持久化時,分叉出程序,由子程序完成持久化的工作
,避免伺服器程序執行I/O操作,啟動效率高
劣勢:
1.無法高可用:系統一定在定時持久化之前當機,資料還沒寫入,資料已經丢失
2.通過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路徑下
6-3Redis的AOF資料持久化方式
AOF
優勢:
1.同步:
a.每秒同步:異步完成,效率高,一旦系統當機,修改的資料丢失
b.每修改同步:同步持久化,每分鐘發生的變化記錄到磁盤中,效率低,安全
c.不同步
2.日志寫入操作追加模式append
a.系統當機,不影響存在的内容
b.寫入一半資料,若系統崩潰,下次啟動redis,redis-check-aof工具解決資料一緻性
3.如果日志過大,自動重寫機制,修改的資料寫入到到磁盤檔案,建立新檔案,記錄産生的修改指令,重寫切換時,保證資料安全
4.格式清晰的日志檔案,完成資料的重建
劣勢:
1.對于相同資料檔案,相比RDB,AOF檔案較大
2.效率低
配置:
vim redis.conf
預設:
appendonly no #AOF方式預設關閉
appendfilename appendonly.aof #配置檔案
#appendfsync always #每修改一次,同步到磁盤上
appendsync everysec 每秒同步到磁盤一次
#appensync no 不同步
實踐打開AOF:
appendonly yes
appendfsync always
終端2:先斷開redis
./bin/redis-cli
shutdown
啟動redis:
./bin/redis-server ./redis.conf
終端1:set name 100
終端2:産生appendonly.aof檔案
終端1:flushall 清空資料庫
終端2:
./bin/redis-cli shutdown
vim appendonly.aof
删除flushall
./bin/redis-server ./redis.conf
./bin/redis-cli
keys *
資料還原
7-1中文亂碼問題
在啟動redis資料庫之前加上chcp 65001
在啟動時用 redis-cli --raw
防止中文亂碼