超詳細的Redis數據庫入門教程,還有redis實踐電子書分享

Redis簡介

要想了解redis就需要知道什麼是非關係型數據庫NoSQL(not only sql)?

泛指非關係型的數據庫不支持SQL語法存儲結構跟傳統關係型數據庫中的那種關係表完全不同,nosql中存儲的數據都是KV(鍵值對)形式NoSQL的世界中沒有一種通用的語言,每種nosql數據庫都有自己的api和語法,以及擅長的業務場景NoSQL中的產品種類相當多:Redis、Mongodb、Hbase hadoop、Cassandra hadoop

sql數據庫適合用於關係特別複雜的數據查詢場景,nosql反之;sql對事務的支持非常完善,而nosql基本不支持事務,兩者在不斷地取長補短,呈現融合趨勢。

Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。Redis是 NoSQL技術陣營中的一員,它通過多種鍵值數據類型來適應不同場景下的存儲需求,藉助一些高層級的接口使用其可以勝任,如緩存、隊列系統的不同角色

特性和優勢

Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。Redis支持數據的備份,即master-slave模式的數據備份。性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。原子 – Redis的所有操作都是原子性的。豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。

應用場景

用來做緩存(ehcache/memcached)——redis的所有數據是放在內存中的(內存數據庫)可以在某些特定應用場景下替代傳統數據庫——比如社交類的應用在一些大型系統中,巧妙地實現一些特定的功能:session共享、購物車只要你有豐富的想象力,redis可以用在可以給你無限的驚喜…….

redis安裝與配置

以ubuntu為例:

<code># 下載wget http://download.redis.io/releases/redis-4.0.9.tar.gz# 解壓tar xzf redis-4.0.9.tar.gz# 移動,放到usr/local⽬錄下sudo mv ./redis-4.0.9 /usr/local/redis/# 進⼊redis⽬錄cd /usr/local/redis/# 生成sudo make# 測試,這段運⾏時間會較⻓sudo make test# 安裝,將redis的命令安裝到/usr/local/bin/⽬錄sudo make install# 安裝完成後,我們進入目錄/usr/local/bin中查看cd /usr/local/binls -all redis-server redis服務器 redis-cli redis命令行客戶端 redis-benchmark redis性能測試工具 redis-check-aof AOF文件修復工具 redis-check-rdb RDB文件檢索工具# 配置⽂件,移動到/etc/⽬錄下sudo cp /usr/local/redis/redis.conf /etc/redis//<code>

核心配置選項

綁定ip:如果需要遠程訪問,可將此⾏註釋,或綁定⼀個真實ipbind 127.0.0.1端⼝,默認為6379port 6379daemonize yes 是否以守護進程運⾏如果以守護進程運⾏,則不會在命令⾏阻塞,類似於服務如果以⾮守護進程運⾏,則當前終端被阻塞設置為yes表示守護進程,設置為no表示⾮守護進程推薦設置為yes數據⽂件dbfilename dump.rdb數據⽂件存儲路徑dir /var/lib/redis⽇志⽂件logfile "/var/log/redis/redis-server.log"數據庫,默認有16個database 16主從複製,類似於雙機備份。slaveof

簡單命令

<code># 查看幫助⽂檔redis-ser查看redis服務器進程ver --help# /<code>

數據操作

redis是key-value的數據結構,每條數據都是⼀個鍵值對

鍵的類型是字符串

注意:鍵不能重複

值的類型分為五種:字符串string、哈希hash、列表list、集合set、有序集合zset

<code># string類型增、改如果設置的鍵不存在則為添加,如果設置的鍵已經存在則修改set name itcast 設置鍵為name值為itcast的數據setex aa 3 aa 設置鍵為aa值為aa過期時間為3秒的數據mset a1 python a2 java a3 c 設置鍵為a1值為python、鍵為a2值為java、鍵為a3值為cappend a1 haha 向鍵為a1中追加值haha獲取get name 獲取鍵name的值mget a1 a2 a3 獲取鍵a1、a2、a3的值# 鍵命令查找鍵,參數⽀持正則表達式keys * 查看所有鍵exists a1 判斷鍵是否存在,如果存在返回1,不存在返回0type key 查看鍵對應的value的類型del key1 key2 … 刪除鍵及對應的值expire key seconds 設置過期時間,以秒為單位ttl key 查看有效時間,以秒為單位# hash類型增加、修改hset user name itheima 設置鍵user的屬性name為itheimahmset u2 name itcast age 11 設置鍵u2的屬性name為itcast、屬性age為11獲取hkeys u2 獲取鍵u2的所有屬性hvals key 獲取所有屬性的值hget u2 name 獲取鍵u2屬性name的值hmget u2 name age 獲取鍵u2屬性name、age的值刪除hdel u2 age 刪除鍵u2的屬性age# list類型增加lpush a1 a b c 從鍵為a1的列表左側加⼊數據a 、 b 、crpush a1 0 1 從鍵為a1的列表右側加⼊數據0、1linsert a1 before b 3 在鍵為a1的列表中元素b前加⼊3獲取lrange a1 0 -1 獲取鍵為a1的列表所有元素lset a 1 z 修改鍵為a的列表中下標為1的元素值為z刪除lrem a2 -2 b 從a2列表右側開始刪除2個bltrim key 0,4 截取# set類型• ⽆序集合• 元素為string類型• 元素具有唯⼀性,不重複• 說明:對於集合沒有修改操作增加sadd a3 zhangsan sili wangwu 向鍵a3的集合中添加元素zhangsan、lisi、wangwu獲取smembers a3 獲取鍵a3的集合中所有元素刪除srem a3 wangwu 刪除鍵a3的集合中元素wangwu# zset類型有序集合每個元素都會關聯⼀個double類型的score,表示權重,通過權重將元素從⼩到⼤排序增加向鍵a4的集合中添加元素lisi、wangwu、zhaoliu、zhangsan,權重分別為4、5、6、3zadd a4 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan獲取zrange a4 0 -1 獲取鍵a4的集合中所有元素zrangebyscore a4 5 6 獲取鍵a4的集合中權限值在5和6之間的成員zscore a4 zhangsan 獲取鍵a4的集合中元素zhangsan的權重刪除zrem a4 zhangsan 刪除集合a4中元素zhangsanzremrangebyscore a4 5 6 刪除集合a4中權限在5、6之間的元素/<code>

其他特性及高級用法

事務

提供了基本的事務支持,可以允許一組指令操作按照原子性(不被打斷的情況下)執行,

但是並沒有提供回滾操作的支持,而且一組指令中如果有指令執行出錯,也不會終止事務的執行,事務會繼續執行下去,把後續的指令都執行完。

multi 開啟事務exec 執行事務

watch指令 監視

一般會結合著redis事務的 multi 、exec一起使用

首先可以使用watch 讓redis幫助我們監視某些redis數據的變化,然後再創建事務,當要開始執行事務的時候,如果由watch監視的變量(數據)發生了變化,則redis事務的任何指令都不會被執行,事務直接停止,如果watch監視的變量(數據)沒有發生變化,則redis事務會執行到底(不被打斷)。

持久化

redis可以將數據寫入到磁盤中,redis支持持久化

RDB 快照持久化 默認開啟將內存中的redis的所有數據,寫入磁盤文件redis會創建子進程來執行執行的時機:定期持久化 (自動)

save 900 1 # 900秒內進行過1次寫操作

save 300 10 # 300秒內進行過10次寫操作

save 60 10000 # 60秒內進行過10000次寫操作

修改redis配置文件 可以調整 /etc/redis/xxxx.conf

BGSAVE (手動)SAVESHUTDOWN (手動) 關閉缺點:需要將內存中的所有redis數據全部寫入到磁盤,性能有開銷影響,不會太快 優點:相比AOF 而言 持久化的磁盤文件 要小很多AOF 追加文件方式持久化 默認不開啟的 如果開啟 appendonly yes將執行過的redis 寫操作 記錄到磁盤文件中執行的時機:

# appendfsync always # 每執行一個寫操作,就立即記錄到磁盤中

appendfsync everysec # 每秒寫入一次磁盤

# appendfsync no # redis本身不再保證每個操作或每秒中都能立即寫入磁盤,而是有操作系統決定把緩存的寫操作何時寫入磁盤

redis指令執行時間的數量級 : 1秒鐘可以執行10000+的指令優點: 持久化記錄的執行效率相比RDB 稍高,缺點: 持久化產生的磁盤文件很大(因為記錄了所有的操作)RDB 可以和AOF同時使用

Redis 複製集

redis 主從同步, 起到了數據備份的作用

可以在運行的redis中 執行slaveof指令可以在配置文件中 執行redis從屬於另外哪臺機器

可以使用info Replication 查看機器的主從角色

一般slave機器 (備份機) 是不支持寫操作的

在redis的主從同步 複製集機器中 一般不會在進行讀寫分離了

redis複製集 只能一主 多從

哨兵 sentinel

是redis官方提供的 用於管理主從機器 (複製集) 集群,可以方便的進行redis服務器監視、自動故障轉移等操作

哨兵實際上就是一個單獨運行的進程 redis-sentinel ,這個程序已經隨著redis服務的安裝一起安裝好了,只需要運行即可。

作用:

Monitoring 監視 幫助我們判斷哪些redis服務程序已經死掉,哪些還在存活用網絡通訊完成 定期的發送網路包(心跳包) 比如每1s發送一次 心跳機制
Notification 通知Automatic failover 自動故障轉移 (核心)在master死掉的時候,選出一個新master,並且將其他slave都slaveof這個新masterConfiguration provider 配置提供

總結: 一般只要使用了redis的複製集,就會一起配合使用哨兵,來完成高可用


<code>使用方式:redis-sentinel /etc/redis/xxx.conf# 配置文件bind 127.0.0.1 # 哨兵運行的ipport 26380 # 哨兵運行的端口daemonize yes # 是否以後臺的守護進程方式運行logfile /var/log/redis-sentinel.logsentinel monitor mymaster 127.0.0.1 6380 2sentinel down-after-milliseconds mymaster 30000sentinel parallel-syncs mymaster 1sentinel failover-timeout mymaster 180000/<code>

# 說明

sentinel monitor mymaster 127.0.0.1 6380 2

* mymaster -> 我們給讓哨兵監視的這個redis複製集集群起的名字,以master為主

* 2 表示是有幾臺以上的哨兵程序判斷 redis服務死掉,才進行故障轉移

哨兵程序至少要運行三個以上要求哨兵程序儘量分散,分散到不同的機器裡,不要一窩端哨兵為了完成故障轉移,會自動修改redis的配置文件,所以僅僅依靠redis配置文件判斷機器的主從角色,並不是很方便, 可以使用info Replication 查看機器的主從角色

其中redis還有許多相關命令,具體可以參考官方文檔doc.redisfans.com,還有更多的內容包括redis主從和集群的配置,還有redis實戰,都可以從下面這本資料中學習到,超級好用。列舉一些截圖:








作者簡介:Python菜鳥工程師,將在接下來的一段時間內與大家分享一些與Python相關的知識點。如若文中出現問題,各位大佬多多指點,互相學習。喜歡的關注一個吧!謝謝!