類型 | 簡介 | 特性 | 場景 |
---|---|---|---|
String | 二進(jìn)制安全 | 可以包含任何數(shù)據(jù)腋逆,比如jpg圖片或者序列化的對象穿扳,一個鍵最大能存儲512M | -- |
Hash | 鍵值對集合橡伞,對應(yīng)Python中的Dict呻纹;Java中的Map | 適合存儲對象,并且可以像數(shù)據(jù)庫中update一個屬性一樣只修改某一項屬性值(Memcached中需要取出整個字符串反序列化成對象修改完再序列化存回去) | 存儲死讹、讀取站欺、修改用戶屬性 |
List | 鏈表(雙向鏈表) | 增刪快迎瞧,提供了操作某一段元素的API | ① 最新消息排行等功能(比如朋友圈的時間線)间螟;② 消息隊列 |
Set | 哈希表實現(xiàn)吴旋,元素不重復(fù) | ⒈ 添加损肛、刪除,查找的復(fù)雜度都是O(1) 荣瑟;⒉ 為集合提供了求交集治拿、并集、差集等操作 | ① 共同好友笆焰;② 利用唯一性劫谅,統(tǒng)計訪問網(wǎng)站的所有獨立ip;③ 好友推薦時嚷掠,根據(jù)tag求交集捏检,大于某個閾值就可以推薦 |
Sorted Set(有序集合) | 將Set中的元素增加一個權(quán)重參數(shù)score,元素按score有序排列 | 數(shù)據(jù)插入集合時不皆,已經(jīng)進(jìn)行天然排序 | ① 排行榜贯城;② 帶權(quán)重的消息隊列 |
1、String(字符串)
1.1- set(name, value, ex=None, px=None, nx=False, xx=False)
? -- 在redis中設(shè)置name對應(yīng)的值粟焊。不存在則創(chuàng)建冤狡,存在則修改
? -- ex,過期時間(秒)
? -- px项棠,過期時間(毫秒)
? -- nx悲雳,如果設(shè)置為True,則只有name不存在時香追,當(dāng)前set方法才執(zhí)行
? -- xx合瓢,如果設(shè)置為True,則只有name存在時透典,當(dāng)前set方法才執(zhí)行
1.2- setnx(name, value)
? -- 在redis中設(shè)置name對應(yīng)的值晴楔。只有name不存在時,才執(zhí)行添加
1.3- setex(name, value, time)
? -- 在redis中設(shè)置name對應(yīng)的值
? -- time峭咒,過期時間(數(shù)字秒 或 timedelta對象)
1.4- psetex(name, value, time_ms)
? -- 在redis中設(shè)置name對應(yīng)的值
? -- time_ms税弃,過期時間(數(shù)字毫秒 或 timedelta對象)
1.5- mset(*args, **kwargs)
? -- 在redis中批量設(shè)置值
? -- eg:mset(k1='v1', k2='v2') 或 mget({'k1': 'v1', 'k2': 'v2'})
1.6- get(name)
? -- 獲取redis中name對應(yīng)的值
1.7- mget(keys, *args)
? -- 批量獲取redis中name對應(yīng)的值
? -- keys,redis的name
? -- eg:mget('cn-zh', 'chinese') 或 mget(['cn-zh', 'chinese'])
1.8- getset(name, value)
? -- 在redis中設(shè)置name對應(yīng)的值并獲取原來的值
1.9- getrange(name, start, end)
? -- 在redis中截取獲得子序列(根據(jù)字節(jié)獲取凑队,非字符)
? -- start则果,字符串中字節(jié)的起始位置
? -- end,字符串中字節(jié)的結(jié)束位置
? -- eg:"文藝青年"漩氨,0-3表示 “文”
1.10- setrange(key, offset, value)
? -- 修改redis中name對應(yīng)的字符串內(nèi)容西壮,從指定字符串索引開始向后替換(新值太長則向后添加)
? -- offset,字符串的索引叫惊。字節(jié)(一個漢字為三個字節(jié))
? -- value款青,要修改的值
1.11- setbit(name, offset, value)
? -- 對redis中name對應(yīng)值的二進(jìn)制表示位數(shù)進(jìn)行操作
? -- offset,二進(jìn)制位的索引(將值變換成二進(jìn)制后在進(jìn)行索引)
? -- value霍狰,值只能是0或1
? -- eg:n1 = "foo" 二進(jìn)制表示為:01100110 01101111 01101111
所以setbit('n1', 7, 1)表示將二進(jìn)制后的n1的第7位修改為1抡草,即:01100111 01101111 01101111饰及。轉(zhuǎn)化為字符串則是"goo"
1.12- getbit(name, offset)
? -- 獲取在redis中name對應(yīng)的值的二進(jìn)制表示中的某位的值(0或1)
1.13- bitcount(key, start=None, end=None)
? -- 獲取在redis中name對應(yīng)值的二進(jìn)制表示中 1 的個數(shù)
? -- keys,redis的name
? -- start渠牲,位的起始位置
? -- end旋炒,位的結(jié)束位置
1.14- bitop(operation, dest, *keys)
? -- 獲取多個值,并做位運算签杈,將最后結(jié)果保存至新的name對應(yīng)的值
? -- operation,AND(并)鼎兽、OR(或)答姥、NOT(非)、XOR(異或)
? -- dest谚咬,新的redis的name
? -- *keys鹦付,要查找的redis的name
? -- eg:bitop("AND", 'new_name', 'n1', 'n2', 'n3')表示獲取redis中n1,n2,n3對應(yīng)的值,所有值做位運算(求并集)择卦,然后將結(jié)果保存到new_name對應(yīng)的值中
1.15- strlen(name)
? -- 返回name對應(yīng)值的字節(jié)長度(一個漢字為三個字節(jié))
1.16- incr(name, amount=1)
? -- 自增name的對應(yīng)值敲长,當(dāng)name不存在時創(chuàng)建name=amount,否則自增
? -- amount秉继,自增數(shù)(int)
1.17- incrbyfloat(name, amount=1.0)
? -- 自增name的對應(yīng)值祈噪,當(dāng)name不存在時創(chuàng)建name=amount,否則自增
? -- amount尚辑,自增數(shù)(float)
1.18- decr(name, amount=1)
? -- 自減name的對應(yīng)值辑鲤,當(dāng)name不存在時創(chuàng)建name=amount,否則自減
? -- amount杠茬,自減數(shù)(int)
1.19- append(key, value)
? -- 在redis中name對應(yīng)值后面追加內(nèi)容
? -- key月褥,redis的name
? -- value,要追加的字符串
2瓢喉、List(列表)
(redis的list在內(nèi)存中按照一個name對應(yīng)一個列表來存儲)
2.1- lpush(name,values)
? -- 在name對應(yīng)的list中從左到右添加新元素
? -- ps:rpush(name, values)表示從右到左添加
? -- eg:conn.lpush('en', 80,90,10) # 保存順序:10, 90, 80
2.2- lpushx(name, value)
? -- 在name對應(yīng)的list中添加元素宁赤,只當(dāng)name存在才把元素添加到list最左邊
? -- ps:rpushx(name, value)表示從右到左添加
2.3- llen(name)
? -- name對應(yīng)的list中元素的個數(shù)
2.4- linsert(name, where, refvalue, value)
? -- 在name對應(yīng)的list中的某個元素前或后插入一個新的元素
? -- where,前或后
? -- refvalue栓票,標(biāo)識元素决左。在它前后插入
? -- value,要插入的元素
2.5- r.lset(name, index, value)
? -- 對name對應(yīng)的list中的某個索引位置重新賦值
? -- index逗载,list中的索引值
? -- value哆窿,要改變的值
2.6- r.lrem(name, value, num)
? -- 在name對應(yīng)的list中刪除指定元素
? -- value,要刪除的元素
? -- num厉斟,num=0挚躯,刪除list中所有指定元素;num=2擦秽,從前往后刪除2個码荔;num=-2漩勤,從后往前刪除2個
2.7- lpop(name)
? -- 在name對應(yīng)的list的最左側(cè)獲取一個元素并移除,返回該元素
? -- ps:rpop(name)表示在最右側(cè)操作執(zhí)行
2.8- lindex(name, index)
? -- 在name對應(yīng)的list中根據(jù)索引獲取元素
2.9- lrange(name, start, end)
? -- 在name對應(yīng)的list分片獲取數(shù)據(jù)
? -- start缩搅,索引起始位置
? -- end越败,索引結(jié)束位置
2.10- ltrim(name, start, end)
? -- 在name對應(yīng)的list中,移除不在start到end范圍的元素
? -- start硼瓣,索引起始位置
? -- end究飞,索引結(jié)束位置
2.11- rpoplpush(src, dst)
? -- 從某個列表取出最右側(cè)的元素,將其添加到另一個列表的最左側(cè)
? -- src堂鲤,取元素的列表
? -- dst亿傅,加元素的列表
2.12- brpoplpush(src, dst, timeout=0)
? -- 從一個列表的右側(cè)移除一個元素并將其添加到另一個列表左側(cè)
? -- src,取出并要移除元素的列表
? -- dst瘟栖,要插入元素的列表
? -- timeout葵擎,當(dāng)src對應(yīng)的list中沒有數(shù)據(jù)時,阻塞等待有數(shù)據(jù)的超時時間半哟,0表示永遠(yuǎn)阻塞
2.13- blpop(keys, timeout)
? -- 將多個列表排列酬滤,按照從左到右去取對應(yīng)列表的元素
? -- keys,redis的name的集合
? -- timeout寓涨,超時時間盯串,當(dāng)所有列表的元素都取完后,阻塞等到列表重新有元素的時間缅茉,0表示永遠(yuǎn)阻塞
? -- ps:brpop(keys, timeout)表示從右到左取元素
2.14- 自定義增量迭代
? -- 由于redis類庫中沒有提供對列表元素的增量迭代嘴脾,如果需要循環(huán)name對應(yīng)的list中的所有元素,則需要滿足:
?? -- a蔬墩、獲取name對應(yīng)的所有列表
?? -- b译打、循環(huán)列表
? -- 但如果列表過大,就應(yīng)該自定義增量迭代功能
def list_iter(name):
"""
:param name: 要迭代name對應(yīng)的list
:return: yield返回列表元素
"""
list_count = conn.llen(name)
for index in range(list_count):
yield conn.lindex(name, index)
for iter in list_iter('txt'):
print(item)
3拇颅、Hash(哈希)
3.1- hset(name, key, value)
? -- 在name對應(yīng)的dict中設(shè)置一個鍵值對(不存在奏司,則創(chuàng)建;存在樟插,則修改)
? -- name為redis中的name
? -- key為name對應(yīng)的dict中的key
? -- value為name對應(yīng)的dict中的value
? -- eg:conn.hset('cn-zh', 'k1', 'v1')
3.2- hmset(name, mapping)
? -- 在name對應(yīng)的dict中批量設(shè)置鍵值對
? -- name為redis中的name
? -- mapping韵洋,字典。如:{'k1': 'v1', 'k2': 'v2'}
? -- eg:conn.hmset('cn-zh', {'k1': 'v1', 'k2': 'v2'})
3.3- hget(name, key)
? -- 在name對應(yīng)的dict中根據(jù)key獲取value值
? -- eg:conn.hget('cn-zh', 'k1')
3.4- hmget(name, keys, *args)
? -- 在name對應(yīng)的dict中獲取多個key的value值
? -- keys黄锤,要獲取key集合搪缨。如:['k1', 'k2', 'k3']
? -- *args,要獲取的key鸵熟。如:k1, k2, k3
? -- eg:conn.hmget('cn-zh', ['k1', 'k2', 'k3']) 或 conn.hmget('cn-zh', 'k1', 'k2', 'k3')
3.5- hgetall(name)
? -- 獲取name對應(yīng)的dict中所有的鍵值
3.6- hlen(name)
? -- 獲取name對應(yīng)的dict中鍵值對的個數(shù)
3.7- hkeys(name)
? -- 獲取name對應(yīng)的dict中所有key的值
3.8- hvals(name)
? -- 獲取name對應(yīng)的dict中所有value的值
3.9- hexists(name, key)
? -- 檢查name對應(yīng)的dict是否存在當(dāng)前傳入的key
3.10- hdel(name, *keys)
? -- 把name對應(yīng)的dict中指定的key的鍵值對刪除
3.11- hincrby(name, key, amount=1)
? -- 自增name對應(yīng)的hash中指定的key的值副编,不存在時創(chuàng)建key=amount
? -- key,dict對應(yīng)的key
? -- amount流强, 自增數(shù)(int)
3.12- hincrbyfloat(name, key, amount=1.0)
? -- 自增name對應(yīng)的dict中的指定 key的值痹届,不存在時創(chuàng)建key=amount
? -- key呻待,dict對應(yīng)的key
? -- amount,自增數(shù)(float)
3.13- hscan(name, cursor=0, match=None, count=None)
? -- 增量式迭代獲取队腐,優(yōu)勢在于數(shù)據(jù)大蚕捉。可實現(xiàn)分片的獲取數(shù)據(jù)柴淘,非一次全獲取完迫淹,將內(nèi)存撐爆
? -- cursor,游標(biāo)(基于游標(biāo)分批獲取數(shù)據(jù))
? -- match悠就,匹配指定key千绪,默認(rèn)None,表示所有的key
? -- count梗脾, 每次分片最少獲取的個數(shù),默認(rèn)None盹靴,表示采用Redis的默認(rèn)分片個數(shù)
? -- eg:
cursor1, data1 = conn.hscan('cn-zh', cursor=0, match=None, count=None)
cursor2, data2 = conn.hscan('cn-zh', cursor=cursor1, match=None, count=None)
...
直到返回值cursor的值為0時炸茧,表示數(shù)據(jù)已通過分片獲取結(jié)束
3.14- hscan_iter(name, match=None, count=None)
? -- 利用yield封裝hscan創(chuàng)建生成器,實現(xiàn)分批到redis中獲取數(shù)據(jù)
? -- match稿静,匹配指定key梭冠,默認(rèn)None,表示所有的key
? -- count改备,每次分片最少獲取的個數(shù)控漠,默認(rèn)None,表示采用redis的默認(rèn)分片個數(shù)
? -- eg:
for item in conn.hscan_item('cn-zh'):print(item)
4悬钳、Set(集合)盐捷,無序不重復(fù)
4.1- sadd(name, values)
? -- name對應(yīng)的集合中添加數(shù)據(jù)
4.2- scard(name)
? -- 獲取name對應(yīng)集合中元素個數(shù)
4.3- sdiff(keys, *args)
? -- 在第一個name對應(yīng)的集合中,且不在其他name對應(yīng)的集合的元素集合
4.4- sdiffstore(dest, keys, *args)
? -- 獲取第一個name對應(yīng)的集合中默勾,且不在其他name對應(yīng)的集合碉渡,再將其新加入到dest對應(yīng)的集合中
4.5- sinter(keys, *args)
? -- 獲取多一個name對應(yīng)的集合的并集
4.6- sinterstore(dest, keys, *args)
? -- 獲取多一個name對應(yīng)集合的并集,再將其加入到dest對應(yīng)的集合中
4.7- sismember(name, value)
? -- 檢查value是否是name對應(yīng)集合的成員
4.8- smembers(name)
? -- 獲取name對應(yīng)集合的所有成員
4.9- smove(src, dst, value)
? -- 將某個成員從一個集合移動到另一個集合
4.10- spop(name)
? -- 從集合的右側(cè)移除一個成員母剥,并將其返回
4.11- srandmember(name, numbers)
? -- 從name對應(yīng)集合中隨機獲取numbers個元素
4.12- srem(keys, *args)
? -- 在name對應(yīng)集合中刪除某些值
4.13- sunion(keys, *args)
? -- 獲取多一個name對應(yīng)集合的并集
4.14- sunionstore(dest, keys, *args)
? -- 獲取多一個name對應(yīng)集合的并集滞诺,并將結(jié)果保存到dest對應(yīng)集合中
4.15- sscan(name, cursor=0, match=None, count=None)
? -- 用于增量迭代獲取,避免內(nèi)存消耗太大
4.16- sscan_iter(name, match=None, count=None)
? -- 創(chuàng)建生成器环疼,用于增量迭代分批獲取习霹,避免內(nèi)存消耗太大
5、zset(sorted set:有序集合)炫隶,不允許重復(fù)
有序集合淋叶,在集合的基礎(chǔ)上,為每元素排序等限;元素的排序需要根據(jù)另外一個值來進(jìn)行比較爸吮,所以芬膝,對于有序集合,每一個元素有兩個值形娇,即:值和分?jǐn)?shù)锰霜,分?jǐn)?shù)專門用來做排序。
5.1- zadd(name, *args, **kwargs)
? -- 在name對應(yīng)的有序集合中添加元素
? -- eg:zadd('add', 'n1', 1, 'n2', 2) 或 zadd('add', n1=1, n2=2)
5.2- zcard(name)
? -- 獲取name對應(yīng)的有序集合元素的數(shù)量
5.3- zcount(name, min, max)
? -- 獲取name對應(yīng)的有序集合中分?jǐn)?shù) 在 [min,max] 之間的個數(shù)
5.4- zincrby(name, value, amount)
? -- 自增name對應(yīng)的有序集合的 name 對應(yīng)的分?jǐn)?shù)
5.5- zrange(name, start, end, desc=False, withscores=False,
score_cast_func=float)
? -- 按照索引范圍獲取name對應(yīng)的有序集合的元素
? -- start桐早,有序集合索引起始位置(非分?jǐn)?shù))
? -- end癣缅,有序集合索引結(jié)束位置(非分?jǐn)?shù))
? -- desc,排序規(guī)則哄酝,默認(rèn)按照分?jǐn)?shù)從小到大排序
? -- withscores友存,是否獲取元素的分?jǐn)?shù),默認(rèn)只獲取元素的值
? -- score_cast_func陶衅,對分?jǐn)?shù)進(jìn)行數(shù)據(jù)轉(zhuǎn)換的函數(shù)
? -- 從大到小排序:zrevrange(name, start, end, withscores=False, score_cast_func=float)
? -- 按照分?jǐn)?shù)范圍獲取name對應(yīng)的有序集合的元素:zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float)
? -- 從大到新帕ⅰ:zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float)
5.6- zrank(name, value)
? -- 獲取某個值在 name對應(yīng)的有序集合中的排行(從 0 開始)
? -- zrevrank(name, value),從大到小排序
5.7- zrangebylex(name, min, max, start=None, num=None)
? -- 當(dāng)有序集合的所有成員都具有相同的分值時搀军,有序集合的元素會根據(jù)成員的 值 (lexicographical ordering)來進(jìn)行排序膨俐,而這個命令則可以返回給定的有序集合鍵 key 中, 元素的值介于 min 和 max 之間的成員罩句。對集合中的每個成員進(jìn)行逐個字節(jié)的對比(byte-by-byte compare)焚刺, 并按照從低到高的順序, 返回排序后的集合成員门烂。 如果兩個字符串有一部分內(nèi)容是相同的話乳愉, 那么命令會認(rèn)為較長的字符串比較短的字符串要大
? -- min,左區(qū)間(值)屯远。 + 表示正無限蔓姚; - 表示負(fù)無限; ( 表示開區(qū)間氓润; [ 則表示閉區(qū)間
? -- min赂乐,右區(qū)間(值)
? -- start,對結(jié)果進(jìn)行分片處理咖气,索引位置
? -- num挨措,對結(jié)果進(jìn)行分片處理,索引后面的num個元素
? -- eg:
# ZADD myzset 0 aa 0 ba 0 ca 0 da 0 ea 0 fa 0 ga
# r.zrangebylex('myzset', "-", "[ca") 結(jié)果為:['aa', 'ba', 'ca']
? -- 從大到小排序
# zrevrangebylex(name, max, min, start=None, num=None)
5.8- zrem(name, values)
? -- 刪除name對應(yīng)的有序集合中值是values的成員
? -- eg:zrem('zz', ['s1', 's2'])
5.9- zremrangebyrank(name, min, max)
? -- 根據(jù)排行范圍刪除
5.10- zremrangebyscore(name, min, max)
? -- 根據(jù)分?jǐn)?shù)范圍刪除
5.11- zremrangebylex(name, min, max)
? -- 根據(jù)值返回刪除
5.12- zscore(name, value)
? -- 獲取name對應(yīng)有序集合中 value 對應(yīng)的分?jǐn)?shù)
5.13- zinterstore(dest, keys, aggregate=None)
? -- 獲取兩個有序集合的交集崩溪,如果遇到相同值不同分?jǐn)?shù)浅役,則按照aggregate進(jìn)行操作
? -- aggregate的值為: SUM MIN MAX
5.14- zunionstore(dest, keys, aggregate=None)
? -- 獲取兩個有序集合的并集,如果遇到相同值不同分?jǐn)?shù)伶唯,則按照aggregate進(jìn)行操作
? -- aggregate的值為: SUM MIN MAX
5.15- zscan(name, cursor=0, match=None, count=None, score_cast_func=float)
? -- 同字符串操作
5.16- zscan_iter(name, match=None, count=None,score_cast_func=float)
? -- 同字符串相似觉既,相較于字符串新增score_cast_func,用來對分?jǐn)?shù)進(jìn)行操作
6、其他操作
6.1- delete(*names)
? -- 根據(jù)刪除redis中的任意數(shù)據(jù)類型
6.2- exists(name)
? -- 檢測redis的name是否存在
6.3- keys(pattern='')*
? -- 根據(jù)模型獲取redis的name
?KEYS * 匹配數(shù)據(jù)庫中所有 key 瞪讼。
?KEYS h?llo 匹配 hello 钧椰, hallo 和 hxllo 等。
?KEYS hllo 匹配 hllo 和 heeeeello 等符欠。
?KEYS h[ae]llo 匹配 hello 和 hallo 嫡霞,但不匹配 hillo*
6.4- expire(name ,time)
? -- 為某個redis的某個name設(shè)置超時時間
6.5- rename(src, dst)
? -- 對redis的name重命名為
6.6- move(name, db)
? -- 將redis的某個值移動到指定的db下
6.7- randomkey()
? -- 隨機獲取一個redis的name(不刪除)
6.8- type(name)
? -- 獲取name對應(yīng)值的類型
6.9- scan(cursor=0, match=None, count=None)
? -- 同字符串操作
6.10- scan_iter(match=None, count=None)
? -- 同字符串操作,用于增量迭代獲取key