Redis 小结
一、redis簡介
redis是一款基于C語言編寫的,開源的非關系型數據庫,由于其卓越的數據處理機制(按照規則,將常用的部分數據放置緩存,其余數據序列化到硬盤),大家也通常將其當做緩存服務器來使用。
在很多時候,大家還認為其只是一個key-value數據庫服務器。然而redis還支持多種數據類型的存儲,應用范圍也更加廣泛
redis支持的數據類型有string字符串。list列表,hash哈希,set集合,及zset(sorted set:有序集合)。
redis支持數據持久化(每隔一段時間會將內存中的數據寫入粗盤;如果機器故障重啟,還可以將硬盤的數據反寫會內存),保證了告訴處理數據操作的同事,增加了數據的安全性;同時也支持數據數據庫的主從復制、發布訂閱、事務支持、管道和虛擬內存
?
二、redis優勢
和其他nosql相比,redis的性能會更加卓越;同時,支持排名集合計算,消息隊列等操作。
三、redis和memcached的區別
1、兩者都是內存數據庫,效率方面差別不大
2、redis不僅僅支持key-value數據格式,還支持list、set、hash等數據結構的存儲
3、memcached是基于內存的key-value緩存服務器,完全基于內存,如果不考慮異常關機造成數據丟失的情況下,可以考慮;但是redis可以做數據持久化,因而數據安全性方面沒有redis做的好
4、redis可以做故障恢復,將數據從硬盤恢復到內存
5、redis支持數據備份,即主從備份
四、redis的安裝
五、redis數據類型
1、string字符串
string是redis最基本的數據類型,存取方便,可以存儲一切可以序列化的數據對象,取出后可以反序列化為存儲之前的數據對象進行使用
在實際操作中,通過set存儲,get獲取;name即為key值,liming為存儲對象
注意:value存儲最大數據為512M
使用場景:常規key-value緩存應用。常規計數: 微博數, 粉絲數。
127.0.0.1:6379> set name liming OK 127.0.0.1:6379> get name "liming"
2、list列表
list是數據列表格式,按照順序插入數據,也可以插入數據到列表的頭部或者尾部在實際操作中是通過lpust來存儲數據列表。lrange來獲取數據列表,取出一個值后,則在當前隊列中消失
基本語法:存儲lpush ?key value 例如(127.0.0.1:6379> lpush list C#);獲取lrange key 查詢索引開始 ?查詢索引結束,例如(127.0.0.1:6379> lrange list 0 2)
列表最多可存儲 232?- 1 元素 (4294967295, 每個列表可存儲40多億)。
Redis list的實現為一個雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內存開銷,Redis內部的很多實現,包括發送緩沖隊列等也都是用的這個數據結構。
Redis的list是每個子元素都是String類型的雙向鏈表,可以通過push和pop操作從列表的頭部或者尾部添加或者刪除元素,這樣List即可以作為棧,也可以作為隊列。
應用場景:list的應用場景非常多,也是Redis最重要的數據結構之一,比如twitter的關注列表,粉絲列表等都可以用Redis的list結構來實現。
127.0.0.1:6379> lpush list redis (integer) 1 127.0.0.1:6379> lpush list rabbitMQ (integer) 2 127.0.0.1:6379> lpush list sql (integer) 3 127.0.0.1:6379> lpush list C# (integer) 4 127.0.0.1:6379> lpush list python (integer) 5 127.0.0.1:6379> lpush list java (integer) 6 127.0.0.1:6379> lrange 0 2 (error) ERR wrong number of arguments for 'lrange' command 127.0.0.1:6379> lrange list 0 2 1) "java" 2) "python" 3) "C#"
3、hash哈希
hash 是一種key-value 鍵值對集合,類似數據字典,通過hmset 來存儲,hget來獲取
語法:hmset 哈希名稱 ? key1 value1 ? key2 value2 …… ? 例如(127.0.0.1:6379> hmset myhash name1 'licy' name2 'lili' name3 'hanmeimei')
每個 hash 可以存儲 232?-1 鍵值對(40多億)。
使用場景:存儲部分變更數據,如用戶信息等。
127.0.0.1:6379> hmset myhash name1 'licy' name2 'lili' name3 'hanmeimei' OK 127.0.0.1:6379> hget myhash1 name1 (nil) 127.0.0.1:6379> hget myhash name1 "licy" 127.0.0.1:6379>
4、set集合
set集合是一種無序的數據集合,添加用 sadd,獲取用smembers,添加成功則返回1,已經存在則返回0,添加失敗則返回錯誤信息
語法:存儲 ?sadd 集合名稱 ?數據值(例如:127.0.0.1:6379> sadd myset redis) ;獲取smembers 集合名稱(例如:127.0.0.1:6379> smembers myset)
注:集合中最大的成員數為 232?- 1(4294967295, 每個集合可存儲40多億個成員)。
應用場景:求交集;求差集;求并集;獲取某時間段內的數據去重
127.0.0.1:6379> sadd myset redis (integer) 1 127.0.0.1:6379> sadd myset C# (integer) 1 127.0.0.1:6379> sadd myset java (integer) 1 127.0.0.1:6379> sadd myset python (integer) 1 127.0.0.1:6379> smembers myset 1) "java" 2) "C#" 3) "redis" 4) "python"
5、zset有序集合
zset是一種有序集合,和string類似,多了個增加分數,獲取時會按照分數小到大進行數據返回
key值是唯一的,但是分數可以重復
語法:存儲 ?zadd 集合名詞 ?分數 ?數據值 (例如:127.0.0.1:6379> zadd myzset2 ?3 sql);獲取 ZRANGEBYSCORE 集合名稱 ?索引開始 ?索引結束(例如:127.0.0.1:6379> ZRANGEBYSCORE myzset2 0 10)
應用場景:顯示最新的列表數據項目;排行榜應用獲取top N操作;求交集;求差集;求并集;獲取某時間段內的數據去重
127.0.0.1:6379> zadd myzset2 3 sql (integer) 1 127.0.0.1:6379> zadd myzset2 1 C# (integer) 1 127.0.0.1:6379> zadd myzset2 2 python (integer) 1 127.0.0.1:6379> zadd myzset2 0 redis (integer) 1 127.0.0.1:6379> ZRANGEBYSCORE myzset2 0 10 1) "redis" 2) "C#" 3) "python" 4) "sql" 127.0.0.1:6379>
六、redis功能
1、發布訂閱
redis的發布訂閱是一種消息通訊模式,發布者發送消息,接收這接受消息,客戶端可以任意定義頻道,redis客戶端可以任意訂閱頻道
下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關系:
當有新消息通過 PUBLISH 命令發送給頻道 channel1 時, 這個消息就會被發送給訂閱它的三個客戶端:
實例:訂閱者
127.0.0.1:6379> SUBSCRIBE fabu1 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "fabu1" 3) (integer) 1 1) "message" 2) "fabu1" 3) "my fa bu "發布者
127.0.0.1:6379> PUBLISH fabu1 'my fa bu ' (integer) 1 127.0.0.1:6379>2、持久化
由于redis的數據是存放在內存中,如果沒有持久化,redis重啟或者服務器重啟數據會丟失,于是需要開啟redis的持久化功能,用于將數據保存在硬盤上,當redis重啟后,可以從硬盤中恢復數據。
redis提供兩種方式進行持久化,一種是RDB持久化(原理是將redis中在內存中的數據記錄定時dump到硬盤上的RDB持久化),另一種是AOD持久化(原理是將redis的操作日志以追加的方式寫入文件)
3、redis的主從復制
一般來說,一臺redis可以處理的數據是有限的,即使硬件支持很好,也無法滿足日益增長的業務需求,因而redis提供了主從集群的功能,可以實現讀寫分離,極大限度的提高了系統的性能和滿足業務的拓展。同時,為了避免一臺redis服務器宕機而引起的系統崩潰,redis也提供了啟用sentinel(哨兵)服務,在一臺服務器宕機是自動切換到另外一臺從服務器,同時設置當前的從服務器為主服務器
4、redis事務
在系統中,經常會遇到很多零散的操作有很強的順序性,一旦中間某個操作異常或者服務器異常等其他情況,因而就需要事務來處理
redis事務可以一次執行多個命令,redis會將事務中的命令序列化,然后按照順序執行。redis事務不可能在事務執行的過程中插入另外一個客戶端發來的命令請求,這樣便保證了命令執行的過程中進行隔離單獨執行。在redis事務中,要么執行所有命令要么一個都不執行
一個事務從開始到執行共有三個階段
a、事務開始
b、命令入列
c、執行事務
5、redis管道
6、redis虛擬內存
七、redis總結
redis是高性能的緩存服務器解決方案,可以數據持久化和快速搭建集群,高并發,高可用性
參考地址http://www.cnblogs.com/caokai520/p/4409712.html
轉載于:https://www.cnblogs.com/happygx/p/8411134.html
總結
- 上一篇: 路由与数据包转发简述 路由器如何实现数据
- 下一篇: sql server数据库课程设计分析