2.在python中操作如下:
set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中設置值,默認,不存在則創建,存在則修改
參數:
ex,過期時間(秒)
px,過期時間(毫秒)
nx,如果設置為True,則只有name不存在時,當前set操作才執行
xx,如果設置為True,則只有name存在時,崗前set操作才執行
setnx(name, value)
設置值,只有name不存在時,執行設置操作(添加)
setex(name, value, time)
# 設置值
# 參數:
# time,過期時間(數字秒 或 timedelta對象)
psetex(name, time_ms, value)
# 設置值
# 參數:
# time_ms,過期時間(數字毫秒 或 timedelta對象)
mset(*args, **kwargs)
批量設置值
如:
mset(k1=
'v1'
, k2=
'v2'
)
或
mget({
'k1'
:
'v1'
,
'k2'
:
'v2'
})
get(name)
獲取值
mget(keys, *args)
批量獲取
如:
mget(
'ylr'
,
'wupeiqi'
)
或
r.mget([
'ylr'
,
'wupeiqi'
])
getset(name, value)
設置新值並獲取原來的值
getrange(key, start, end)
# 獲取子序列(根據字節獲取,非字符)
# 參數:
# name,Redis 的 name
# start,起始位置(字節)
# end,結束位置(字節)
# 如: "武沛齊" ,0-3表示 "武"
setrange(name, offset, value)
# 修改字符串內容,從指定字符串索引開始向后替換(新值太長時,則向后添加)
# 參數:
# offset,字符串的索引,字節(一個漢字三個字節)
# value,要設置的值
setbit(name, offset, value)
# 對name對應值的二進制表示的位進行操作
# 參數:
# name,redis的name
# offset,位的索引(將值變換成二進制后再進行索引)
# value,值只能是 1 或 0
# 注:如果在Redis中有一個對應: n1 = "foo",
那么字符串foo的二進制表示為:
01100110
01101111
01101111
所以,如果執行 setbit(
'n1'
,
7
,
1
),則就會將第
7
位設置為
1
,
那么最終二進制則變成
01100111
01101111
01101111
,即:
"goo"
# 擴展,轉換二進制表示:
# source = "武沛齊"
source
=
"foo"
for
i
in
source:
num
=
ord
(i)
print
bin
(num).replace(
'b'
,'')
特別的,如果source是漢字
"武沛齊"
怎么辦?
答:對於utf
-
8
,每一個漢字占
3
個字節,那么
"武沛齊"
則有
9
個字節
對於漢字,
for
循環時候會按照 字節 迭代,那么在迭代時,將每一個字節轉換 十進制數,然后再將十進制數轉換成二進制
11100110
10101101
10100110
11100110
10110010
10011011
11101001
10111101
10010000
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
武 沛 齊
getbit(name, offset)
# 獲取name對應的值的二進制表示中的某位的值 (0或1)
bitcount(key, start=None, end=None)
# 獲取name對應的值的二進制表示中 1 的個數
# 參數:
# key,Redis的name
# start,位起始位置
# end,位結束位置
bitop(operation, dest, *keys)
# 獲取多個值,並將值做位運算,將最后的結果保存至新的name對應的值
# 參數:
# operation,AND(並) 、 OR(或) 、 NOT(非) 、 XOR(異或)
# dest, 新的Redis的name
# *keys,要查找的Redis的name
# 如:
bitop(
"AND"
,
'new_name'
,
'n1'
,
'n2'
,
'n3'
)
# 獲取Redis中n1,n2,n3對應的值,然后講所有的值做位運算(求並集),然后將結果保存 new_name 對應的值中
strlen(name)
# 返回name對應值的字節長度(一個漢字3個字節)
incr(self, name, amount=1)
# 自增 name對應的值,當name不存在時,則創建name=amount,否則,則自增。
# 參數:
# name,Redis的name
# amount,自增數(必須是整數)
# 注:同incrby
incrbyfloat(self, name, amount=1.0)
# 自增 name對應的值,當name不存在時,則創建name=amount,否則,則自增。
# 參數:
# name,Redis的name
# amount,自增數(浮點型)
decr(self, name, amount=1)
# 自減 name對應的值,當name不存在時,則創建name=amount,否則,則自減。
# 參數:
# name,Redis的name
# amount,自減數(整數)
append(key, value)
# 在redis name對應的值后面追加內容
# 參數:
key, redis的name
value, 要追加的字符串
Hash操作,redis中Hash在內存中的存儲格式如下圖:

hset(name, key, value)
123456789# name對應的hash中設置一個鍵值對(不存在,則創建;否則,修改)# 參數:# name,redis的name# key,name對應的hash中的key# value,name對應的hash中的value# 注:# hsetnx(name, key, value),當name對應的hash中不存在當前key時則創建(相當於添加)hmset(name, mapping)
12345678# 在name對應的hash中批量設置鍵值對# 參數:# name,redis的name# mapping,字典,如:{'k1':'v1', 'k2': 'v2'}# 如:# r.hmset('xx', {'k1':'v1', 'k2': 'v2'})hget(name,key)
1# 在name對應的hash中獲取根據key獲取valuehmget(name, keys, *args)
1234567891011# 在name對應的hash中獲取多個key的值# 參數:# name,reids對應的name# keys,要獲取key集合,如:['k1', 'k2', 'k3']# *args,要獲取的key,如:k1,k2,k3# 如:# r.mget('xx', ['k1', 'k2'])# 或# print r.hmget('xx', 'k1', 'k2')hgetall(name)
1獲取name對應hash的所有鍵值hlen(name)
1# 獲取name對應的hash中鍵值對的個數hkeys(name)
1# 獲取name對應的hash中所有的key的值hvals(name)
1# 獲取name對應的hash中所有的value的值hexists(name, key)
1# 檢查name對應的hash是否存在當前傳入的keyhdel(name,*keys)
1# 將name對應的hash中指定key的鍵值對刪除hincrby(name, key, amount=1)
12345# 自增name對應的hash中的指定key的值,不存在則創建key=amount# 參數:# name,redis中的name# key, hash對應的key# amount,自增數(整數)hincrbyfloat(name, key, amount=1.0)
12345678# 自增name對應的hash中的指定key的值,不存在則創建key=amount# 參數:# name,redis中的name# key, hash對應的key# amount,自增數(浮點數)# 自增name對應的hash中的指定key的值,不存在則創建key=amounthscan(name, cursor=0, match=None, count=None)
12345678910111213# 增量式迭代獲取,對於數據大的數據非常有用,hscan可以實現分片的獲取數據,並非一次性將數據全部獲取完,從而放置內存被撐爆# 參數:# name,redis的name# cursor,游標(基於游標分批取獲取數據)# match,匹配指定key,默認None 表示所有的key# count,每次分片最少獲取個數,默認None表示采用Redis的默認分片個數# 如:# 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)# 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)# ...# 直到返回值cursor的值為0時,表示數據已經通過分片獲取完畢hscan_iter(name, match=None, count=None)
123456789# 利用yield封裝hscan創建生成器,實現分批去redis中獲取數據# 參數:# match,匹配指定key,默認None 表示所有的key# count,每次分片最少獲取個數,默認None表示采用Redis的默認分片個數# 如:# for item in r.hscan_iter('xx'):# print item
List操作,redis中的List在在內存中按照一個name對應一個List來存儲。如圖:

lpush(name,values)
12345678# 在name對應的list中添加元素,每個新的元素都添加到列表的最左邊# 如:# r.lpush('oo', 11,22,33)# 保存順序為: 33,22,11# 擴展:# rpush(name, values) 表示從右向左操作lpushx(name,value)
1234# 在name對應的list中添加元素,只有name已經存在時,值添加到列表的最左邊# 更多:# rpushx(name, value) 表示從右向左操作llen(name)
1# name對應的list元素的個數linsert(name, where, refvalue, value))
1234567# 在name對應的列表的某一個值前或后插入一個新值# 參數:# name,redis的name# where,BEFORE或AFTER# refvalue,標桿值,即:在它前后插入數據# value,要插入的數據r.lset(name, index, value)
123456# 對name對應的list中的某一個索引位置重新賦值# 參數:# name,redis的name# index,list的索引位置# value,要設置的值r.lrem(name, value, num)
12345678# 在name對應的list中刪除指定的值# 參數:# name,redis的name# value,要刪除的值# num, num=0,刪除列表中所有的指定值;# num=2,從前到后,刪除2個;# num=-2,從后向前,刪除2個lpop(name)
1234# 在name對應的列表的左側獲取第一個元素並在列表中移除,返回值則是第一個元素# 更多:# rpop(name) 表示從右向左操作lindex(name, index)
1在name對應的列表中根據索引獲取列表元素lrange(name, start, end)
12345# 在name對應的列表分片獲取數據# 參數:# name,redis的name# start,索引的起始位置# end,索引結束位置ltrim(name, start, end)
12345# 在name對應的列表中移除沒有在start-end索引之間的值# 參數:# name,redis的name# start,索引的起始位置# end,索引結束位置rpoplpush(src, dst)
1234# 從一個列表取出最右邊的元素,同時將其添加至另一個列表的最左邊# 參數:# src,要取數據的列表的name# dst,要添加數據的列表的nameblpop(keys, timeout)
12345678# 將多個列表排列,按照從左到右去pop對應列表的元素# 參數:# keys,redis的name的集合# timeout,超時時間,當元素所有列表的元素獲取完之后,阻塞等待列表內有數據的時間(秒), 0 表示永遠阻塞# 更多:# r.brpop(keys, timeout),從右向左獲取數據brpoplpush(src, dst, timeout=0)
123456# 從一個列表的右側移除一個元素並將其添加到另一個列表的左側# 參數:# src,取出並要移除元素的列表對應的name# dst,要插入元素的列表對應的name# timeout,當src對應的列表中沒有數據時,阻塞等待其有數據的超時時間(秒),0 表示永遠阻塞自定義增量迭代
123456789101112131415161718# 由於redis類庫中沒有提供對列表元素的增量迭代,如果想要循環name對應的列表的所有元素,那么就需要:# 1、獲取name對應的所有列表# 2、循環列表# 但是,如果列表非常大,那么就有可能在第一步時就將程序的內容撐爆,所有有必要自定義一個增量迭代的功能:deflist_iter(name):"""自定義redis列表增量迭代:param name: redis中的name,即:迭代name對應的列表:return: yield 返回 列表元素"""list_count=r.llen(name)forindexinxrange(list_count):yieldr.lindex(name, index)# 使用foriteminlist_iter('pp'):itemSet操作,Set集合就是不允許重復的列表
sadd(name,values)
1# name對應的集合中添加元素scard(name)
1獲取name對應的集合中元素個數sdiff(keys, *args)
1在第一個name對應的集合中且不在其他name對應的集合的元素集合sdiffstore(dest, keys, *args)
1# 獲取第一個name對應的集合中且不在其他name對應的集合,再將其新加入到dest對應的集合中sinter(keys, *args)
1# 獲取多一個name對應集合的並集sinterstore(dest, keys, *args)
1# 獲取多一個name對應集合的並集,再講其加入到dest對應的集合中sismember(name, value)
1# 檢查value是否是name對應的集合的成員smembers(name)
1# 獲取name對應的集合的所有成員smove(src, dst, value)
1# 將某個成員從一個集合中移動到另外一個集合spop(name)
1# 從集合的右側(尾部)移除一個成員,並將其返回srandmember(name, numbers)
1# 從name對應的集合中隨機獲取 numbers 個元素srem(name, values)
1# 在name對應的集合中刪除某些值sunion(keys, *args)
1# 獲取多一個name對應的集合的並集sunionstore(dest,keys, *args)
1# 獲取多一個name對應的集合的並集,並將結果保存到dest對應的集合中sscan(name, cursor=0, match=None, count=None)
sscan_iter(name, match=None, count=None)
1# 同字符串的操作,用於增量迭代分批獲取元素,避免內存消耗太大
有序集合,在集合的基礎上,為每元素排序;元素的排序需要根據另外一個值來進行比較,所以,對於有序集合,每一個元素有兩個值,即:值和分數,分數專門用來做排序。
zadd(name, *args, **kwargs)
12345# 在name對應的有序集合中添加元素# 如:# zadd('zz', 'n1', 1, 'n2', 2)# 或# zadd('zz', n1=11, n2=22)zcard(name)
1# 獲取name對應的有序集合元素的數量zcount(name, min, max)
1# 獲取name對應的有序集合中分數 在 [min,max] 之間的個數zincrby(name, value, amount)
1# 自增name對應的有序集合的 name 對應的分數r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)
123456789101112131415161718# 按照索引范圍獲取name對應的有序集合的元素# 參數:# name,redis的name# start,有序集合索引起始位置(非分數)# end,有序集合索引結束位置(非分數)# desc,排序規則,默認按照分數從小到大排序# withscores,是否獲取元素的分數,默認只獲取元素的值# score_cast_func,對分數進行數據轉換的函數# 更多:# 從大到小排序# zrevrange(name, start, end, withscores=False, score_cast_func=float)# 按照分數范圍獲取name對應的有序集合的元素# 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)zrank(name, value)
1234# 獲取某個值在 name對應的有序集合中的排行(從 0 開始)# 更多:# zrevrank(name, value),從大到小排序zrangebylex(name, min, max, start=None, num=None)
1234567891011121314151617# 當有序集合的所有成員都具有相同的分值時,有序集合的元素會根據成員的 值 (lexicographical ordering)來進行排序,而這個命令則可以返回給定的有序集合鍵 key 中, 元素的值介於 min 和 max 之間的成員# 對集合中的每個成員進行逐個字節的對比(byte-by-byte compare), 並按照從低到高的順序, 返回排序后的集合成員。 如果兩個字符串有一部分內容是相同的話, 那么命令會認為較長的字符串比較短的字符串要大# 參數:# name,redis的name# min,左區間(值)。 + 表示正無限; - 表示負無限; ( 表示開區間; [ 則表示閉區間# min,右區間(值)# start,對結果進行分片處理,索引位置# num,對結果進行分片處理,索引后面的num個元素# 如:# ZADD myzset 0 aa 0 ba 0 ca 0 da 0 ea 0 fa 0 ga# r.zrangebylex('myzset', "-", "[ca") 結果為:['aa', 'ba', 'ca']# 更多:# 從大到小排序# zrevrangebylex(name, max, min, start=None, num=None)zrem(name, values)
123# 刪除name對應的有序集合中值是values的成員# 如:zrem('zz', ['s1', 's2'])zremrangebyrank(name, min, max)
1# 根據排行范圍刪除zremrangebyscore(name, min, max)
1# 根據分數范圍刪除zremrangebylex(name, min, max)
1# 根據值返回刪除zscore(name, value)
1# 獲取name對應有序集合中 value 對應的分數zinterstore(dest, keys, aggregate=None)
12# 獲取兩個有序集合的交集,如果遇到相同值不同分數,則按照aggregate進行操作# aggregate的值為: SUM MIN MAXzunionstore(dest, keys, aggregate=None)
12# 獲取兩個有序集合的並集,如果遇到相同值不同分數,則按照aggregate進行操作# aggregate的值為: SUM MIN MAXzscan(name, cursor=0, match=None, count=None, score_cast_func=float)
zscan_iter(name, match=None, count=None,score_cast_func=float)
1# 同字符串相似,相較於字符串新增score_cast_func,用來對分數進行操作
其他常用操作
delete(*names)
1# 根據刪除redis中的任意數據類型exists(name)
1# 檢測redis的name是否存在keys(pattern='*')
1234567# 根據模型獲取redis的name# 更多:# KEYS * 匹配數據庫中所有 key 。# KEYS h?llo 匹配 hello , hallo 和 hxllo 等。# KEYS h*llo 匹配 hllo 和 heeeeello 等。# KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hilloexpire(name ,time)
1# 為某個redis的某個name設置超時時間rename(src, dst)
1# 對redis的name重命名為move(name, db))
1# 將redis的某個值移動到指定的db下randomkey()
1# 隨機獲取一個redis的name(不刪除)type(name)
1# 獲取name對應值的類型scan(cursor=0, match=None, count=None)
scan_iter(match=None, count=None)
1# 同字符串操作,用於增量迭代獲取key
4、管道
redis-py默認在執行每次請求都會創建(連接池申請連接)和斷開(歸還連接池)一次連接操作,如果想要在一次請求中指定多個命令,則可以使用pipline實現一次請求指定多個命令,並且默認情況下一次pipline 是原子性操作。
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import
redis
pool
=
redis.ConnectionPool(host
=
'10.211.55.4'
, port
=
6379
)
r
=
redis.Redis(connection_pool
=
pool)
# pipe = r.pipeline(transaction=False)
pipe
=
r.pipeline(transaction
=
True
)#True為打開同時請求多個指令的功能
pipe.
set
(
'name'
,
'alex'
)
pipe.
set
(
'role'
,
'sb'
)
pipe.execute()
|
