若是轉載,請註明博文來源:
www.cnblogs.com/xinysu/ ,版權歸 博客園 蘇家小蘿蔔 全部。望各位支持!
少年入門筆記,整理出來一塊兒入坑!入門的視屏來自imooc的:http://www.imooc.com/learn/839
1 NOSQL概述
- 什麼是noSQL
- not only sql
- 非關係型數據庫
- 爲何須要NoSQL
- web2.0大規模動態網站的興起
- high performance ,高併發讀寫,動態頁面展現與交互,好比微博點贊評論等操做,實時統計在線人數排行榜等
- huge storage,海量數據的高效存儲和訪問,大型網站的用戶登陸系統
- high scalability && high availability,高可擴展性和高可用性
- 主流NOSQL產品
- redis,mongodb,couchdb
- NoSQL的特色
- 易擴展
- 靈活數據模型
- 大數據量,高性能
- 高可用
- NoSQL數據庫的四大分類
- 鍵值存儲,redis
- 優點,快速查詢
- 劣勢,存儲數據缺乏結構化
- 列存儲,hbase
- 優點,快速查詢
- 劣勢,功能侷限
- 文檔數據庫,mongodb
- 優點,數據結構要求不嚴格
- 劣勢,查詢性能並不是特別高,缺乏統一查詢的語法
- 圖形數據庫,infogate
- 優點,社交網絡,利用圖結構的相關算法
- 劣勢,須要對整個圖作算法分析,不利於分佈式方案
2 redis概述
C語言編寫的高性能鍵值對數據,支持的鍵值數據類型:
- 字符串類型
- 列表類型
- 有序集合類型
- 散列
- 集合類型
Redis的應用場景:
- 緩存
- 網站訪問統計
- 任務隊列
- 數據過時處理
- 應用排行榜
- 分佈式集羣架構中的session分離
3 redis安裝和使用
3.1 redis安裝
- 依賴環境
- gcc-c++
1 環境準備
#官網下載 redis 3.2.5版本 wget http://download.redis.io/releases/redis-4.0.1.tar.gz #安裝 C 編譯環境 yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc gcc-c++ 2 安裝 解壓安裝包後,進入文件目錄編譯,編譯結束時,會提示 Hint: It's a good idea to run 'make test' ,建議在安裝前先測試預安裝下,make test預安裝後,遇到錯誤:You need tcl 8.5 or newer in order to run the Redis test ,缺失安裝包tcl,因此須要先安裝這個 安裝包後再次運行 make test,正常後再進行redis安裝。 詳細步驟以下: #解壓二進制包 tar -zvxf /opt/redis-3.2.5 #進入到文件目錄 cd redis-3.2.5 #編譯 make #測試安裝(稍微耗費點時間) make test #可能會提醒須要安裝最新版的tcl #yum install tcl #指定路徑安裝 make PREFIX=/usr/local/redis install
安裝結束後,進入到安裝路徑中,
[root@bogon bin]# ls -lh /usr/local/redis/bin/
total 22M
-rwxr-xr-x. 1 root root 2.4M Aug 13 18:40 redis-benchmark
-rwxr-xr-x. 1 root root 5.5M Aug 13 18:40 redis-check-aof
-rwxr-xr-x. 1 root root 5.5M Aug 13 18:40 redis-check-rdb
-rwxr-xr-x. 1 root root 2.5M Aug 13 18:40 redis-cli
lrwxrwxrwx. 1 root root 12 Aug 13 18:40 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 5.5M Aug 13 18:40 redis-server
這幾個指令用途分別是:
- redis-benchmark
- 性能測試工具
- redis-check-aof
- aof文件修復工具
- redis-check-rdb
- rdb文件檢查工具
- redis-cli
- redis客戶端
- redis-server
- redis服務器啓動命令
- redis-sentinel
3.2 配置文件修改
1 #拷貝conf文件到/etc目錄 2 cp /opt/redis/redis-4.0.1/redis.conf /etc/redis.conf 3 4 5 #redis.conf 參數說明 6 7 ################################## NETWORK ##################################### 8 9 #綁定的主機地址 10 bind 127.0.0.1 11 12 #保護模式,是否容許 沒有認證配置的主機或接口鏈接redis,默認是啓動保護模式,則不容許這種狀況 13 protected-mode yes 14 15 #指定redis的監聽端口,默認端口是6379,做者在本身的一篇博文中解釋了爲何選用6379做爲默認端口,由於6379在手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字,嗯,你開發的,你說了算。 16 port 6379 17 18 # In high requests-per-second environments you need an high backlog in order 19 # to avoid slow clients connections issues. Note that the Linux kernel 20 # will silently truncate it to the value of /proc/sys/net/core/somaxconn so 21 # make sure to raise both the value of somaxconn and tcp_max_syn_backlog 22 # in order to get the desired effect. 23 24 tcp-backlog 511 25 26 #客戶端連接多長時間後關閉連接,單位是秒,指定爲0,則表示關閉該功能 27 timeout 0 28 29 # A reasonable value for this option is 300 seconds, which is the new 30 # Redis default starting with Redis 3.2.1. 31 tcp-keepalive 300 32 33 ################################# GENERAL ##################################### 34 35 #Redis默認不是以守護進程的方式運行,能夠經過該配置項修改,使用yes啓用守護進程 36 daemonize yes 37 38 # If you run Redis from upstart or systemd, Redis can interact with your 39 # supervision tree. Options: 40 # supervised no - no supervision interaction 41 # supervised upstart - signal upstart by putting Redis into SIGSTOP mode 42 # supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET 43 # supervised auto - detect upstart or systemd method based on 44 # UPSTART_JOB or NOTIFY_SOCKET environment variables 45 # Note: these supervision methods only signal "process is ready." 46 # They do not enable continuous liveness pings back to your supervisor. 47 supervised no 48
3.3 服務啓動與關閉
1 #服務端啓動 2 [root@bogon redis-4.0.1]# cd /usr/local/redis/ 3 [root@bogon redis]# ./bin/redis-server /etc/redis.conf 4 74537:C 13 Aug 18:53:30.774 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 5 74537:C 13 Aug 18:53:30.774 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=74537, just started 6 74537:C 13 Aug 18:53:30.774 # Configuration loaded 7 [root@bogon redis]# ps axu | grep redis 8 root 74538 0.6 0.2 145248 2168 ? Ssl 18:53 0:00 ./bin/redis-server 127.0.0.1:6379 9 root 74665 0.0 0.0 112648 968 pts/4 S+ 18:53 0:00 grep --color=auto redis 10 11 #客戶端啓動 12 redis-cli [-h 127.0.0.1] [-p 6379] 13 127.0.0.1:6379> ping 14 PONG 15 16 #存儲鍵值對 17 127.0.0.1:6379> set name imooc 18 OK 19 20 #獲取name對應的value 21 127.0.0.1:6379> get name 22 "imooc" 23 24 #獲取全部keys 25 127.0.0.1:6379> keys * 26 1) "name" 27 28 #刪除keys 29 127.0.0.1:6379> del name 30 (integer) 1 31 127.0.0.1:6379> get name 32 (nil) 33 34 #關閉服務端 35 redis-cli shutdow
4 redis-py的入門
redis有支持很是多種語言編寫的客戶端,能夠從官網查看
https://redis.io/clients ,redis-py是redis官方網站首選的python客戶端開發包,本人只會點點python,因此從這個入門。
redis-py的github地址:
https://github.com/andymccurdy/redis-py
5 redis數據類型
鍵值對種key的注意事項:
- 不要過長
- 最好不要超過1024個字節
- 不只消耗內存,也影響查找效率
- 不要太短
- 好比設置爲a,沒有實際意義,可能會下降key的可讀性
- 統一命名規範
5.1字符串 string
string中的一個key對應一個value,values最長可達512Mb。
string經常使用命令:
- 賦值
- set key value
- 取值
- get key
- 取值後賦值
- getset key value
- 數值增減
- 自增1
- 若是該key不存在,則建立該key,並賦值爲0,0自增後爲1,等同於增長 【key,1】鍵值對
- 若是該key存在,則value自增長1
- incr key
- 自減1
- 若是該key不存在,則建立該key,並賦值爲0,0自減後爲-1,等同於增長 【key,-1】鍵值對
- 若是該key存在,則value自減1
- decr key
- 自增指定值
- 若是該key不存在,則建立該key,並賦值爲0,0自增numbers,等同於增長 【key,numbers】鍵值對
- 若是該key存在,則value自增numbers
- incrby key numbers
- 自減指定值
- 若是該key不存在,則建立該key,並賦值爲0,0自減numbers,等同於增長 【key,-numbers】鍵值對
- 若是該key存在,則value自減numbers
- decrby key numbers
- 刪除
- del key
- 擴展
- value追加string內容
- append key string
5.2 哈希 hash
hash能夠存儲多個鍵值對之間的映射,它就像是一個迷你型的redis。
- 賦值
- hset key field value
- hmset key field value [field value ... ]
- 取值
- hget key field
- hmget key field [field ...]
- hgetall key
- 增長數字
- hincrby key field number
- 刪除
- hdel key field
- del key
- 自學命令
- hexists key field
- hlen key
- hkeys key
- hvals key
5.3 字符串列表 list
lish的順序是按照插入的順序,能夠在頭部跟尾部插入數據,若是是在list的兩頭進行操做,那麼效率是很高的,可是若是在list中,則會耗費必定時間。
list的類型:
- arraylist使用數組方式
- 根據索引查詢速度是很是快的
- 可是新增跟刪除操做涉及到位移操做,則會比較慢
- linkedlist使用雙向連接方式
- 每一個元素都記錄了先後元素的指針,刪除跟新增只須要修改先後指針,數據操做較快
list經常使用的命令:
- 兩端添加
- lpush key value [value ...]
- rpush key value [value ...]
- 查看列表
- lrange key start stop
- 指定位置push
- lset key index value
- 列表中第幾個位置插入value,注意位置從0開始
- 指定value插入值
- linsert key before|after pivot value
- 在列表中,從左到右,第一個等於pivot這個值的前面或者後面,插入valuse
- 兩端彈出
- lpop key
- 刪除列表最左邊的value
- rpop key
- 刪除列表最右邊的value
- rpoplpush source distination
- 從source列表右邊刪除一個value,並把這個value存儲進入distination列表中
- 適用於消息發佈過程當中的備份操做
- 獲取列表元素個數
- llen key
- 獲取列表的長度
- 擴展命令
- lpushx key value
- 若是列表存在,則從左端插入push valuse進入列表中,不然返回0
- rpushx key value
- 若是列表存在,則從右端插入push valuse進入列表中,不然返回0
- lrem key count value
- count>0,從列表的左端開始刪除 值等於 value,一共刪除count個
- count<0,從列表的右端開始刪除 值等於 value,一共刪除count個
- count=0,刪除 整個列表中全部 值等於 value
5.4 字符串集合 set
和list類型不一樣的是,set集合中不容許出現重複的元素,set最大能夠包含的元素是 4294967295 。注意,set中是沒有順序的。
用於維護用戶對象的惟一性,以及處理數據對象之間的關聯關係,能夠進行並集交集差集運算。好比購買A產品的用戶ID,放在一個set中,購買另一個B產品的用戶ID,放在另一個set中,這樣就很方便計算同時購買兩個產品的用戶等。
list經常使用指令:
- 添加刪除元素
- sadd key member [member ...]
- srem key member [member ...]
- del key
- 獲取集合中的元素
- smembers key
- 差集運算
- sdiff key1 [key ...]
- 求集合key1與其餘集合的差集
- sdiffstore destination key1 [key ...]
- 求集合key1與其餘集合的差集,並把結果存儲在destination集合中
- 交集運算
- sinter key [key...]
- 求多個集合的交集
- sinterstore destination key [key...]
- 求多個集合的交集,並把結果存儲在destination集合中
- 並集運算
- sunion key [key...]
- 求多個集合的並集
- sunionstore destination key [key...]
- 求多個集合的並集,並把結果存儲在destination集合中
- 擴展命令
- sismember key member
- 查看member在key中是否存在
- srandmember key [count]
- 集合key中隨機放回 count 個元素
- scard key
- 查看集合個數
5.5 有序字符串集合 sorted set
sorted set跟set是比較相似的,集合中不容許出現重複的元素,那麼有啥區別呢?sorted set有順序,從小到大排序,更新操做很是快,訪問數據也很是高效。
應用場景:遊戲排名、微博熱點
經常使用命令:
- 得到元素
- zscore key member
- 獲取有序集合中的某個元素的score值
- zrange key start stop [withscores]
- zrangebyscore key mim max [withscores] [limit offset count]
- 添加元素
- zadd key score member [score member ...]
- 刪除元素
- zrem key member [member...]
- zremrangebyscore key min max
- 擴展查詢
- zincrby key increment member
- zscore key member
- zcount key min max
6 keys的通用操做
- keys *
- 查看全部keys
- del key [key...]
- 刪除多個key
- exists key
- 判斷某個key是否存在,存在返回1,不存在返回0
- rename key newkey
- 重命名某個key
- expire key seconds
- 設置某個key的生命期,過了這個時間就是過時數據
- ttl key
- 查看該key的生命還剩下多少秒
- type key
- 查看key的類型
7 redis的特性
7.1 多數據庫
redis最多支持16個數據,下標0-15表示第幾個數據庫。默認是在0號數據。切換數據庫能夠經過select dbnumber 來切換,也能夠經過move 來移動key從當前數據到指定的數據庫。c++
7.2 事務
事務的指令:multi、exec、discard。redis中,若是某個命令執行失敗,後面的命令還會繼續執行。multi,開啓事務,這個指令後的指令默認爲在同一個事務內,exec等同於提交,discard等同於回滾。
8 redis的持久化
redis的高性能是由於數據都在內存中,若是數據庫重啓,則全部數據都會丟失,那麼如何進行數據持久化呢?
- RDB持久化
- 默認支持,在指定的時間內,把內存的數據寫入磁盤
- AOF持久化
- 以日誌的形式記錄每個操做,啓動的時候,從新執行全部log
- 無持久化
- 不進行持久化,則認爲redis的做用爲緩存,無需持久化數據
- RDB與AOF同時使用
8.1 RDB持久化
- 優點
- redis數據庫僅包含一個文件,對於文件備份是很是方便的,若是系統出現災難時,較容易恢復
- 災難恢復時,備份文件較爲容易單獨轉移到其餘存儲介質
- 數據量很大的時候,啓動速度快
- 劣勢
- 不可以保證數據無丟失,數據丟失時間 = 當前時間-最近備份時間
- 子進程完成持久化工做,若是數據集很大的時候,可能會形成短期內redis所在服務器中止對外服務
- 配置
- RDB默認配置文件中就有,能夠查看redis.conf文件中關於save的設置
-
- save 900 1 :900秒內至少有1個數據變化,則進行持久化
-
- RDB默認配置文件中就有,能夠查看redis.conf文件中關於save的設置
-
-
-
- save 300 10 :300秒內至少有10個數據發生變化,則進行持久化
- save 60 10000 : 60秒內至少有1w個數據發生變化,則進行持久化
- dbfilename 則是命名當前持久文件的名字
- dir,則是定義當前持久化文件的存放路徑
-
-
8.2 AOF持久化
- 優點
- 更高的數據安全性
- 每秒同步,最高丟失1s數據
- 每操做數同步,每次發生數據的變化都會當即記錄到磁盤中,性能最低
- append追加文件備份
- 備份過程當中出現問題,不會破壞以前的日誌備份
- 若是寫入了一半數據,而後出現系奔潰的問題,在redis下一次啓動以前,能夠經過redis_check_aof工具解決數據一致性問題
- 若是日誌備份過大
- redis會自動啓動日誌重寫機制,append過程當中,會把備份數據寫入到老的備份文件中,而且會用一個新文件,記錄此期間的修改數據語句
- AOF包含一個格式清晰的數據修改操做語句的日誌文件
- 劣勢
- 相同數量的數據集文件,比RDB的要打
- AOF效率低於RDB
- 須要人員配置,非默認配置
- 配置
- 在redis.conf文件中,配置一下內容
- appendonly yes:啓動appendonly,開啓AOF備份
- appendfilename "appendonly.aof" :AOF備份的文件名
- appendfsync always :每一個修改操做同步備份一次
- appendfsync everysec:1s同步備份一次
- appendfsync no :不一樣步
- 測試配置
- 簡單測試案例
- redis中配置AOF,選擇每操做一次就備份的機制,增刪改數據後,執行flushall,而後經過備份文件來恢復數據到flushall以前
- 步驟
- 啓動AOF,選擇每操做一次就備份
- appendonly yes
- appendfsync always
- 重啓redis
- /usr/local/redis/bin/redis-cli shutdown
- /usr/local/redis/bin/redis-server /etc/redis.conf
- 造數據
- 執行flushall
- 處理備份文件
- vim /usr/local/redis/appendonly.aof
- 刪除flushall的操做記錄
- 重啓數據庫
- /usr/local/redis/bin/redis-cli shutdown
- /usr/local/redis/bin/redis-server /etc/redis.conf
- 檢查數據