一取试、Redis基礎(chǔ)
1.概述
Redis是一個(gè)開源渣窜,高級的鍵值存儲和一個(gè)適用的解決方案,用于構(gòu)建高性能踱蠢,可擴(kuò)展的Web應(yīng)用程序企锌。
Redis有三個(gè)主要特點(diǎn)榆浓,使它優(yōu)越于其它鍵值數(shù)據(jù)存儲系統(tǒng) -
- Redis將其數(shù)據(jù)庫完全保存在內(nèi)存中,僅使用磁盤進(jìn)行持久化霎俩。
- 與其它鍵值數(shù)據(jù)存儲相比哀军,Redis有一組相對豐富的數(shù)據(jù)類型柳击。
- Redis可以將數(shù)據(jù)復(fù)制到任意數(shù)量的從機(jī)中。
2.Redis的優(yōu)點(diǎn)
- 異澄魃瑁快 - Redis非潮途龋快洋满,每秒可執(zhí)行大約
110000
次的設(shè)置(SET
)操作回还,每秒大約可執(zhí)行81000
次的讀取/獲取(GET
)操作。- 支持豐富的數(shù)據(jù)類型 - Redis支持開發(fā)人員常用的大多數(shù)數(shù)據(jù)類型胁编,例如列表昧旨,集合,排序集和散列等等硼啤。這使得Redis很容易被用來解決各種問題钧忽,因?yàn)槲覀冎滥男﹩栴}可以更好使用地哪些數(shù)據(jù)類型來處理解決缺菌。
- 操作具有原子性 - 所有Redis操作都是原子操作晕鹊,這確保如果兩個(gè)客戶端并發(fā)訪問,Redis服務(wù)器能接收更新的值。
- 多實(shí)用工具 - Redis是一個(gè)多實(shí)用工具,可用于多種用例,如:緩存易核,消息隊(duì)列(Redis本地支持發(fā)布/訂閱)岳链,應(yīng)用程序中的任何短期數(shù)據(jù)纬向,例如娩缰,web應(yīng)用程序中的會(huì)話,網(wǎng)頁命中計(jì)數(shù)等谒府。
3.Redis與其他鍵值存儲系統(tǒng)
- Redis是鍵值數(shù)據(jù)庫系統(tǒng)的不同進(jìn)化路線,它的值可以包含更復(fù)雜的數(shù)據(jù)類型浮毯,可在這些數(shù)據(jù)類型上定義原子操作完疫。
- Redis是一個(gè)內(nèi)存數(shù)據(jù)庫,但在磁盤數(shù)據(jù)庫上是持久的债蓝,因此它代表了一個(gè)不同的權(quán)衡厘贼,在這種情況下蝇棉,在不能大于存儲器(內(nèi)存)的數(shù)據(jù)集的限制下實(shí)現(xiàn)非常高的寫和讀速度。
- 內(nèi)存數(shù)據(jù)庫的另一個(gè)優(yōu)點(diǎn)是浓利,它與磁盤上的相同數(shù)據(jù)結(jié)構(gòu)相比,復(fù)雜數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中存儲表示更容易操作嗜桌。 因此,Redis可以做很少的內(nèi)部復(fù)雜性。
二匿值、Redis 的安裝
第一步:安裝Redis,打開終端執(zhí)行以下命令
sudo apt-get install redis-server
第二步:啟動(dòng)Redis
redis-server
第三步:檢查Redis是否正在工作
redis-cli
執(zhí)行完得到的結(jié)果:
127.0.0.1:6379>
則說明正常工作說明:
127.0.0.1
是計(jì)算機(jī)的IP地址赂摆,6379
是運(yùn)行Redis服務(wù)器的端口挟憔。第四步:執(zhí)行
PING
命令。redis 127.0.0.1:6379> ping PONG
得到結(jié)果為PONG表明Redis已成功安裝
注意:在redis的server端烟号,維護(hù)著多個(gè)數(shù)據(jù)庫(默認(rèn)為16個(gè))
所有的數(shù)據(jù)庫以數(shù)組的形式保存在redisServer結(jié)構(gòu)中
三绊谭、Redis keys 命令
下表給出了與 Redis 鍵相關(guān)的基本命令:
序號 命令及描述 1 DEL key該命令用于在 key 存在時(shí)刪除 key 2 EXISTS key 檢查給定 key 是否存在。 3 EXPIRE key seconds為給定 key 設(shè)置過期時(shí)間汪拥。 4 PEXPIRE key milliseconds 設(shè)置 key 的過期時(shí)間以毫秒計(jì)达传。 5 KEYS pattern 查找所有符合給定模式( pattern)的 key 。 6 MOVE key db 將當(dāng)前數(shù)據(jù)庫的 key 移動(dòng)到給定的數(shù)據(jù)庫 db 當(dāng)中迫筑。 7 PERSIST key 移除 key 的過期時(shí)間趟大,key 將持久保持。 8 PTTL key 以毫秒為單位返回 key 的剩余的過期時(shí)間铣焊。 9 TTL key 以秒為單位逊朽,返回給定 key 的剩余生存時(shí)間(TTL, time to live)。 10 RANDOMKEY 從當(dāng)前數(shù)據(jù)庫中隨機(jī)返回一個(gè) key 曲伊。 11 RENAME key newkey 修改 key 的名稱 12 TYPE key 返回 key 所儲存的值的類型叽讳。
查找以 runoob 為開頭的 key:
redis 127.0.0.1:6379> KEYS runoob* 1) "runoob3" 2) "runoob1" 3) "runoob2"
獲取 redis 中所有的 key 可用使用 *****。
redis 127.0.0.1:6379> KEYS * 1) "runoob3" 2) "runoob1" 3) "runoob2"
四坟募、數(shù)據(jù)類型
Redis支持
5
種數(shù)據(jù)類型岛蚤。
1.字符串
String是redis最基本的類型,最大能存儲512MB的數(shù)據(jù)懈糯,String類型是二進(jìn)制安全的涤妒,即可以存儲任何數(shù)據(jù)、比如數(shù)字赚哗、圖片她紫、序列化對象等
下表列出了一些用于在Redis中管理字符串的基本命令。
編號 命令 描述說明 1 SET key value 此命令設(shè)置指定鍵的值屿储。 2 GET key 獲取指定鍵的值贿讹。 3 GETRANGE key start end 獲取存儲在鍵上的字符串的子字符串。 4 GETSET key value 設(shè)置鍵的字符串值并返回其舊值够掠。 5 GETBIT key offset 返回在鍵處存儲的字符串值中偏移處的位值民褂。 6 MGET key1 key2.. 獲取所有給定鍵的值 7 SETBIT key offset value 存儲在鍵上的字符串值中設(shè)置或清除偏移處的位 8 SETEX key seconds value 使用鍵和到期時(shí)間來設(shè)置值 9 SETNX key value 設(shè)置鍵的值,僅當(dāng)鍵不存在時(shí) 10 SETRANGE key offset value 在指定偏移處開始的鍵處覆蓋字符串的一部分 11 STRLEN key 獲取存儲在鍵中的值的長度 12 MSET key value key value … 為多個(gè)鍵分別設(shè)置它們的值 13 MSETNX key value key value … 為多個(gè)鍵分別設(shè)置它們的值,僅當(dāng)鍵不存在時(shí) 14 PSETEX key milliseconds value 設(shè)置鍵的值和到期時(shí)間(以毫秒為單位) 15 INCR key 將鍵的整數(shù)值增加 1
16 INCRBY key increment 將鍵的整數(shù)值按給定的數(shù)值增加 17 INCRBYFLOAT key increment 將鍵的浮點(diǎn)值按給定的數(shù)值增加 18 DECR key 將鍵的整數(shù)值減 1
19 DECRBY key decrement 按給定數(shù)值減少鍵的整數(shù)值 20 APPEND key value 將指定值附加到鍵
1.1設(shè)置
注 : Redis命令不區(qū)分大小寫赊堪,如
SET
,Set
和set
都是同一個(gè)命令面殖。字符串值的最大長度為 512MB。演示:
#1.設(shè)置鍵值 set name 'xiaoming' #2.設(shè)置鍵值及過期時(shí)間哭廉,以秒為單位 setex name 10 'xiaoming' #3.設(shè)置多個(gè)鍵值 mset name "lili" age 18 sex 'girl'
1.2獲取
演示:
#1.據(jù)鍵獲取值脊僚,如果鍵不存在則返回nil get name #2.根據(jù)多個(gè)鍵獲取多個(gè)值 mget name age
1.3運(yùn)算
要求:值是字符串類型的數(shù)字
演示:
#1.將key對應(yīng)的值加1 incr age #2.key對應(yīng)的值減1 decr age #3.將key對應(yīng)的值加整數(shù) incrby age 10 #4.將key對應(yīng)的值減整數(shù) decrby age 20
1.4其他
演示:
#1.追加值 append name "hello" get name #2.獲取值長度 strlen name
2.哈希
Redis哈希(Hashes)是鍵值對的集合。Redis哈希是字符串字段和字符串值之間的映射群叶。因此吃挑,它們用于存儲對象。
序號 命令 說明 1 HDEL key field2 [field2] 刪除一個(gè)或多個(gè)哈希字段街立。 2 HEXISTS key field 判斷是否存在散列字段舶衬。 3 HGET key field 獲取存儲在指定鍵的哈希字段的值。 4 HGETALL key 獲取存儲在指定鍵的哈希中的所有字段和值 5 HINCRBY key field increment 將哈希字段的整數(shù)值按給定數(shù)字增加 6 HINCRBYFLOAT key field increment 將哈希字段的浮點(diǎn)值按給定數(shù)值增加 7 HKEYS key 獲取哈希中的所有字段 8 HLEN key 獲取散列中的字段數(shù)量 9 HMGET key field1 [field2] 獲取所有給定哈希字段的值 10 [HMSET key field1 value1 field2 value2 ] 為多個(gè)哈希字段分別設(shè)置它們的值 11 HSET key field value 設(shè)置散列字段的字符串值 12 HSETNX key field value 僅當(dāng)字段不存在時(shí)赎离,才設(shè)置散列字段的值 13 HVALS key 獲取哈希中的所有值
2.1設(shè)置
演示:
#1.設(shè)置單個(gè)值 hset ukey name 'zhangsan' #2.設(shè)置多個(gè)值 hmset ukey username "xixi" password "123456" #用于存儲包含用戶的基本信息的用戶對象逛犹,ukey是哈希表的名稱
2.2獲取
演示:
#1.獲取一個(gè)屬性的值 hget ukey name #2.獲取多個(gè)屬性的值 hmget ukey username password #3.獲取所有屬性和值 hgetall ukey #4.獲取所有屬性 hkeys ukey #5.獲取所有值 hvals ukey #6.返回包含數(shù)據(jù)的個(gè)數(shù) hlen ukey
2.3其他
演示:
#1.判斷屬性是否存在,存在返回1梁剔,不存在返回0 hexists ukey username #2.刪除屬性及值 hdel ukey username 'xixi'
3.列表
Redis列表只是字符串列表虽画,按插入順序排序。您可以向Redis列表的頭部或尾部添加元素荣病。
列表的最大長度為
2^32 - 1
個(gè)元素(4294967295
码撰,每個(gè)列表可容納超過40
億個(gè)元素)。下表列出了與列表相關(guān)的一些基本命令个盆。
序號 命令 說明 1 BLPOP key1 [key2 ] timeout 刪除并獲取列表中的第一個(gè)元素脖岛,或阻塞,直到有一個(gè)元素可用 2 BRPOP key1 [key2 ] timeout 刪除并獲取列表中的最后一個(gè)元素颊亮,或阻塞柴梆,直到有一個(gè)元素可用 3 BRPOPLPUSH source destination timeout 從列表中彈出值,將其推送到另一個(gè)列表并返回它; 或阻塞终惑,直到一個(gè)可用 4 LINDEX key index 通過其索引從列表獲取元素 5 LINSERT key BEFORE/AFTER pivot value 在列表中的另一個(gè)元素之前或之后插入元素 6 LLEN key 獲取列表的長度 7 LPOP key 刪除并獲取列表中的第一個(gè)元素 8 LPUSH key value1 [value2] 將一個(gè)或多個(gè)值添加到列表 9 LPUSHX key value 僅當(dāng)列表存在時(shí)绍在,才向列表添加值 10 LRANGE key start stop 從列表中獲取一系列元素 11 LREM key count value 從列表中刪除元素 12 LSET key index value 通過索引在列表中設(shè)置元素的值 13 LTRIM key start stop 修剪列表的指定范圍 14 RPOP key 刪除并獲取列表中的最后一個(gè)元素 15 RPOPLPUSH source destination 刪除列表中的最后一個(gè)元素,將其附加到另一個(gè)列表并返回 16 RPUSH key value1 [value2] 將一個(gè)或多個(gè)值附加到列表 17 RPUSHX key value 僅當(dāng)列表存在時(shí)才將值附加到列表
3.1設(shè)置
演示:
#1.在頭部插入 127.0.0.1:6379> lpush alist redis (integer) 1 127.0.0.1:6379> lpush alist mongodb (integer) 2 127.0.0.1:6379> lpush alist mysql (integer) 3 127.0.0.1:6379> lrange alist 0 10 1) "mysql" 2) "mongodb" 3) "redis" #2.在尾部插入 127.0.0.1:6379> rpush alist aaa (integer) 4 127.0.0.1:6379> lrange alist 0 10 1) "musql" 2) "mongodb" 3) "redis" 4) "aaa" #3.在一個(gè)元素的前/后插入新元素 127.0.0.1:6379> linsert alist after aaa bbb (integer) 5 127.0.0.1:6379> lrange alist 0 10 1) "musql" 2) "mongodb" 3) "redis" 4) "aaa" 5) "bbb" 127.0.0.1:6379> linsert alist before aaa ccc (integer) 6 127.0.0.1:6379> lrange alist 0 10 1) "musql" 2) "mongodb" 3) "redis" 4) "ccc" 5) "aaa" 6) "bbb" #4.設(shè)置指定索引的元素值,索引從0開始 127.0.0.1:6379> lset alist 3 bbb OK 127.0.0.1:6379> lrange alist 0 10 1) "musql" 2) "mongodb" 3) "redis" 4) "bbb" 5) "aaa" 6) "bbb" #注意:索引值可以是負(fù)數(shù)雹有,表示偏移量是從list的尾部開始偿渡,如-1表示最后一個(gè)元素
3.2獲取
演示:
#1.移除并返回key對應(yīng)的list的第一個(gè)元素 127.0.0.1:6379> lpop alist "musql" #2.移除并返回key對應(yīng)的list的最后一個(gè)元素 127.0.0.1:6379> rpop alist "bbb" #3.返回存儲在key的列表中的指定范圍的元素 127.0.0.1:6379> lrange alist 0 10 1) "mongodb" 2) "redis" 3) "bbb" 4) "aaa" #注意:start end都是從0開始
3.3其他
演示:
#1.裁剪列表,改為原集合的一個(gè)子集 127.0.0.1:6379> ltrim alist 0 2 OK 127.0.0.1:6379> lrange alist 0 10 1) "mongodb" 2) "redis" 3) "bbb" #包頭包尾 #2.返回存儲在key里的list的長度 127.0.0.1:6379> llen alist (integer) 3 #3.返回列表中索引對應(yīng)的值 127.0.0.1:6379> lindex alist 2 "bbb"
4.集合
Redis集合是唯一字符串的無序集合件舵。 唯一值表示集合中不允許鍵中有重復(fù)的數(shù)據(jù)卸察。
一個(gè)集合中的最大成員數(shù)量為
2^32 - 1
(即4294967295
,每個(gè)集合中元素?cái)?shù)量可達(dá)40
億個(gè))個(gè)铅祸。下表列出了與集合相關(guān)的一些基本命令。
序號 命令 說明 1 SADD key member1 [member2] 將一個(gè)或多個(gè)成員添加到集合 2 SCARD key 獲取集合中的成員數(shù) 3 SDIFF key1 [key2] 減去多個(gè)集合 4 SDIFFSTORE destination key1 [key2] 減去多個(gè)集并將結(jié)果集存儲在鍵中 5 SINTER key1 [key2] 相交多個(gè)集合 6 SINTERSTORE destination key1 [key2] 交叉多個(gè)集合并將結(jié)果集存儲在鍵中 7 SISMEMBER key member 判斷確定給定值是否是集合的成員 8 SMOVE source destination member 將成員從一個(gè)集合移動(dòng)到另一個(gè)集合 9 SPOP key 從集合中刪除并返回隨機(jī)成員 10 SRANDMEMBER key [count] 從集合中獲取一個(gè)或多個(gè)隨機(jī)成員 11 SREM key member1 [member2] 從集合中刪除一個(gè)或多個(gè)成員 12 SUNION key1 [key2] 添加多個(gè)集合 13 SUNIONSTORE destination key1 [key2] 添加多個(gè)集并將結(jié)果集存儲在鍵中 14 SSCAN key cursor [MATCH pattern] [COUNT count] 遞增地迭代集合中的元素
4.1設(shè)置
演示:
#1.添加元素 redis 127.0.0.1:6379> sadd aset redis (integer) 1 redis 127.0.0.1:6379> sadd aset mongodb (integer) 1 redis 127.0.0.1:6379> sadd aset sqlite (integer) 1 redis 127.0.0.1:6379> sadd aset sqlite (integer) 0 redis 127.0.0.1:6379> smembers aset 1) "sqlite" 2) "mongodb" 3) "redis" #aset 為鍵 #注意 :如果被添加兩次,但是由于集合的唯一屬性临梗,所以它只算添加一次涡扼。
4.2獲取
演示:
#1.返回key集合中所有元素 redis 127.0.0.1:6379> smembers aset #2.返回集合元素個(gè)數(shù) redis 127.0.0.1:6379> scard aset
4.3交集
演示:
#1.求多個(gè)集合的交集 127.0.0.1:6379> sadd aset1 aaa (integer) 1 127.0.0.1:6379> sadd aset1 mysql (integer) 1 127.0.0.1:6379> sadd aset1 bbbb (integer) 1 127.0.0.1:6379> sinter aset aset1 1) "mysql" 2) "aaa" #2.求多個(gè)集合的差集 127.0.0.1:6379> sdiff aset aset1 1) "mongodb" 2) "redis" #3.判斷元素是否在集合中,存在返回1盟庞,不存在返回0 127.0.0.1:6379> sismember aset mysql (integer) 1
4.4有序集合
Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復(fù)的成員吃沪。
不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)。redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序什猖。
有序集合的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)
下表列出了 redis 有序集合的基本命令:
序號 命令及描述 1 ZADD key score1 member1 [score2 member2]向有序集合添加一個(gè)或多個(gè)成員票彪,或者更新已存在成員的分?jǐn)?shù) 2 ZCARD key 獲取有序集合的成員數(shù) 3 ZCOUNT key min max 計(jì)算在有序集合中指定區(qū)間分?jǐn)?shù)的成員數(shù) 4 ZINCRBY key increment member 有序集合中對指定成員的分?jǐn)?shù)加上增量 increment 5 ZINTERSTORE destination numkeys key [key ...] 計(jì)算給定的一個(gè)或多個(gè)有序集的交集并將結(jié)果集存儲在新的有序集合 key 中 6 ZLEXCOUNT key min max 在有序集合中計(jì)算指定字典區(qū)間內(nèi)成員數(shù)量 7 [ZRANGE key start stop [WITHSCORES]通過索引區(qū)間返回有序集合成指定區(qū)間內(nèi)的成員 8 ZRANGEBYLEX key min max [LIMIT offset count]通過字典區(qū)間返回有序集合的成員 9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]通過分?jǐn)?shù)返回有序集合指定區(qū)間內(nèi)的成員 10 ZRANK key member 返回有序集合中指定成員的索引 11 ZREM key member member...移除有序集合中的一個(gè)或多個(gè)成員 12 ZREMRANGEBYLEX key min max 移除有序集合中給定的字典區(qū)間的所有成員 13 ZREMRANGEBYRANK key start stop 移除有序集合中給定的排名區(qū)間的所有成員 14 ZREMRANGEBYSCORE key min max移除有序集合中給定的分?jǐn)?shù)區(qū)間的所有成員 15 ZREVRANGE key start stop [WITHSCORES]返回有序集中指定區(qū)間內(nèi)的成員,通過索引不狮,分?jǐn)?shù)從高到底 16 ZREVRANGEBYSCORE key max min [WITHSCORES]返回有序集中指定分?jǐn)?shù)區(qū)間內(nèi)的成員降铸,分?jǐn)?shù)從高到低排序 17 ZREVRANK key member 返回有序集合中指定成員的排名,有序集成員按分?jǐn)?shù)值遞減(從大到小)排序 18 ZSCORE key member 返回有序集中摇零,成員的分?jǐn)?shù)值 19 ZUNIONSTORE destination numkeys key [key ...]計(jì)算給定的一個(gè)或多個(gè)有序集的并集推掸,并存儲在新的 key 中 20 ZSCAN key cursor [MATCH pattern] [COUNT count]迭代有序集合中的元素(包括元素成員和元素分值 演示:
a.添加
127.0.0.1:6379> zadd z1 1 a 3 b 4 c 5 d 2 e (integer) 5
b.獲取
#1.返回指定范圍的元素 127.0.0.1:6379> zrange z1 1 3 1) "e" 2) "b" 3) "c" #2.返回元素個(gè)數(shù) 127.0.0.1:6379> zcard z1 (integer) 5 #3.返回有序集合key中,score在min和max之間的元素的個(gè)數(shù) 127.0.0.1:6379> zcount z1 2 5 (integer) 4 #4.返回有序集合key中驻仅,成員member的score值 127.0.0.1:6379> zscore z1 b "3"
五谅畅、與 python 交互
pip3 install redis
引入模塊
from redis import StrictRedis
這個(gè)模塊中提供了StrictRedis對象(Strict嚴(yán)格),用于連接redis服務(wù)器噪服,并按照不同類型提供 了不同方法毡泻,進(jìn)行交互操作
StrictRedis對象方法:
通過init創(chuàng)建對象,指定參數(shù)host粘优、port與指定的服務(wù)器和端口連接仇味,host默認(rèn)為localhost,port默認(rèn)為6379敬飒,db默認(rèn)為0
sr = StrictRedis(host='localhost', port=6379, db=0)代碼演示:
from redis import * # 創(chuàng)建一個(gè)StrictReids對象邪铲,與redis服務(wù)器建立連接 sr = StrictRedis(host='localhost', port=6379, db=0) #1.增 try: result = sr.set('py1', 'gj') # result如果為true,則表示添加成功 print(result) except Exception as e: print(e) #2.刪 #result = sr.delete('py1') #print(result) #3.改 result = sr.set('py1','he') #4.查 #如果建不存在无拗,則返回None result = sr.get('py1') #5.獲取建 result = sr.keys()