如果轉載,請注明博文來源: 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
- 優勢,社交網絡,利用圖結構的相關算法
- 劣勢,需要對整個圖做算法分析,不利于分布式方案
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yNzEzM2kDNyITMtIjNxEDMzEzNxUTM4AzNxAjMtEjNwgDM28CX4AzNxAjMvwVM2ADOwYzLcd2bsJ2Lc12bj5ycn9Gbi52YucTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
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
-
Redis-入門筆記-15min帶你一覽redis - 數值增減
- 自增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
-
Redis-入門筆記-15min帶你一覽redis - 删除
- del key
- 擴充
- value追加string内容
- append key string
-
Redis-入門筆記-15min帶你一覽redis
5.2 哈希 hash
hash可以存儲多個鍵值對之間的映射,它就像是一個迷你型的redis。
- hset key field value
- hmset key field value [field value ... ]
-
Redis-入門筆記-15min帶你一覽redis - hget key field
- hmget key field [field ...]
- hgetall key
-
Redis-入門筆記-15min帶你一覽redis - 增加數字
- hincrby key field number
-
Redis-入門筆記-15min帶你一覽redis - hdel key field
-
Redis-入門筆記-15min帶你一覽redis - 自學指令
- hexists key field
- hlen key
- hkeys key
- hvals key
-
Redis-入門筆記-15min帶你一覽redis
5.3 字元串清單 list
lish的順序是按照插入的順序,可以在頭部跟尾部插入資料,如果是在list的兩頭進行操作,那麼效率是很高的,但是如果在list中,則會耗費一定時間。
list的類型:
- arraylist使用數組方式
- 根據索引查詢速度是非常快的
- 但是新增跟删除操作涉及到位移操作,則會比較慢
- linkedlist使用雙向連結方式
- 每個元素都記錄了前後元素的指針,删除跟新增隻需要修改前後指針,資料操作較快
list常用的指令:
- 兩端添加
- lpush key value [value ...]
- rpush key value [value ...]
- 檢視清單
- lrange key start stop
-
Redis-入門筆記-15min帶你一覽redis - 指定位置push
- lset key index value
- 清單中第幾個位置插入value,注意位置從0開始
- 指定value插入值
- linsert key before|after pivot value
- 在清單中,從左到右,第一個等于pivot這個值的前面或者後面,插入valuse
-
Redis-入門筆記-15min帶你一覽redis - 兩端彈出
- lpop key
- 删除清單最左邊的value
- rpop key
- 删除清單最右邊的value
- rpoplpush source distination
- 從source清單右邊删除一個value,并把這個value存儲進入distination清單中
- 适用于消息釋出過程中的備份操作
-
Redis-入門筆記-15min帶你一覽redis - 擷取清單元素個數
- 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
-
Redis-入門筆記-15min帶你一覽redis
5.4 字元串集合 set
和list類型不同的是,set集合中不允許出現重複的元素,set最大可以包含的元素是 4294967295 。注意,set中是沒有順序的。
用于維護使用者對象的唯一性,以及處理資料對象之間的關聯關系,可以進行并集交集差集運算。比如購買A産品的使用者ID,放在一個set中,購買另外一個B産品的使用者ID,放在另外一個set中,這樣就很友善計算同時購買兩個産品的使用者等。
list常用指令:
- 添加删除元素
- sadd key member [member ...]
- srem key member [member ...]
- 擷取集合中的元素
- smembers key
-
Redis-入門筆記-15min帶你一覽redis - 差集運算
- 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集合中
-
Redis-入門筆記-15min帶你一覽redis - sismember key member
- 檢視member在key中是否存在
- srandmember key [count]
- 集合key中随機放回 count 個元素
- scard key
- 檢視集合個數
-
Redis-入門筆記-15min帶你一覽redis
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 ...]
-
Redis-入門筆記-15min帶你一覽redis - 删除元素
- zrem key member [member...]
- zremrangebyscore key min max
-
Redis-入門筆記-15min帶你一覽redis - 擴充查詢
- zincrby key increment member
- zcount key min max
-
Redis-入門筆記-15min帶你一覽redis
6 keys的通用操作
- keys *
- 檢視所有keys
-
Redis-入門筆記-15min帶你一覽redis - del key [key...]
- 删除多個key
- exists key
- 判斷某個key是否存在,存在傳回1,不存在傳回0
- rename key newkey
- 重命名某個key
- expire key seconds
- 設定某個key的生命期,過了這個時間就是過期資料
- ttl key
- 檢視該key的生命還剩下多少秒
-
Redis-入門筆記-15min帶你一覽redis - type key
- 檢視key的類型
-
Redis-入門筆記-15min帶你一覽redis
7 redis的特性
7.1 多資料庫
redis最多支援16個資料,下标0-15表示第幾個資料庫。預設是在0号資料。切換資料庫可以通過select dbnumber 來切換,也可以通過move 來移動key從目前資料到指定的資料庫。
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的設定
-
Redis-入門筆記-15min帶你一覽redis - save 900 1 :900秒内至少有1個資料變化,則進行持久化
-
- RDB預設配置檔案中就有,可以檢視redis.conf檔案中關于save的設定
-
-
-
- save 300 10 :300秒内至少有10個資料發生變化,則進行持久化
- save 60 10000 : 60秒内至少有1w個資料發生變化,則進行持久化
-
Redis-入門筆記-15min帶你一覽redis - dbfilename 則是命名目前持久檔案的名字
- dir,則是定義目前持久化檔案的存放路徑
-
Redis-入門筆記-15min帶你一覽redis
-
-
-
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
- 造資料
-
Redis-入門筆記-15min帶你一覽redis - 執行flushall
-
Redis-入門筆記-15min帶你一覽redis
-
- 處理備份檔案
- vim /usr/local/redis/appendonly.aof
- 删除flushall的操作記錄
-
Redis-入門筆記-15min帶你一覽redis - 重新開機資料庫
- 檢查資料
-
Redis-入門筆記-15min帶你一覽redis
-
如果轉載,請注明博文來源: www.cnblogs.com/xinysu/ ,版權歸 部落格園 蘇家小蘿蔔 所有。望各位支援!