Redis 基礎應用(一)
==============================================================================
概述:
Redis的相關介紹,功能,優勢及于其他key-value資料庫的對比;
Redis的安裝及程式環境;
指令行用戶端指令
Redis 的資料結構
1.簡介
★Redis REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的 key-value存儲系統。 Redis是一個開源的使用ANSI C語言編寫、遵守BSD協定、支援網絡、可基于記憶體亦可持久化的日志型、Key-Value資料庫,并提供多種語言的API。 它通常被稱為資料結構伺服器,因為值(value)可以是 字元串(String), 哈希(Map), 清單(list), 集合(sets) 和 有序集合(sorted sets)等類型。 ☉REmote DIctionary Server(Redis) 記憶體存儲; 持久化; 主從; Cluster ☉Redis 與其他 key - value 緩存産品有以下三個特點: Redis支援資料的持久化,可以将記憶體中的資料儲存在磁盤中,重新開機的時候可以再次加載進行使用。 Redis不僅僅支援簡單的key-value類型的資料,同時還提供list,set,zset,hash等資料結構的存儲。 Redis支援資料的備份,即master-slave模式的資料備份。
2.功能
★支援的功能如下: ☉資料結構伺服器: 值(value)可以是 字元串(String), 哈希(Map), 清單(list), 集合(sets) 和 有序集合(sorted sets)等類型。 ☉單程序 CPU 并非瓶頸 ☉持久化機制 snapshoting AOF ☉Replication 主從: 主:rw 從:read-only
3.優勢
★優勢 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。 豐富的資料類型 – Redis支援二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 資料類型操作 原子 – Redis的所有操作都是原子性的,同時Redis還支援對幾個操作全并後的原子性執行。 豐富的特性 – Redis還支援 publish/subscribe, 通知, key 過期等等特性。
4.Redis與其他key-value存儲有什麼不同
★差別: Redis有着更為複雜的資料結構并且提供對他們的原子性操作,這是一個不同于其他資料庫的進化路徑。Redis的資料類型都是基于基本資料結構的同時對程式員透明,無需進行額外的抽象。 Redis運作在記憶體中但是可以持久化到磁盤,是以在對不同資料集進行高速讀寫時需要權衡記憶體,因為資料量不能大于硬體記憶體。在記憶體資料庫方面的另一個優點是,相比在磁盤上相同的複雜的資料結構,在記憶體中操作起來非常簡單,這樣Redis可以做很多内部複雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式産生的,因為他們并不需要進行随機通路。 ★和memcached的差別 Redis不僅僅支援簡單的k/v類型的資料,同時還提供list,set,hash等資料結構的存儲。memcache僅支援字元串型值(流式化資料) Redis為單線程,Memcached為多線程,但性能上相當; Redis支援資料的備份,即master-slave模式的資料備份。 Redis支援資料的持久化,可以将記憶體中的資料保持在磁盤中,重新開機的時候可以再次加載進行使用。(在Redis中,并不是所有的資料都一直存儲在記憶體中的。這是和Memcached相比一個最大的差別) 應用場景不一樣:Redis出來作為NoSQL資料庫使用外,還能用做消息隊列、資料堆棧和資料緩存等;Memcached适合于緩存SQL語句、資料集、使用者臨時性資料、延遲查詢資料和session等。 ★redis、memcache、mongoDB 對比 從以下幾個次元,對redis、memcache、mongoDB 做了對比,歡迎拍磚 ☉性能 都比較高,性能對我們來說應該都不是瓶頸 總體來講,TPS方面redis和memcache差不多,要大于mongodb ☉操作的便利性 memcache資料結構單一 redis豐富一些,資料操作方面,redis更好一些,較少的網絡IO次數 mongodb支援豐富的資料表達,索引,最類似關系型資料庫,支援的查詢語言非常豐富 ☉記憶體空間的大小和資料量的大小 redis在2.0版本後增加了自己的VM特性,突破實體記憶體的限制;可以對key value設定過期時間(類似memcache) memcache可以修改最大可用記憶體,采用LRU算法 mongoDB适合大資料量的存儲,依賴作業系統VM做記憶體管理,吃記憶體也比較厲害,服務不要和别的服務在一起 ☉可用性(單點問題) 對于單點問題 redis,依賴用戶端來實作分布式讀寫;主從複制時,每次從節點重新連接配接主節點都要依賴整個快照,無增量複制,因性能和效率問題, 是以單點問題比較複雜;不支援自動sharding,需要依賴程式設定一緻hash 機制。 一種替代方案是,不用redis本身的複制機制,采用自己做主動複制(多份存儲),或者改成增量複制的方式(需要自己實作),一緻性問題和性能的權衡 Memcache本身沒有資料備援機制,也沒必要;對于故障預防,采用依賴成熟的hash或者環狀的算法,解決單點故障引起的抖動問題。 mongoDB支援master-slave,replicaset(内部采用paxos選舉算法,自動故障恢複),auto sharding機制,對用戶端屏蔽了故障轉移和切分機制。 ☉可靠性(持久化) 對于資料持久化和資料恢複, redis支援(快照、AOF):依賴快照進行持久化,aof增強了可靠性的同時,對性能有所影響 memcache不支援,通常用在做緩存,提升性能; MongoDB從1.8版本開始采用binlog方式支援持久化的可靠性 ☉資料一緻性(事務支援) Memcache 在并發場景下,用cas保證一緻性 redis事務支援比較弱,隻能保證事務中的每個操作連續執行 mongoDB不支援事務 ☉資料分析 mongoDB内置了資料分析的功能(mapreduce),其他不支援 ☉應用場景 redis:資料量較小的更性能操作和運算上 memcache:用于在動态系統中減少資料庫負載,提升性能;做緩存,提高性能(适合讀多寫少,對于資料量比較大,可以采用sharding) MongoDB:主要解決海量資料的通路效率問題
1.安裝及程式環境
★安裝方法: 編譯安裝 rpm包安裝 ★程式環境 ☉配置檔案 /etc/redis.conf /etc/redis-sentinel.conf ☉主程式 /usr/bin/redis-server /usr/bin/redis-sentinel 監聽端口:6379/tcp ☉指令行用戶端 /usr/bin/redis-cli
示範:
1.安裝程式包
2.程式環境如下:
3.配置檔案/etc/redis.conf 如下:
3.指令行用戶端指令
★redis-cli ☉文法: redis-cli [OPTIONS] [cmd [arg [arg ...]]] ☉常用選項: -h <hostname> Server hostname (default: 127.0.0.1). //主機位址 -p <port> Server port (default: 6379). //端口 -a <password> Password to use when connecting to the server. //密碼
1.本地連接配接,直接運作 redis-cli 指令即可
2.遠端連接配接,指明要連接配接的主機,端口和密碼即可
1.k/v 和 group
★k/v key:直接ASCII字元串; value(資料結構):string,lists,hashes,set,sored sets,bltmaps,hyperloglog ★group @string,@generic,@list @...
2.string(字元串)
★作用: Redis 字元串資料類型的相關指令用于管理 redis 字元串值; ☉基本文法: 127.0.0.1:6379>COMMAND KEY_NAME
下表列出了常用的 redis 字元串指令:
序号
指令及描述
1
SET key value
設定指定 key 的值
2
GET key
擷取指定 key 的值。
3
GETRANGE key start end
傳回 key 中字元串值的子字元
4
GETSET key value
将給定 key 的值設為 value ,并傳回 key 的舊值(old value)。
5
GETBIT key offset
對 key 所儲存的字元串值,擷取指定偏移量上的位(bit)。
6
MGET key1 [key2..]
擷取所有(一個或多個)給定 key 的值。
7
SETBIT key offset value
對 key 所儲存的字元串值,設定或清除指定偏移量上的位(bit)。
8
SETEX key seconds value
将值 value 關聯到 key ,并将 key 的過期時間設為 seconds (以秒為機關)。
9
SETNX key value
隻有在 key 不存在時設定 key 的值。
10
SETRANGE key offset value
用 value 參數覆寫給定 key 所儲存的字元串值,從偏移量 offset 開始。
11
STRLEN key
傳回 key 所儲存的字元串值的長度。
12
MSET key value [key value ...]
同時設定一個或多個 key-value 對。
13
MSETNX key value [key value ...]
同時設定一個或多個 key-value 對,當且僅當所有給定 key 都不存在。
14
PSETEX key milliseconds value
這個指令和 SETEX 指令相似,但它以毫秒為機關設定 key 的生存時間,而不是像 SETEX 指令那樣,以秒為機關。
15
INCR key
将 key 中儲存的數字值增一。
16
INCRBY key increment
将 key 所儲存的值加上給定的增量值(increment) 。
17
INCRBYFLOAT key increment
将 key 所儲存的值加上給定的浮點增量值(increment) 。
18
DECR key
将 key 中儲存的數字值減一。
19
DECRBY key decrement
key 所儲存的值減去給定的減量值(decrement) 。
20
APPEND key value
如果 key 已經存在并且是一個字元串, APPEND 指令将 value 追加到 key 原來的值的末尾。
3.list(清單)
★作用 Redis清單是簡單的字元串清單,按照插入順序排序。你可以添加一個元素導清單的頭部(左邊)或者尾部(右邊) 一個清單最多可以包含 232 - 1 個元素 (4294967295, 每個清單超過40億個元素)。
下表列出了清單相關的基本指令:
BLPOP key1 [key2 ] timeout
移出并擷取清單的第一個元素, 如果清單沒有元素會阻塞清單直到等待逾時或發現可彈出元素為止。
BRPOP key1 [key2 ] timeout
移出并擷取清單的最後一個元素, 如果清單沒有元素會阻塞清單直到等待逾時或發現可彈出元素為止。
BRPOPLPUSH source destination timeout
從清單中彈出一個值,将彈出的元素插入到另外一個清單中并傳回它; 如果清單沒有元素會阻塞清單直到等待逾時或發現可彈出元素為止。
LINDEX key index
通過索引擷取清單中的元素
LINSERT key BEFORE|AFTER pivot value
在清單的元素前或者後插入元素
LLEN key
擷取清單長度
LPOP key
移出并擷取清單的第一個元素
LPUSH key value1 [value2]
将一個或多個值插入到清單頭部
LPUSHX key value
将一個或多個值插入到已存在的清單頭部
LRANGE key start stop
擷取清單指定範圍内的元素
LREM key count value
移除清單元素
LSET key index value
通過索引設定清單元素的值
LTRIM key start stop
對一個清單進行修剪(trim),就是說,讓清單隻保留指定區間内的元素,不在指定區間之内的元素都将被删除。
RPOP key
移除并擷取清單最後一個元素
RPOPLPUSH source destination
移除清單的最後一個元素,并将該元素添加到另一個清單并傳回
RPUSH key value1 [value2]
在清單中添加一個或多個值
RPUSHX key value
為已存在的清單添加值
4.set(集合)
Redis的Set是string類型的無序集合。集合成員是唯一的,這就意味着集合中不能出現重複的資料。 Redis 中 集合是通過哈希表實作的,是以添加,删除,查找的複雜度都是O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
下表列出了 Redis 集合基本指令:
SADD key member1 [member2]
向集合添加一個或多個成員
SCARD key
擷取集合的成員數
SDIFF key1 [key2]
傳回給定所有集合的差集
SDIFFSTORE destination key1 [key2]
傳回給定所有集合的差集并存儲在 destination 中
SINTER key1 [key2]
傳回給定所有集合的交集
SINTERSTORE destination key1 [key2]
傳回給定所有集合的交集并存儲在 destination 中
SISMEMBER key member
判斷 member 元素是否是集合 key 的成員
SMEMBERS key
傳回集合中的所有成員
SMOVE source destination member
将 member 元素從 source 集合移動到 destination 集合
SPOP key
移除并傳回集合中的一個随機元素
SRANDMEMBER key [count]
傳回集合中一個或多個随機數
SREM key member1 [member2]
移除集合中一個或多個成員
SUNION key1 [key2]
傳回所有給定集合的并集
SUNIONSTORE destination key1 [key2]
所有給定集合的并集存儲在 destination 集合中
SSCAN key cursor [MATCH pattern] [COUNT count]
疊代集合中的元素
5.hash(哈希)
Redis hash 是一個string類型的field和value的映射表,hash特别适合用于存儲對象。 Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40多億)。
下表列出了 redis hash 基本的相關指令:
HDEL key field2 [field2]
删除一個或多個哈希表字段
HEXISTS key field
檢視哈希表 key 中,指定的字段是否存在。
HGET key field
擷取存儲在哈希表中指定字段的值。
HGETALL key
擷取在哈希表中指定 key 的所有字段和值
HINCRBY key field increment
為哈希表 key 中的指定字段的整數值加上增量 increment 。
HINCRBYFLOAT key field increment
為哈希表 key 中的指定字段的浮點數值加上增量 increment 。
HKEYS key
擷取所有哈希表中的字段
HLEN key
擷取哈希表中字段的數量
HMGET key field1 [field2]
擷取所有給定字段的值
HMSET key field1 value1 [field2 value2 ]
同時将多個 field-value (域-值)對設定到哈希表 key 中。
HSET key field value
将哈希表 key 中的字段 field 的值設為 value 。
HSETNX key field value
隻有在字段 field 不存在時,設定哈希表字段的值。
HVALS key
擷取哈希表中所有值
HSCAN key cursor [MATCH pattern] [COUNT count]
疊代哈希表中的鍵值對。
6.sorted set(有序集合)
Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重複的成員。 不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。 有序集合的成員是唯一的,但分數(score)卻可以重複。 集合是通過哈希表實作的,是以添加,删除,查找的複雜度都是O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
下表列出了 redis 有序集合的基本指令:
ZADD key score1 member1 [score2 member2]
向有序集合添加一個或多個成員,或者更新已存在成員的分數
ZCARD key
擷取有序集合的成員數
ZCOUNT key min max
計算在有序集合中指定區間分數的成員數
ZINCRBY key increment member
有序集合中對指定成員的分數加上增量 increment
ZINTERSTORE destination numkeys key [key ...]
計算給定的一個或多個有序集的交集并将結果集存儲在新的有序集合 key 中
ZLEXCOUNT key min max
在有序集合中計算指定字典區間内成員數量
ZRANGE key start stop [WITHSCORES]
通過索引區間傳回有序集合成指定區間内的成員
ZRANGEBYLEX key min max [LIMIT offset count]
通過字典區間傳回有序集合的成員
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
通過分數傳回有序集合指定區間内的成員
ZRANK key member
傳回有序集合中指定成員的索引
ZREM key member [member ...]
移除有序集合中的一個或多個成員
ZREMRANGEBYLEX key min max
移除有序集合中給定的字典區間的所有成員
ZREMRANGEBYRANK key start stop
移除有序集合中給定的排名區間的所有成員
ZREMRANGEBYSCORE key min max
移除有序集合中給定的分數區間的所有成員
ZREVRANGE key start stop [WITHSCORES]
傳回有序集中指定區間内的成員,通過索引,分數從高到底
ZREVRANGEBYSCORE key max min [WITHSCORES]
傳回有序集中指定分數區間内的成員,分數從高到低排序
ZREVRANK key member
傳回有序集合中指定成員的排名,有序內建員按分數值遞減(從大到小)排序
ZSCORE key member
傳回有序集中,成員的分數值
ZUNIONSTORE destination numkeys key [key ...]
計算給定的一個或多個有序集的并集,并存儲在新的 key 中
ZSCAN key cursor [MATCH pattern] [COUNT count]
疊代有序集合中的元素(包括元素成員和元素分值)