一、Redis基礎(chǔ)
1.概述
Redis是一個(gè)開源,高級(jí)的鍵值存儲(chǔ)和一個(gè)適用的解決方案,用于構(gòu)建高性能,可擴(kuò)展的Web應(yīng)用程序。
Redis有三個(gè)主要特點(diǎn),使它優(yōu)越于其它鍵值數(shù)據(jù)存儲(chǔ)系統(tǒng) -
- Redis將其數(shù)據(jù)庫完全保存在內(nèi)存中,僅使用磁盤進(jìn)行持久化。
- 與其它鍵值數(shù)據(jù)存儲(chǔ)相比,Redis有一組相對(duì)豐富的數(shù)據(jù)類型。
- Redis可以將數(shù)據(jù)復(fù)制到任意數(shù)量的從機(jī)中。
2.Redis的優(yōu)點(diǎn)
- 異???/strong> - 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與其他鍵值存儲(chǔ)系統(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)衡,在這種情況下,在不能大于存儲(chǔ)器(內(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)存中存儲(chǔ)表示更容易操作。 因此,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)的基本命令:
序號(hào) 命令及描述 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 所儲(chǔ)存的值的類型。
查找以 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最基本的類型,最大能存儲(chǔ)512MB的數(shù)據(jù),String類型是二進(jìn)制安全的,即可以存儲(chǔ)任何數(shù)據(jù)、比如數(shù)字、圖片、序列化對(duì)象等
下表列出了一些用于在Redis中管理字符串的基本命令。
編號(hào) 命令 描述說明 1 SET key value 此命令設(shè)置指定鍵的值。 2 GET key 獲取指定鍵的值。 3 GETRANGE key start end 獲取存儲(chǔ)在鍵上的字符串的子字符串。 4 GETSET key value 設(shè)置鍵的字符串值并返回其舊值。 5 GETBIT key offset 返回在鍵處存儲(chǔ)的字符串值中偏移處的位值。 6 MGET key1 key2.. 獲取所有給定鍵的值 7 SETBIT key offset value 存儲(chǔ)在鍵上的字符串值中設(shè)置或清除偏移處的位 8 SETEX key seconds value 使用鍵和到期時(shí)間來設(shè)置值 9 SETNX key value 設(shè)置鍵的值,僅當(dāng)鍵不存在時(shí) 10 SETRANGE key offset value 在指定偏移處開始的鍵處覆蓋字符串的一部分 11 STRLEN key 獲取存儲(chǔ)在鍵中的值的長度 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ù)值增加 116 INCRBY key increment 將鍵的整數(shù)值按給定的數(shù)值增加 17 INCRBYFLOAT key increment 將鍵的浮點(diǎn)值按給定的數(shù)值增加 18 DECR key 將鍵的整數(shù)值減 119 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對(duì)應(yīng)的值加1 incr age #2.key對(duì)應(yīng)的值減1 decr age #3.將key對(duì)應(yīng)的值加整數(shù) incrby age 10 #4.將key對(duì)應(yīng)的值減整數(shù) decrby age 20
1.4其他
演示:
#1.追加值 append name "hello" get name #2.獲取值長度 strlen name
2.哈希
Redis哈希(Hashes)是鍵值對(duì)的集合。Redis哈希是字符串字段和字符串值之間的映射。因此,它們用于存儲(chǔ)對(duì)象。
序號(hào) 命令 說明 1 HDEL key field2 [field2] 刪除一個(gè)或多個(gè)哈希字段。 2 HEXISTS key field 判斷是否存在散列字段。 3 HGET key field 獲取存儲(chǔ)在指定鍵的哈希字段的值。 4 HGETALL key 獲取存儲(chǔ)在指定鍵的哈希中的所有字段和值 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" #用于存儲(chǔ)包含用戶的基本信息的用戶對(duì)象,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)的一些基本命令。
序號(hào) 命令 說明 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對(duì)應(yīng)的list的第一個(gè)元素 127.0.0.1:6379> lpop alist "musql" #2.移除并返回key對(duì)應(yīng)的list的最后一個(gè)元素 127.0.0.1:6379> rpop alist "bbb" #3.返回存儲(chǔ)在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.返回存儲(chǔ)在key里的list的長度 127.0.0.1:6379> llen alist (integer) 3 #3.返回列表中索引對(duì)應(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)的一些基本命令。
序號(hào) 命令 說明 1 SADD key member1 [member2] 將一個(gè)或多個(gè)成員添加到集合 2 SCARD key 獲取集合中的成員數(shù) 3 SDIFF key1 [key2] 減去多個(gè)集合 4 SDIFFSTORE destination key1 [key2] 減去多個(gè)集并將結(jié)果集存儲(chǔ)在鍵中 5 SINTER key1 [key2] 相交多個(gè)集合 6 SINTERSTORE destination key1 [key2] 交叉多個(gè)集合并將結(jié)果集存儲(chǔ)在鍵中 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é)果集存儲(chǔ)在鍵中 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 有序集合的基本命令:
序號(hào) 命令及描述 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 有序集合中對(duì)指定成員的分?jǐn)?shù)加上增量 increment 5 ZINTERSTORE destination numkeys key [key ...] 計(jì)算給定的一個(gè)或多個(gè)有序集的交集并將結(jié)果集存儲(chǔ)在新的有序集合 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è)有序集的并集,并存儲(chǔ)在新的 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) 5b.獲取
#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對(duì)象(Strict嚴(yán)格),用于連接redis服務(wù)器,并按照不同類型提供 了不同方法,進(jìn)行交互操作
StrictRedis對(duì)象方法:
通過init創(chuàng)建對(duì)象,指定參數(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對(duì)象,與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()