1. 程式人生 > >非關係型資料庫NoSQL之Redis

非關係型資料庫NoSQL之Redis

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

防止中文亂碼