Redis数据库学习笔记
一、NoSql(非關(guān)系型數(shù)據(jù)庫)
NoSQL:NoSQL = Not Only SQL 非關(guān)系型數(shù)據(jù)庫 ? NoSQL,泛指非關(guān)系型的數(shù)據(jù)庫。隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫在應(yīng)付web2.0網(wǎng)站,特別是超大規(guī)模和高并發(fā)的SNS類型的web2.0純動態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問題,而非關(guān)系型的數(shù)據(jù)庫則由于其本身的特點得到了非常迅速的發(fā)展。NoSQL數(shù)據(jù)庫的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重數(shù)據(jù)種類帶來的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題。
1.1 優(yōu)點
-
高可擴展性
-
分布式計算
-
低成本
-
架構(gòu)的靈活性,半結(jié)構(gòu)化數(shù)據(jù)
-
沒有復(fù)雜的關(guān)系
1.2 缺點
-
沒有標準化
-
有限的查詢功能(到目前為止)
1.3 分類
| 列存儲 | Hbase、Cassandra、Hypertable | 顧名思義,是按列存儲數(shù)據(jù)的。最大的特點是方便存儲結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù),方便做數(shù)據(jù)壓縮,對針對某一列或者某幾列的查詢有非常大的IO優(yōu)勢。 |
| 文檔存儲 | MongoDB、CouchDB | 文檔存儲一般用類似json的格式存儲,存儲的內(nèi)容是文檔型的。這樣也就有有機會對某些字段建立索引,實現(xiàn)關(guān)系數(shù)據(jù)庫的某些功能。 |
| key-value存儲 | Berkeley DB、MemcacheDB、Redis | 可以通過key快速查詢到其value。一般來說,value可以是任何格式。 |
| 圖存儲 | Neo4J、FlockDB | 圖形關(guān)系的最佳存儲。使用傳統(tǒng)關(guān)系數(shù)據(jù)庫來解決的話性能低下,而且設(shè)計使用不方便。 |
| 對象存儲 | db4o、Versant | 通過類似面向?qū)ο笳Z言的語法操作數(shù)據(jù)庫,通過對象的方式存取數(shù)據(jù)。 |
| xml數(shù)據(jù)庫 | Berkeley DB XML、BaseX | 高效的存儲XML數(shù)據(jù),并支持XML的內(nèi)部查詢語法,比如XQuery,Xpath。 |
二、Redis與網(wǎng)站架構(gòu)
2.1什么是Redis?
-
Remote Dictionary Server 縮寫 是個基于內(nèi)存的網(wǎng)絡(luò)存儲系統(tǒng)
-
豐富的數(shù)據(jù)結(jié)構(gòu)(sets, sorted sets,hashes, list ...)
-
本質(zhì)是key-value,但是與memcached不同的是,value的類型得到了擴展
一個普通的問題列表需求
-
問題本身的數(shù)據(jù)(標題,投票等等)
-
問題的作者數(shù)據(jù)(另 張單獨的 張數(shù)據(jù)表,通過某個鍵值關(guān)聯(lián))
-
問題的標簽(本身單獨一張數(shù)據(jù)表,通過一個中間關(guān)系表與問題產(chǎn)生 對多的關(guān)系)
?
一條sql語句解決問題 too young too simple
多次查詢讓你懷疑人生
?
冗余字段過多會讓你看起來很傻
為啥不試試Redis
2.2 與sql比較
大大減少了查詢數(shù)量,提高了效率 redis的API更加人性化,再也不需要構(gòu)建SQL語句,節(jié)省了SQL的解析時間三、Redis
3.1簡介
Redis 是完全開源免費的,遵守BSD協(xié)議,是一個高性能的key-value數(shù)據(jù)庫。
Redis 與其他 key - value 緩存產(chǎn)品有以下三個特點:
-
Redis支持數(shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時候可以再次加載進行使用。
-
Redis不僅僅支持簡單的key-value string類型的數(shù)據(jù),同時還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
-
Redis支持數(shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
3.2 優(yōu)勢
-
性能極高?– Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
-
豐富的數(shù)據(jù)類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
-
原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全并后的原子性執(zhí)行。
-
豐富的特性?– Redis還支持通知, key過期等等特性。
3.3和其他的key-value存儲有什么不同
-
Redis有著更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并且提供對他們的原子性操作,這是一個不同于其他數(shù)據(jù)庫的進化路徑。Redis的數(shù)據(jù)類型都是基于基本數(shù)據(jù)結(jié)構(gòu)的同時對程序員透明,無需進行額外的抽象。
-
Redis運行在內(nèi)存中但是可以持久化到磁盤,所以在對不同數(shù)據(jù)集進行高速讀寫時需要權(quán)衡內(nèi)存,因為數(shù)據(jù)量不能大于硬件內(nèi)存。在內(nèi)存數(shù)據(jù)庫方面的另一個優(yōu)點是,相比在磁盤上相同的復(fù)雜的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中操作起來非常簡單,這樣Redis可以做很多內(nèi)部復(fù)雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產(chǎn)生的,因為他們并不需要進行隨機訪問。
3.4 redis 為什么能夠持久化存儲 ?
因為 RDB 和 AOF
-
RDB [RDB 將數(shù)據(jù)庫的快照(snapshot)以二進制的方式保存到磁盤中。]
在運行情況下, Redis 以數(shù)據(jù)結(jié)構(gòu)的形式將數(shù)據(jù)維持在內(nèi)存中, 為了讓這些數(shù)據(jù)在 Redis 重啟之后仍然可用, Redis 分別提供了 RDB 和 AOF 兩種持久化模式。
在 Redis 運行時, RDB 程序?qū)斍皟?nèi)存中的數(shù)據(jù)庫快照保存到磁盤文件中, 在 Redis 重啟動時, RDB 程序可以通過載入 RDB 文件來還原數(shù)據(jù)庫的狀態(tài)。
RDB 功能最核心的是 rdbSave 和 rdbLoad 兩個函數(shù), 前者用于生成 RDB 文件到磁盤, 而后者則用于將 RDB 文件中的數(shù)據(jù)重新載入到內(nèi)存中:
RDB 本質(zhì)上是個文件 每隔一段時間 在redis配置文件中進行設(shè)置 將內(nèi)存中的數(shù)據(jù)存入文件中 如果數(shù)據(jù)過大 也容易造成數(shù)據(jù)丟失
-
AOF [ 則以協(xié)議文本的方式,將所有對數(shù)據(jù)庫進行過寫入的命令(及其參數(shù))記錄到 AOF 文件,以此達到記錄數(shù)據(jù)庫狀態(tài)的目的。]
AOF 將命令追加到文件中 將原有的內(nèi)容替換掉 記錄到 AOF 文件, 以此達到記錄數(shù)據(jù)庫狀態(tài)的目的, 為了方便起見, 我們稱呼這種記錄過程為同步。
3.5 安裝redis
sudo apt-get install redis-server 安裝完成后,Redis服務(wù)器會自動啟動,我們檢查Redis服務(wù)器程序 ps -aux|grep redis 或者 netstat -nlt | grep 6379 ? #看見 port 6379 就成功啟動了redis服務(wù)| redis-server | redis 服務(wù)端 |
| redis-cli | redis 客戶端 |
| redis-benchmark | redis性能測試工具 |
| redis-check-aof | aof修復(fù)工具 |
| redis-check-rdb | rdb |
| redis-sentinel | 哨兵服務(wù)器 2.8版本之后才有 |
【redis-sentinel】監(jiān)控你管理的作用來提高集群的高可用性
redis-cli客戶端使用方式: redis-cli -p ?#端口 -h ?#主機 鏈接上 ? redis-cli -p 6379 127.0.0.1:6379> ping PONG 127.0.0.1:6379> ? #ping之后 pong來了就是成功了 離開客戶端請輸入quit ? 服務(wù)管理 啟動/停止/重啟redis有三種方式 1) systemctl start/stop/restart redis-server.service 2) service redis-server start|restart|stop 3) cd /etc/init.d./redis-server ?start/stop/restart【redis的配置文件】
配置文件在/etc/redis/redis.conf
sudo vim /etc/redis/redis.conf # 常用配置項 requirepass 你的密碼 ? # 服務(wù)器遠程連接密碼 bind 127.0.0.1 ? ? # 綁定ip port 5379 # 指定端口 daemonize yes # 是否以守護進程執(zhí)行,如果以守護進程執(zhí)行,不會在命令行下阻塞 dbfilename dump.rdb ? #數(shù)據(jù)文件 dir /var/lib/redis ? #數(shù)據(jù)文件存儲路徑 ? ? #如果指定了密碼,啟用客戶端時需要加上-a 密碼 redis-cli -a 密碼?
四、redis數(shù)據(jù)類型
Redis支持五種數(shù)據(jù)類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
-
redis常用命令請參考:http://redis.cn/commands.html
4.1 string
是最簡單的類型,你可以理解為一個key 對應(yīng)一個value。string 類型是二進制安全的。意思是redis 的string 可以包含任何數(shù)據(jù),比如jpg 圖片或者序列化的對象。string類型是Redis最基本的數(shù)據(jù)類型,一個鍵最大能存儲512MB。
-
設(shè)置鍵
命令:SET key value #設(shè)置單鍵值對 >set h1 100 #設(shè)置h1的值為100 ? 命令:mset key value [key value] #設(shè)置多個鍵值對 >mset name '王寶強' age 30 gender '男' ? 命令:setex ? key seconds value #設(shè)置鍵值及過期時間(秒單位) >setex age 100 20 #設(shè)置年齡的值為20,過期時間100秒 -
獲取鍵
命令:get key #獲取單個鍵 >get h1 ? 命令:mget key1 key2 key3 #獲取多個鍵 >mget name age sex -
查看過期時間
命令:ttl key >ttl a1 #查看a1的過期時間 -
運算
原來的值必須是數(shù)值字符串 命令:incr key #將對應(yīng)的key 加1 命令:decr key #將對應(yīng)的key值減1 命令:incrby key num ? #將對應(yīng)的key加指定值 命令:decrby key num ? #將對應(yīng)的key的值減去指定值 -
其它操作
命令:append key value #追加值,redis中值都是字符串,追加就是字符拼接 >append name 'hello' #如果原來的值是tom,那么現(xiàn)在就是tomhello ? 命令:strlen key #獲取值得長度
4.2 hash
Redis hash 是一個鍵值(key=>value)對集合。Redis hash是一個string類型的field和value的映射表,hash特別適合用于存儲對象。每個 hash 可以存儲 2的32次方 -1 鍵值對(40多億)。存儲形式:
key = {name:'tom',age: 18}
-
設(shè)置值
命令:hset key field ? value #設(shè)置key所指對象的指定屬性的值 命令:hmset key field ? value [field value] #設(shè)置key所指對象的多個屬性值 命令:hsetnx key field value #當field字段不存在時 設(shè)置key所指對象的field屬性值 ? hset person name '二狗子' hmset person age 20 sex '男' hsetnx person maried '未婚' -
獲取值
命令: hget key field #獲取key指定的對象的屬性值 命令: hmget key field [field] #獲取key指定對象的多個屬性值 命令: hgetall key ? #獲取key所指對象的所有屬性的名稱和值 命令: hkeys ? key ? #獲取key所指對象的所有屬性名 命令: hvals ? key ? #獲取key所指對象是的所有屬性值 命令: hlen key ? ? #獲取key所指對象的屬性個數(shù) -
其它操作
命令:hincrby key ? field ? increment #為key所指對象的指定字段的整數(shù)值加上increment 命令:hincrbyfloat key field increment #為key所指對象的指定字段的實數(shù)值加上increment 命令:hexists key field #判斷當前的字段是否存在在(在返回1 否則返回0) 命令:hdel key field [field] #刪除字段和值
4.3 list
redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。列表最多可存儲 2的32次方 - 1 元素 (4294967295, 每個列表可存儲40多億)。
常應(yīng)用于:1、對數(shù)據(jù)量大的集合數(shù)據(jù)刪減 2、任務(wù)隊列
?
-
添加數(shù)據(jù)
命令:lpush key ? value [value] ? #頭部插入數(shù)據(jù) 命令:lpushx key value ? ? ? ? ? #如果列表存在則在列表頭部插入數(shù)據(jù) 命令:rpush key value [value] ? #在列表尾部添加數(shù)據(jù) 命令:rpushx key value ? ? ? ? ? #如果列表存在,則在尾部添加數(shù)據(jù) 命令:linsert key before|after value value #在指定值前或后插入數(shù)據(jù) 命令:lset key index value ? ? ? #設(shè)定指定索引元素的值 注意:索引的值從左邊開始,向右增加,左邊第一個是0,從右邊向左索引編號為:-1 -2... -
獲取數(shù)據(jù)
命令:lpop key ? ? ? ? ? ? ? #左側(cè)出隊并返回出隊元素 命令:rpop key ? ? ? ? ? ? ? #右側(cè)出隊并返回出隊元素 命令:lindex key ? index ? #返回指定索引的值 命令:lrange key start end #返回存儲列表中的指定范圍的元素[start,end] 命令:lrem?key count value ? ? #從列表里移除前 count 次出現(xiàn)的值為 value 的元素count > 0: 從頭往尾移除值為 value 的元素。count < 0: 從尾往頭移除值為 value 的元素。count = 0: 移除所有值為 value 的元素。 -
其它操作
命令:llen key #獲取列表長度 命令:ltrim key start stop #裁剪列表 保留start到stop之間的元素,其它都刪除ltrime mylist -3 -1 #從索引為-3到-2的保留, 以外的全部刪除
4.4 set 無序的集合
Redis的Set是string類型的無序集合,元素具有唯一性 不重復(fù)。集合是通過哈希表實現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。
常應(yīng)用于:對兩個集合間的數(shù)據(jù)進行交集、并集、差集運算
-
添加元素
sadd key member [member] #添加多個元素 -
獲取元素
-
其它操作
spop key [count] #移除集合中隨機的count個元素,并返回 srem key member1 [member2] #移除集合中 一個或者 多個 成員 sismember key member #判斷元素是否在集合中 存在返回1 不在返回0 -
集合操作
4.5 zset 有序從大到小排序
Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復(fù)的成員。不同的是每個元素都會關(guān)聯(lián)一個double類型的分數(shù)。redis正是通過分數(shù)來為集合中的成員進行從小到大的排序。zset的成員是唯一的,但分數(shù)(score)卻可以重復(fù)。
常應(yīng)用于:排行榜
-
添加元素
zadd key score member [score member] #添加多個元素 zincrby key increment member #對指定的成員增加權(quán)重increment -
獲取元素
zrange key start end #返回指定范圍的元素 zcard key #返回元素的個數(shù) zcount key min max #返回有序集合中權(quán)重在min和max之間的元素的個數(shù) zscore key member #返回有序集合中 member(元素) 的權(quán)重(score) zrange key start end withscores #返回當前key中 所有的權(quán)重(score)和元素(member)
4.6 數(shù)據(jù)庫切換
redis默認帶有16個數(shù)據(jù)庫,編號從0-15。進入redis后默認數(shù)據(jù)庫是0,可以使用select num進行切換 客戶端不顯示中文的處理:打開客戶端的時候添加參數(shù):--raw redis-cli --raw4.7 其他
keys * #查看所有的key keys u* #查以u開始的key keys n??? 查找以n為開頭長度為4個的key keys n 查找 包含 n 的所有的key支持的正則表達式: - h?llo 匹配第二位為任意的字符 - h*llo 匹配第二位為任意字符 0個 或多個 - h[ab]llo 匹配第二位為 a或者b的字符的key - hello 匹配第二位除了e字符以外的任意的key - h[a-z]llo 匹配第二位為a-z的小寫字母的keyexists key #判斷鍵是否存在 type key #查看key對應(yīng)的value的類型 del key #刪除指定key expire key 10 #設(shè)置過期時間,秒 persist key #移除key的過期時間 rename key newkey #修改key的名稱(如果新的key的名字存在 則會把存在的key的值 覆蓋掉) randomkey #隨機返回一個 key move key db 將鍵移動到指定庫flushdb #清空當前庫所有key flushall #清空所有庫里的keyexit #退出redis客戶端 quit 退出客戶端查看服務(wù)器信息 info dbsize 當前庫中有多少key?
五、redis備份和還原
redis支持持久化的方式有兩種:RDB和AOF
-
RDB備份
-
查看備份目錄
-
備份
-
命令行下執(zhí)行:redis-cli save 阻塞主進程
-
命令行下執(zhí)行:redis-cli bgsave 不阻塞主進程
-
查看備份時間,命令行下執(zhí)行 time redis-cli save
-
-
還原
-
只要將備份的dump.rdb文件覆蓋原來的文件就可以還原
-
-
六、主從復(fù)制
當數(shù)據(jù)量變得龐大的時候,讀寫分離還是很有必要的。同時避免一個redis服務(wù)宕機,導(dǎo)致應(yīng)用宕機的情況,我們啟用sentinel(哨兵)服務(wù),實現(xiàn)主從切換的功能。redis提供了一個master,多個slave的服務(wù)。
| master(主) | 10.20.100.186 |
| slave(從) | 10.20.100.106 |
-
master主配置
-
slave從配置
重啟master和slave的服務(wù),然后登錄從服務(wù)器,執(zhí)行:
python@ubuntu:/etc/redis$ redis-cli -p 6380 -a 123 127.0.0.1:6380> info replication # Replication role:slave master_host:10.20.100.186 master_port:6379 master_link_status:up master_last_io_seconds_ago:0 master_sync_in_progress:0 slave_repl_offset:1444 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0總結(jié)
以上是生活随笔為你收集整理的Redis数据库学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FishC笔记—29 讲 文件:一个任务
- 下一篇: Mysql面试热身题集总结