redis 介绍与操作
參考連接:
https://www.cnblogs.com/wupeiqi/articles/5132791.html
redis 是什么?
redis是一個軟件,幫助開發(fā)者對一臺機(jī)器的內(nèi)存進(jìn)行操作.
能干嗎?
用于操作內(nèi)存的軟件。
--- 可以做持久化
AOF :則是將Redis執(zhí)行的每次寫命令記錄到單獨的日志文件中當(dāng)Redis重啟時再次執(zhí)行AOF文件中的命令來恢復(fù)數(shù)據(jù)。
ROB :RDB持久化是將進(jìn)程數(shù)據(jù)寫入文件。
-- 相當(dāng)于大字典
-- 單進(jìn)程單線程
數(shù)據(jù)類型
1.字符串
k1:“ 這是個憂傷的故事 “
2.列表
k2:[1,2,3,4,5,6,7,8]
3.集合
k3:{1,2,3,4,5,6}
4.字典
k4:{ name:123, age:666 }
5.有序集合
k5:{('alex',60),('eva-j'80),('rt',70)}
操作
redis-py提供兩個類Redis和StrictRedis用于實現(xiàn)Redis的命令,StrictRedis用于實現(xiàn)大部分官方的命令,
并使用官方的語法和命令,Redis是StrictRedis的子類,用于向后兼容舊版本的redis-py。
普通redis
import redis
# 1.創(chuàng)建一個redis連接
r = redis.Redis(host='127.0.0.1',port=6379)
# 2.只能設(shè)置一個值,放入redis
r.set('foo','Bar')
# 3.去redis中取值
print(r.get('foo'))
連接池redis
為什么要用連接池?
redis-py 使用connection pool來管理對一個redis server的所有連接,避免每次建立、釋放連接的開銷。默認(rèn),每個Redis實例都會維護(hù)一個自己的連接池。
可以直接建立一個連接池,然后作為參數(shù)Redis,這樣就可以實現(xiàn)多個Redis實例共享一個連接池。
# 連接池
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.Redis(connection_pool=pool)
# 3.放入值到redis
r.set('foo','Bar')
# 4.取值
print(r.get('foo'))
字符串的操作(String)
String操作,redis中的String在在內(nèi)存中按照一個name對應(yīng)一個value來存儲。如圖:
設(shè)置值
1.set
set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中設(shè)置值,默認(rèn),不存在則創(chuàng)建,存在則修改
參數(shù):
ex,過期時間(秒)
px,過期時間(毫秒)
nx,如果設(shè)置為True,則只有name不存在時,當(dāng)前set操作才執(zhí)行
xx,如果設(shè)置為True,則只有name存在時,崗前set操作才執(zhí)行
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.Redis(connection_pool=pool)
# 3.放入值到redism,3秒后過期
r.set('foo','Bar',ex=3)
# 4.取值
print(r.get('foo'))
2.setnx
setnx(name, value)
只有name不存在時,執(zhí)行設(shè)置操作(添加)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.Redis(connection_pool=pool)
# 3.,只有name不存在時,執(zhí)行設(shè)置操作(添加)
r.setnx('foo','Bar1')
# 4.取值
print(r.get('foo'))
3.setex
setex(name,time, value, )
# name, 設(shè)置值.
# time,過期時間(數(shù)字秒 或 timedelta對象).
# value, 參數(shù).
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.Redis(connection_pool=pool)
# 3.設(shè)置k 時間 v
r.setex('foo',5,5454)
# 4.取值
print(r.get('foo'))
4.psetex
psetex(name, time_ms, value)
# name : 設(shè)置值
# time_ms : 參數(shù):
# time_ms : 過期時間(數(shù)字毫秒 或 timedelta對象)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.Redis(connection_pool=pool)
# 3.設(shè)置k 時間 v 豪秒
r.psetex('foo',5000,5454)
# 4.取值
print(r.get('foo'))
5.mset
mset(*args, **kwargs)
批量設(shè)置值
r.mset({'k1': 'v1', 'k2': 'v2'})
print(r.mget("k1", "k2")) # 一次取出多個鍵對應(yīng)的值
print(r.mget("k1"))
r.mset({'k1': 'v1', 'k2': 'v2'})
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3.批量設(shè)置值
r.mset({'k1':'riven','k2':'mark'})
# 4.獲取多個值
print(r.mget('k1','k2'))
get 獲取值
1.mget
mget(keys, *args)
批量獲取值
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3.批量設(shè)置值
r.mget({'k1':'riven','k2':'mark'})
# 4.獲取多個值
print(r.mget('k1','k2'))
2.getset
getset(name, value)
設(shè)置新值并獲取原來的值
3. getrange
getrange(key, start, end)
# 獲取子序列(根據(jù)字節(jié)獲取,非字符)
# 參數(shù):
# name,Redis 的 name
# start,起始位置(字節(jié))
# end,結(jié)束位置(字節(jié))
# 如: "武沛齊" ,0-3表示 "武" , 相當(dāng)于切片
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3.批量設(shè)置值
r.mget({'k1':'riven','k2':'mark'})
# 4.切片取值
print(r.getrange('k1',1,2))
修改字符串
1.setrange
setrange(name, offset, value)
# 修改字符串內(nèi)容,從指定字符串索引開始向后替換(新值太長時,則向后添加)
# 參數(shù):
# offse : 字符串的索引,字節(jié)(一個漢字三個字節(jié))。
# value : 要設(shè)置的值。
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3.批量設(shè)置值
r.mget({'k1':'riven','k2':'mark'})
# 4.索引指定位置 修改替換成新值
r.setrange('k1',5,'666666666666666666666666')
# 5.獲取值
print(r.mget('k1'))
2.setbit
setbit(name, offset, value)
# 對name對應(yīng)值的二進(jìn)制表示的位進(jìn)行操作
# 參數(shù):
# name : redis的name 。
# offset : 位的索引(將值變換成二進(jìn)制后再進(jìn)行索引)。
# value : 值只能是 1 或 0 。
# 注:如果在Redis中有一個對應(yīng): n1 = "foo",
那么字符串foo的二進(jìn)制表示為:01100110 01101111 01101111
所以,如果執(zhí)行 setbit('n1', 7, 1),則就會將第7位設(shè)置為1,
那么最終二進(jìn)制則變成 01100111 01101111 01101111,即:"goo"
# 擴(kuò)展,轉(zhuǎn)換二進(jìn)制表示:
# source = "武沛齊"
source = "foo"
for i in source:
num = ord(i)
print bin(num).replace('b','')
特別的,如果source是漢字 "武沛齊"怎么辦?
答:對于utf-8,每一個漢字占 3 個字節(jié),那么 "武沛齊" 則有 9個字節(jié)
對于漢字,for循環(huán)時候會按照 字節(jié) 迭代,那么在迭代時,將每一個字節(jié)轉(zhuǎn)換 十進(jìn)制數(shù),然后再將十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制
11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000
查(bit)
1.getbit
getbit(name, offset)
# 獲取name對應(yīng)的值的二進(jìn)制表示中的某位的值 (0或1)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3.批量設(shè)置值
r.mget({'k1':'riven','k2':'mark'})
# 4.獲取2進(jìn)制中索引的0或者1
print(r.getbit('k1',8))
2.bitcount
bitcount(key, start=None, end=None)
# 獲取name對應(yīng)的值的二進(jìn)制表示中 1 的個數(shù)
# 參數(shù):
# key,Redis的name
# start,位起始位置
# end,位結(jié)束位置
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3.批量設(shè)置值
r.mget({'k1':'riven','k2':'mark'})
# 4.獲取對應(yīng)的值的二進(jìn)制表示中 1 的個數(shù)
print(r.bitcount('k1',1,2))
3.bitop
bitop(operation, dest, *keys)
# 獲取多個值,并將值做位運算,將最后的結(jié)果保存至新的name對應(yīng)的值
# 參數(shù):
# operation,AND(并) 、 OR(或) 、 NOT(非) 、 XOR(異或)
# dest, 新的Redis的name
# *keys,要查找的Redis的name
# 如:
bitop("AND",'new_name','n1','n2','n3')
# 獲取Redis中n1,n2,n3對應(yīng)的值,然后講所有的值做位運算(求并集),然后將結(jié)果保存 new_name 對應(yīng)的值中
4.strlen
strlen(name)
# 返回name對應(yīng)值的字節(jié)長度(一個漢字3個字節(jié))
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3.批量設(shè)置值
r.mget({'k1':'riven','k2':'mark'})
# 4.# 返回name對應(yīng)值的字節(jié)長度(一個漢字3個字節(jié))
print(r.strlen('k1'))
5.incr
incr(self, name, amount=1)
# 自增 name對應(yīng)的值,當(dāng)name不存在時,則創(chuàng)建name=amount,否則,則自增。
# 參數(shù):
# name,Redis的name
# amount,自增數(shù)(必須是整數(shù))
# 注:同incrby
6.incrbyfloat
incrbyfloat(self, name, amount=1.0)
|
1 2 3 4 5 |
|
7.decr
decr(self, name, amount=1)
|
1 2 3 4 5 |
|
8.append
append(key, value)
|
1 2 3 4 5 |
|
Hash(字典)操作
設(shè)置值
1.hset
hset(name, key, value)
# name對應(yīng)的hash中設(shè)置一個鍵值對(不存在,則創(chuàng)建;否則,修改)
# 參數(shù):
# name :redis的name
# key :name對應(yīng)的hash中的key
# value:name對應(yīng)的hash中的value
# 注:
# hsetnx(name, key, value),當(dāng)name對應(yīng)的hash中不存在當(dāng)前key時則創(chuàng)建(相當(dāng)于添加)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3.# name對應(yīng)的hash中設(shè)置一個鍵值對(不存在,則創(chuàng)建;否則,修改) 單個
r.hset('xx', 'name','riven')
# 4. 批量獲取值
print(r.hgetall('xx'))
2.hmset
hmset(name, mapping)
# 在name對應(yīng)的hash中批量設(shè)置鍵值對
# 參數(shù):
# name,redis的name
# mapping,字典,如:{'k1':'v1', 'k2': 'v2'}
# 如:
# r.hmset('xx', {'k1':'v1', 'k2': 'v2'})
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3. # 在name對應(yīng)的hash中批量設(shè)置鍵值對
r.hmset('xx', {'name':'riven','age':'18'})
# 4. 批量獲取值
print(r.hgetall('xx'))
按位置獲取值(數(shù)據(jù)量大的時候)
1.hscan
hscan(name, cursor=0, match=None, count=None)
# 增量式迭代獲取,對于數(shù)據(jù)大的數(shù)據(jù)非常有用,hscan可以實現(xiàn)分片的獲取數(shù)據(jù),并非一次性將數(shù)據(jù)全部獲取完,從而放置內(nèi)存被撐爆
# 參數(shù):
# name,redis的name
# cursor,游標(biāo)(基于游標(biāo)分批取獲取數(shù)據(jù))
# match,匹配指定key,默認(rèn)None 表示所有的key
# count,每次分片最少獲取個數(shù),默認(rèn)None表示采用Redis的默認(rèn)分片個數(shù)
# 如:
# 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)
# 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)
# ...
# 直到返回值cursor的值為0時,表示數(shù)據(jù)已經(jīng)通過分片獲取完畢
ps:field數(shù)量應(yīng)該大于某個值時,分頁命令才會生效
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3. # 在name對應(yīng)的hash中批量設(shè)置鍵值對
r.hmset('xx', {
'name':'riven','age':'18.00','hogby':'gril','name2':'mark','age2':'20','hogby2':'littlgril',
'name11':'riven','age11':'18.00','hogby11':'gril','name211':'mark','age211':'20','hogby211':'littlgril',
'name222':'riven','age222':'18.00','hogby222':'gril','name2222':'mark','age2222':'20','hogby2222':'littlgril',
'name333':'riven','age333':'18.00','hogby333':'gril','name2333':'mark','age2333':'20','hogby2333':'littlgril',
})
# 增量式迭代獲取,對于數(shù)據(jù)大的數(shù)據(jù)非常有用,hscan可以實現(xiàn)分片的獲取數(shù)據(jù),并非一次性將數(shù)據(jù)全部獲取完,從而放置內(nèi)存被撐爆
cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=10)
print(r.hscan('xx'))
View Code
2.hscan_iter
hscan_iter(name, match=None, count=None)
# 利用yield封裝hscan創(chuàng)建生成器,實現(xiàn)分批去redis中獲取數(shù)據(jù)
# 參數(shù):
# match : 匹配指定key,默認(rèn)None 表示所有的key
# count : 每次分片最少獲取個數(shù),默認(rèn)None表示采用Redis的默認(rèn)分片個數(shù)
# 如:
# for item in r.hscan_iter('xx'):
# print item
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # 在name對應(yīng)的hash中批量設(shè)置鍵值對
r.hmset('xx', {
'name': 'riven', 'age': '18.00', 'hogby': 'gril', 'name2': 'mark', 'age2': '20', 'hogby2': 'littlgril',
'name11': 'riven', 'age11': '18.00', 'hogby11': 'gril', 'name211': 'mark', 'age211': '20', 'hogby211': 'littlgril',
'name222': 'riven', 'age222': '18.00', 'hogby222': 'gril', 'name2222': 'mark', 'age2222': '20',
'hogby2222': 'littlgril',
'name333': 'riven', 'age333': '18.00', 'hogby333': 'gril', 'name2333': 'mark', 'age2333': '20',
'hogby2333': 'littlgril',
})
# # 利用yield封裝hscan創(chuàng)建生成器,實現(xiàn)分批去redis中獲取數(shù)據(jù)
ret = r.hscan_iter('xx',match=None,count=10)
#獲取數(shù)據(jù)
for item in ret:
print(item)
View Code
獲取值
1.hget
hget(name,key)
# 在name對應(yīng)的hash中獲取根據(jù)key獲取value
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3. # 在name對應(yīng)的hash中批量設(shè)置鍵值對
r.hmset('xx', {'name':'riven','age':'18'})
# 4. 指定獲取字典某個key值
print(r.hget('xx','name'))
2.hmget
hmget(name, keys, *args)
# 在name對應(yīng)的hash中獲取多個key的值
# 參數(shù):
# name : reids對應(yīng)的name
# keys : 要獲取key集合,如:['k1', 'k2', 'k3']
# *args : 要獲取的key,如:k1,k2,k3
# 如:
# r.mget('xx', ['k1', 'k2'])
# 或
# print r.hmget('xx', 'k1', 'k2')
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3. # 在name對應(yīng)的hash中批量設(shè)置鍵值對
r.hmset('xx', {'name':'riven','age':'18','hogby':'gril'})
# 4. 指定獲取多個字典某個key值
print(r.hmget('xx',['name','hogby']))
3.hgetall
hgetall(name)
獲取name對應(yīng)hash的所有鍵值。
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3. # 在name對應(yīng)的hash中批量設(shè)置鍵值對
r.hmset('xx', {'name':'riven','age':'18','hogby':'gril'})
# 4. 指定獲取xx字典中所有的key值
print(r.hgetall('xx'))
4.hlen
hlen(name)
# 獲取name對應(yīng)的hash中鍵值對的個數(shù)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3. # 在name對應(yīng)的hash中批量設(shè)置鍵值對
r.hmset('xx', {'name':'riven','age':'18','hogby':'gril'})
# 4. 指定獲取xx字典中所有鍵值對的個數(shù)
print(r.hlen('xx'))
5.hkeys
hkeys(name)
# 獲取name對應(yīng)的hash中所有的key的值
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3. # 在name對應(yīng)的hash中批量設(shè)置鍵值對
r.hmset('xx', {'name':'riven','age':'18','hogby':'gril'})
# 4. 單獨獲取 xx 中的key值
print(r.hkeys('xx'))
6.hvals
hvals(name)
# 獲取name對應(yīng)的hash中所有的value的值
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3. # 在name對應(yīng)的hash中批量設(shè)置鍵值對
r.hmset('xx', {'name':'riven','age':'18','hogby':'gril'})
# 4. 單獨獲取 xx 中的key值
print(r.hvals('xx'))
判斷值
1.hexists
hexists(name, key)
# 檢查name對應(yīng)的hash是否存在當(dāng)前傳入的key
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3. # 在name對應(yīng)的hash中批量設(shè)置鍵值對
r.hmset('xx', {'name':'riven','age':'18','hogby':'gril'})
# 4. 檢查 xx hash中是否有value age
print(r.hexists('xx','age'))
刪除字典
1.hdel
hdel(name,*keys)
# 將name對應(yīng)的hash中指定key的鍵值對刪除
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3. # 在name對應(yīng)的hash中批量設(shè)置鍵值對
r.hmset('xx', {'name':'riven','age':'18','hogby':'gril'})
# 4. 將xx對應(yīng)的hash中指定age的鍵值對刪除
r.hdel('xx','age')
# 5. 檢查 xx hash中是否有value age
print(r.hgetall('xx'))
自增
1.hincrby
hincrby(name, key, amount=1)
# 自增name對應(yīng)的hash中的指定key的值,不存在則創(chuàng)建key=amount。
# 參數(shù):
# name :redis中的name。
# key : hash對應(yīng)的key。
# amount :自增數(shù)(整數(shù))。
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3. # 在name對應(yīng)的hash中批量設(shè)置鍵值對
r.hmset('xx', {'name':'riven','age':'18','hogby':'gril'})
# 4. 自增xx對應(yīng)的hash中的指定age的值(只能是整數(shù)),不存在則創(chuàng)建key=amount
r.hincrby('xx','age',amount=10)
# 5. 檢查 xx hash中是否有value age
print(r.hgetall('xx'))
2.hincrbyfloat
hincrbyfloat(name, key, amount=1.0)
# 自增name對應(yīng)的hash中的指定key的值,不存在則創(chuàng)建key=amount
# 參數(shù):
# name :redis中的name
# key : hash對應(yīng)的key
# amount :自增數(shù)(浮點數(shù))
# 自增name對應(yīng)的hash中的指定key的值,不存在則創(chuàng)建key=amount
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r=redis.StrictRedis(connection_pool=pool)
# 3. # 在name對應(yīng)的hash中批量設(shè)置鍵值對
r.hmset('xx', {'name':'riven','age':'18.00','hogby':'gril'})
# 4. 自增xx對應(yīng)的hash中的指定age的值(浮點數(shù)),不存在則創(chuàng)建key=amount
r.hincrbyfloat('xx','age',amount=10.15)
# 5. 檢查 xx hash中是否有value age
print(r.hgetall('xx'))
List(列表操作)
List操作,redis中的List在在內(nèi)存中按照一個name對應(yīng)一個List來存儲。如圖:
增加值
1.lpush
lpush(name,values)
# 在name對應(yīng)的list中添加元素,每個新的元素都添加到列表的最左邊
# 如:
# r.lpush('oo', 11,22,33)
# 保存順序為: 33,22,11
# 擴(kuò)展:
# rpush(name, values) 表示從右向左操作
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. 相當(dāng)于創(chuàng)建了一個 k1:['riven','riven','riven'], 從左邊插入一條數(shù)據(jù)
r.lpush('k1', 'riven1')
# 4.切片取數(shù)據(jù)
result = r.lrange('k1', 0, 100)
print(result)
2.lpushx
lpushx(name,value)
# 在name對應(yīng)的list中添加元素,只有name已經(jīng)存在時,值添加到列表的最左邊
# 更多:
# rpushx(name, value) 表示從右向左操作
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. 在name對應(yīng)的list中添加元素,只有name已經(jīng)存在時,值添加到列表的最左邊
r.lpushx('k1', 'riven11')
# 4.切片取數(shù)據(jù)
result = r.lrange('k1', 0, 100)
print(result)
3.linsert
linsert(name, where, refvalue, value))
# 在name對應(yīng)的列表的某一個值前或后插入一個新值。
# 參數(shù):
# name :redis的name。
# where :BEFORE或AFTER。
# refvalue :標(biāo)桿值,即:在它前后插入數(shù)據(jù)。
# value :要插入的數(shù)據(jù)。
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # # 在name對應(yīng)的列表的某一個值前或后插入一個新值
r.linsert('k1',where='before',refvalue='riven11',value='888')
# 4.切片取數(shù)據(jù)
result = r.lrange('k1', 0, 100)
print(result)
4.lset
r.lset(name, index, value)
# 對name對應(yīng)的list中的某一個索引位置重新賦值
# 參數(shù):
# name,redis的name
# index,list的索引位置
# value,要設(shè)置的值
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # 對name對應(yīng)的list中的某一個索引位置重新賦值
r.lset('k1', 0, value='999')
# 4.切片取數(shù)據(jù)
result = r.lrange('k1', 0, 100)
print(result)
5.rpoplpush
rpoplpush(src, dst)
# 從一個列表取出最右邊的元素,同時將其添加至另一個列表的最左邊
# 參數(shù):
# src,要取數(shù)據(jù)的列表的name
# dst,要添加數(shù)據(jù)的列表的name
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 從一個列表取出最右邊的元素,同時將其添加至另一個列表的最左邊
r.rpoplpush('k1','k2')
# 3.# 在name對應(yīng)的列表分片獲取數(shù)據(jù)
result = r.lrange('k1', 0,100)
result1 = r.lrange('k2', 0,100)
print(result)
print(result1)
6.brpoplpush
brpoplpush(src, dst, timeout=0)
# 從一個列表的右側(cè)移除一個元素并將其添加到另一個列表的左側(cè)
# 參數(shù):
# src, 取出并要移除元素的列表對應(yīng)的name。
# dst, 要插入元素的列表對應(yīng)的name。
# timeout, 當(dāng)src對應(yīng)的列表中沒有數(shù)據(jù)時,阻塞等待其有數(shù)據(jù)的超時時間(秒),0 表示永遠(yuǎn)阻塞。
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 從一個列表的右側(cè)移除一個元素并將其添加到另一個列表的左側(cè)
# timeout,當(dāng)src對應(yīng)的列表中沒有數(shù)據(jù)時,阻塞等待其有數(shù)據(jù)的超時時間(秒),0 表示永遠(yuǎn)阻塞
r.brpoplpush('k1','k2',timeout=50)
# 3.# 在name對應(yīng)的列表分片獲取數(shù)據(jù)
result = r.lrange('k1', 0,100)
result1 = r.lrange('k2', 0,100)
print(result)
print(result1)
刪除
1.lrem
r.lrem(name, value, count)
# 在name對應(yīng)的list中刪除指定的值
# 參數(shù):
# name,redis的name
# value,要刪除的值
# count, count=0,刪除列表中所有的指定值;
# count=2,從前到后,刪除2個;
# count=-2,從后向前,刪除2個
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. 在name對應(yīng)的list中刪除指定的相同的值
r.lrem('k1', value='riven1',count=2)
# 4.切片取數(shù)據(jù)
result = r.lrange('k1', 0, 100)
print(result)
2.lpop
lpop(name)
# 在name對應(yīng)的列表的左側(cè)獲取第一個元素并在列表中移除,返回值則是第一個元素
# 更多:
# rpop(name) 表示從右向左操作
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. 在name對應(yīng)的列表的左側(cè)獲取第一個元素并在列表中移除,返回值則是第一個元素
r.lpop('k1',)
# 4.切片取數(shù)據(jù)
result = r.lrange('k1', 0, 100)
print(result)
3.ltrim
ltrim(name, start, end)
# 在name對應(yīng)的列表中移除沒有在start-end索引之間的值
# 參數(shù):
# name,redis的name
# start,索引的起始位置
# end,索引結(jié)束位置
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3.# 在name對應(yīng)的列表中移除沒有在start-end索引之間的值
result = r.ltrim('k1', 1,3)
print(result)
4.blpop
blpop(keys, timeout)
# 將多個列表排列,按照從左到右去pop對應(yīng)列表的元素
# 參數(shù):
# keys,redis的name的集合
# timeout,超時時間,當(dāng)元素所有列表的元素獲取完之后,阻塞等待列表內(nèi)有數(shù)據(jù)的時間(秒), 0 表示永遠(yuǎn)阻塞
# 更多:
# r.brpop(keys, timeout),從右向左獲取數(shù)據(jù)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3.將多個列表排列,按照從左到右去pop對應(yīng)列表的元素
# timeout,當(dāng)src對應(yīng)的列表中沒有數(shù)據(jù)時,阻塞等待其有數(shù)據(jù)的超時時間(秒),0 表示永遠(yuǎn)阻塞
r.blpop('k1', timeout=10)
# 4.# 在name對應(yīng)的列表分片獲取數(shù)據(jù)
result = r.lrange('k1', 0, 100)
獲取值
1.lindex
lindex(name, index)
#在name對應(yīng)的列表中根據(jù)索引獲取列表元素
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3.在name對應(yīng)的列表中根據(jù)索引獲取列表元素
result = r.lindex('k1', 4,)
print(result)
2.lrange
lrange(name, start, end)
# 在name對應(yīng)的列表分片獲取數(shù)據(jù)
# 參數(shù):
# name,redis的name
# start,索引的起始位置
# end,索引結(jié)束位置
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3.# 在name對應(yīng)的列表分片獲取數(shù)據(jù)
result = r.lrange('k1', 0,4)
print(result)
3.自定義增量迭代
# 由于redis類庫中沒有提供對列表元素的增量迭代,
如果想要循環(huán)name對應(yīng)的列表的所有元素,那么就需要: # 1、獲取name對應(yīng)的所有列表 # 2、循環(huán)列表 # 但是,如果列表非常大,那么就有可能在第一步時就將程序的內(nèi)容撐爆,所以有必要自定義一個增量迭代的功能:
def list_iter(name):
"""
自定義redis列表增量迭代
:param name: redis中的name,即:迭代name對應(yīng)的列表
:return: yield 返回 列表元素
"""
# 我計算出 當(dāng)前的k1 中值得數(shù)量
list_count = r.llen(name)
# 我range 循環(huán)的數(shù)量
for index in range(list_count):
# 按照索引值 一個一個獲取值
yield r.lindex(name, index)
# 使用
for item in list_iter('k1'):
# 一個一個取值
print(item)
統(tǒng)計個數(shù)
1.llen
lpushx(name,value)
# name對應(yīng)的list元素的個數(shù)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # name對應(yīng)的list元素的個數(shù)
print(r.llen('k1', ))
# 4.切片取數(shù)據(jù)
result = r.lrange('k1', 0, 100)
print(result)
Set操作
Set集合就是不允許重復(fù)的列表
添加
1.sadd
sadd(name,values)
# name對應(yīng)的集合中添加元素
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # name對應(yīng)的集合中添加元素
r.sadd('k5','riven3')
# 4.# 獲取name對應(yīng)的集合的所有成員
result = r.smembers('k5',)
print(result)
查詢個數(shù)
1.scard
scard(name)
獲取name對應(yīng)的集合中元素個數(shù)。
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # name對應(yīng)的集合中添加元素
r.sadd('k5','riven3')
# 4.# 獲取name對應(yīng)的集合中元素個數(shù)
result = r.scard('k5',)
print(result)
2.sdiff
sdiff(keys, *args)
在第一個name對應(yīng)的集合中且不在其他name對應(yīng)的集合的元素集合(我要去第一個name中 與第二個name不一樣的元素集合)
使用交互方式來合并文件
返回兩個集合中第一個的差集
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # name對應(yīng)的集合中添加元素
r.sadd('k5', '1')
r.sadd('k6', '2')
# 4.在第一個name對應(yīng)的集合中且不在其他name對應(yīng)的集合的元素集合(我要去第一個name中 與第二個name不一樣的元素集合)
print(r.sdiff('k5','k6'))
# 5.# 獲取name對應(yīng)的集合中元素個數(shù)
result = r.sinter('k5', )
print(result)
result1 = r.sinter('k6', )
print(result1)
3.sdiffstore
sdiffstore(dest, keys, *args)
# 獲取第一個name對應(yīng)的集合中且不在其他name對應(yīng)的集合,再將其新加入到dest對應(yīng)的集合中
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # name對應(yīng)的集合中添加元素
r.sadd('k5', '1')
r.sadd('k6', '2')
# 4. 獲取第一個name對應(yīng)的集合中且不在其他name對應(yīng)的集合,再將其新加入到dest對應(yīng)的集合中
# 獲取第一個name k5和k6的差集 然后加入一個新建的k2 中
r.sdiffstore('k2','k5','k6')
# 5.獲取name對應(yīng)的集合中元素個數(shù)
result = r.sinter('k5', )
print(result,111)
result1 = r.sinter('k6', )
print(result1,222)
result1 = r.sinter('k2', )
print(result1,333)
4.sinter
sinter(keys, *args)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # name對應(yīng)的集合中添加元素
r.sadd('k5', '1')
r.sadd('k6', '2')
# 4. # 獲取多個name對應(yīng)集合的并集(也就是 相同的元素)
print(r.sinter('k5','k6'))
# # 5.獲取name對應(yīng)的集合中元素個數(shù)
result = r.sinter('k5', )
print(result,111)
result1 = r.sinter('k6', )
print(result1,222)
5.sinterstore
sinterstore(dest, keys, *args)
# 獲取多一個name對應(yīng)集合的并集,再講其加入到dest對應(yīng)的集合中
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # name對應(yīng)的集合中添加元素
r.sadd('k5', '1')
r.sadd('k6', '2')
# 4. # 獲取多name對應(yīng)集合的并集,再講其加入到dest對應(yīng)的集合中
r.sinterstore('k2','k5','k6')
# 5.獲取name對應(yīng)的集合中元素個數(shù)
result = r.sinter('k5', )
print(result,111)
result1 = r.sinter('k6', )
print(result1,222)
result1 = r.sinter('k2', )
print(result1,333)
判斷
1.sismember
sismember(name, value)
# 檢查value是否是name對應(yīng)的集合的成員
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # name對應(yīng)的集合中添加元素
r.sadd('k6', '2')
# 4. # 檢查value是否是name對應(yīng)的集合的成員
print(r.sismember('k6','riven1'))
# 5.獲取name對應(yīng)的集合中元素個數(shù)
result1 = r.sinter('k6', )
print(result1,222)
獲取值
1.smembers
smembers(name)
# 獲取name對應(yīng)的集合的所有成員
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # name對應(yīng)的集合中添加元素
r.sadd('k6', '2')
# 4.獲取name對應(yīng)的集合中元素個數(shù)
result1 = r.sinter('k6', )
print(result1,222)
2.srandmember
srandmember(name, numbers)
# 從name對應(yīng)的集合中隨機(jī)獲取 numbers 個元素
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # name對應(yīng)的集合中添加元素
r.sadd('k6', 'riven55')
# 4.# 從name對應(yīng)的集合中隨機(jī)獲取 numbers 個元素
result1 = r.srandmember('k6', 2)
print(result1, 222)
3.sunion
sunion(keys, *args)
# 獲取多二個name對應(yīng)的集合的并集
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 獲取多一個name對應(yīng)的集合的差集
result0 = r.sunion('k5','k6')
print(result0, 000)
# 4.# 獲取所有值
result1 = r.smembers('k6')
print(result1, 111)
result2 = r.smembers('k5')
print(result2, 222)
4.sunionstore
sunionstore(dest,keys, *args)
#Redis Sunionstore 將k6和k5 中相同元素合并成一個,后與不同的元素 一起放入k2中
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# Redis Sunionstore 將k6和k5 中相同元素合并成一個,后與不同的元素 一起放入k2中
r.sunionstore('k2','k6','k5')
# 4.# 獲取所有值
result1 = r.smembers('k6')
print(result1, 111)
result2 = r.smembers('k5')
print(result2, 222)
result3 = r.smembers('k2')
print(result3, 333)
sscan(name, cursor=0, match=None, count=None)(貌似不好用) sscan_iter(name, match=None, count=None) # 用法同字符串的操作,用于增量迭代分批獲取元素,避免內(nèi)存消耗太大
5.sscan_iter
sscan_iter(name, match=None, count=None)
# 同字符串的操作,用于增量迭代分批獲取元素,避免內(nèi)存消耗太大
# name,redis的name
# match,匹配指定key,默認(rèn)None 表示所有的key
# count,每次分片最少獲取個數(shù),默認(rèn)None表示采用Redis的默認(rèn)分片個數(shù)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3.用于增量迭代分批獲取元素,避免內(nèi)存消耗太大
ret = r.sscan_iter('k6', match=None, count=10)
# 4.# 迭代獲取獲取所有值
for i in ret:
print(i)
集合之間移動
1.smove
smove(src, dst, value)
# 將某個成員從一個集合中移動到另外一個集合
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # name對應(yīng)的集合中添加元素
r.sadd('k6', '2')
# 將某個成員從一個集合中移動到另外一個集合
r.smove('k5','k6','1')
# 4.獲取name對應(yīng)的集合中元素個數(shù)
result1 = r.sinter('k6', )
print(result1,222)
result1 = r.sinter('k5', )
print(result1,222)
刪除
1.spop
spop(name)
# 從集合的右側(cè)(尾部)移除一個成員,并將其返回
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # name對應(yīng)的集合中添加元素
r.sadd('k6', '2')
# # 從集合的右側(cè)(尾部)移除一個成員,并將其返回
print(r.spop('k6'))
# 4.獲取name對應(yīng)的集合中元素個數(shù)
result1 = r.sinter('k6', )
print(result1,222)
2.srem
srem(name, values)
# 在name對應(yīng)的集合中刪除某些值
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.StrictRedis(connection_pool=pool)
# 3. # 在name對應(yīng)的集合中刪除某些值(指定刪除某個值)
r.srem('k6', '666')
# 4.# 從name對應(yīng)的集合中隨機(jī)獲取 numbers 個元素
result1 = r.smembers('k6')
print(result1, 222)
有序集合
在集合的基礎(chǔ)上,為每元素排序;元素的排序需要根據(jù)另外一個值來進(jìn)行比較,
所以,對于有序集合,每一個元素有兩個值,即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序.
增
1.zadd
zadd(name, *args, **kwargs)
# 在name對應(yīng)的有序集合中添加元素
# 如:
r.zadd('xset1', {'m1': 10, 'm2': 20, 'riven': 18, })
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序(也就是后面的數(shù)字)。
r.zadd('xset1', {'m1': 10, 'm2': 20, 'riven': 18, })
# 4.# 迭代獲取獲取所有值
print(r.zrange('xset1', 0, 100))
2.zincrby
zincrby(name, value, amount)
# 自增name對應(yīng)的有序集合的 name 對應(yīng)的分?jǐn)?shù)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset1', {'m1': 10, 'm2': 20, 'riven': 18, })
# 4.# 自增name對應(yīng)的有序集合的 name 對應(yīng)的分?jǐn)?shù)
r.zincrby('xset1',amount=2,value='riven')
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset1', 0, 100))
獲取數(shù)量
1.zcard
zcard(name)
# 獲取name對應(yīng)的有序集合元素的數(shù)量
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序(也就是后面的數(shù)字)。
r.zadd('xset1', {'m1': 10, 'm2': 20, 'riven': 18, })
# 4.# 獲取name對應(yīng)的有序集合元素的數(shù)量
print(r.zcard('xset1'))
獲取值
1.zcount
zcount(name, min, max)
# 獲取name對應(yīng)的有序集合中分?jǐn)?shù) 在 [min,max] 之間的個數(shù)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset1', {'m1': 10, 'm2': 20, 'riven': 18, })
# 4.## 獲取name對應(yīng)的有序集合中分?jǐn)?shù) 在 [min,max] 之間的個數(shù)
print(r.zcount('xset1', 0, 100))
2.zrange
r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)
# 按照索引范圍獲取name對應(yīng)的有序集合的元素
# 參數(shù):
# name,redis的name
# 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)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset1', {'m1': 10, 'm2': 20, 'riven': 18, 'marke':8,'mimi':9})
# 4.# 按照索引范圍獲取name對應(yīng)的有序集合的元素
ret = r.zrange( 'xset1', 0, 2, desc=False, withscores=True, score_cast_func=float)
print(ret)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset1', 0, 100))
從大到小排序
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset1', {'m1': 10, 'm2': 20, 'riven': 18, 'marke':8,'mimi':9})
# 4.# 按照索引范圍獲取name對應(yīng)的有序集合的元素
ret = r.zrevrange( 'xset1', 0, 2, withscores=True, score_cast_func=float)
print(ret)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset1', 0, 100))
# 按照分?jǐn)?shù)范圍獲取name對應(yīng)的有序集合的元素
# zrangebyscore(name, min, max, start=None, num=None,
withscores=False, score_cast_func=float)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset1', {'m1': 10, 'm2': 20, 'riven': 18, 'marke':8,'mimi':9})
# 4.# 按照分?jǐn)?shù)范圍獲取name對應(yīng)的有序集合的元素
ret = r.zrangebyscore( 'xset1', 9, 25, start=None, num=None, withscores=True, score_cast_func=float)
print(ret)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset1', 0, 100))
# 分?jǐn)?shù)從大到小排序
zrevrangebyscore(name, max, min, start=None,
num=None, withscores=False, score_cast_func=float)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset1', {'m1': 10, 'm2': 20, 'riven': 18, 'marke':8,'mimi':9})
# 4.# 按照分?jǐn)?shù)范圍獲取name對應(yīng)的有序集合的元素 # 從大到小排序
ret = r.zrevrangebyscore( 'xset1', 25, 9, start=None, num=None, withscores=True, score_cast_func=float)
print(ret)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset1', 0, 100))
3.zrank
zrank(name, value)
# 獲取某個值在 name對應(yīng)的有序集合中的排行(從 0 開始)
# 更多:
# zrevrank(name, value),從大到小排序
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset1', {'m1': 10, 'm2': 20, 'riven': 18, 'marke':8,'mimi':9})
# 4.# 獲取某個值在 name對應(yīng)的有序集合中的排行(從 0 開始)
ret = r.zrank( 'xset1','m1')
print(ret)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset1', 0, 100))
zrevrank(name, value),從大到小排序
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset1', {'m1': 10, 'm2': 20, 'riven': 18, 'marke':8,'mimi':9})
# 4.# 獲取某個值在 name對應(yīng)的有序集合中的排行(從 0 開始)應(yīng)該沒啥區(qū)別
ret = r.zrevrank( 'xset1','marke')
print(ret)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset1', 0, 100))
4.zrangebylex
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)為較長的字符串比較短的字符串要大。 # 參數(shù): # name,redis的name # min,左區(qū)間(值)。 + 表示正無限; - 表示負(fù)無限; ( 表示開區(qū)間; [ 則表示閉區(qū)間 # min,右區(qū)間(值) # start,對結(jié)果進(jìn)行分片處理,索引位置 # num,對結(jié)果進(jìn)行分片處理,索引后面的num個元素 # 如: # 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)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset1', {'m1': 20, 'm2': 20, 'riven': 20, 'marke': 20, 'mimi': 20})
# 4.# min,左區(qū)間(值)。 + 表示正無限; - 表示負(fù)無限; ( 表示開區(qū)間(不包含本身); [ 則表示閉區(qū)間 (包含本身)
ret = r.zrangebylex('xset1', '-', '(riven', start=None, num=None)
print(ret)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset1', 0, 100))
4.zscore
zscore(name, value)
# 獲取name對應(yīng)有序集合中 value 對應(yīng)的分?jǐn)?shù)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset1', {'m1': 10, 'm2': 20, 'riven': 30, 'marke': 40, 'mimi': 50})
# # 根據(jù)值返回刪除
ret = r.zscore('xset1','m2')
print(ret)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset1', 0, 100))
5.zinterstore
zinterstore(dest, keys, aggregate=None)
# 獲取兩個有序集合的交集,如果遇到相同值不同分?jǐn)?shù),則按照aggregate進(jìn)行操作
# aggregate的值為: SUM MIN MAX
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset4', {'m1': 10, 'm2': 20, 'riven': 30, 'marke': 40, 'mimi': 50})
r.zadd('xset5', {'m2': 12, 'm3': 25, 'riven': 35, 'marke': 45, 'mimi': 51})
# 獲取兩個有序集合的交集,如果遇到相同值不同分?jǐn)?shù),則按照aggregate進(jìn)行操作
ret = r.zinterstore('xset4','xset5',aggregate=None)
print(ret)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset4', 0, 100))
print(r.zrange('xset5', 0, 100))
用的少
zunionstore(dest, keys, aggregate=None) 1 2 # 獲取兩個有序集合的并集,如果遇到相同值不同分?jǐn)?shù),則按照aggregate進(jìn)行操作 # aggregate的值為: SUM MIN MAX zscan(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,用來對分?jǐn)?shù)進(jìn)行操作
刪除
1.zrem
zrem(name, values)
# 刪除name對應(yīng)的有序集合中值是values的成員
# 如:zrem('zz', ['s1', 's2'])
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset1', {'m1': 20, 'm2': 20, 'riven': 20, 'marke': 20, 'mimi': 20})
# 刪除name對應(yīng)的有序集合中值是values的成員
ret = r.zrem('xset1', 'm1','m2')
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset1', 0, 100))
2.zremrangebyrank
zremrangebyrank(name, min, max)
# 根據(jù)排行范圍刪除
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset1', {'m1': 20, 'm2': 20, 'riven': 20, 'marke': 20, 'mimi': 20})
# # 根據(jù)排行范圍刪除
ret = r.zremrangebyrank('xset1', 0,2)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset1', 0, 100))
3.zremrangebyscore
zremrangebyscore(name, min, max)
## 根據(jù)分?jǐn)?shù)范圍刪除
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset1', {'m1': 10, 'm2': 20, 'riven': 30, 'marke': 40, 'mimi': 50})
# # 根據(jù)分?jǐn)?shù)范圍刪除
ret = r.zremrangebyscore('xset1', 20,30)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset1', 0, 100))
4.zremrangebylex(目前無法使用)
zremrangebylex(name, min, max)
# 根據(jù)值返回刪除
其他常用操作(全能)
刪
1.delete
delete(*names)
# 根據(jù)刪除redis中的任意數(shù)據(jù)類型
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset4', {'m1': 10, 'm2': 20, 'riven': 30, 'marke': 40, 'mimi': 50})
# 根據(jù)刪除redis中的任意數(shù)據(jù)類型
ret = r.delete('xset4')
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset4', 0, 100))
檢測
1.exists
exists(name)
# 檢測redis的name是否存在
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset4', {'m1': 10, 'm2': 20, 'riven': 30, 'marke': 40, 'mimi': 50})
# # 檢測redis的name是否存在
ret = r.exists('xset4')
print(ret)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset4', 0, 100))
查詢
keys
keys(pattern='*')
# 根據(jù)模型獲取redis的name
# 更多:
# KEYS * 匹配數(shù)據(jù)庫中所有 key 。
# KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
# KEYS h*llo 匹配 hllo 和 heeeeello 等。
# KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset4', {'m1': 10, 'm2': 20, 'riven': 30, 'marke': 40, 'mimi': 50})
# # 檢測redis的name是否存在
ret = r.keys('*')
print(ret)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset4', 0, 100))
設(shè)置超時時間
1.expire
expire(name ,time)
# 為某個redis的某個name設(shè)置超時時間
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset4', {'m1': 10, 'm2': 20, 'riven': 30, 'marke': 40, 'mimi': 50})
# 為某個redis的某個name設(shè)置超時時間
ret = r.expire('xset4', 10)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset4', 0, 100))
重命名
1.rename
rename(src, dst)
# 對redis的name重命名為
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset4', {'m1': 10, 'm2': 20, 'riven': 30, 'marke': 40, 'mimi': 50})
# 4. # 對redis的name重命名為
ret = r.rename('xset4', 'xset10')
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset10', 0, 100))
隨機(jī)獲取一個redis的name
1.randomkey
randomkey()
# 隨機(jī)獲取一個redis的name(不刪除)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset4', {'m1': 10, 'm2': 20, 'riven': 30, 'marke': 40, 'mimi': 50})
# 4. # 隨機(jī)獲取一個redis的name(不刪除)
ret = r.randomkey()
print(ret)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset10', 0, 100))
獲取name對應(yīng)值的類型
1.type
type(name)
import redis
# 1.創(chuàng)建一個redis連接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
# 2.每個Redis實例都會維護(hù)一個自己的連接池。
r = redis.Redis(connection_pool=pool)
# 3.# 在name對應(yīng)的有序集合中添加元素。即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來做排序()。
r.zadd('xset4', {'m1': 10, 'm2': 20, 'riven': 30, 'marke': 40, 'mimi': 50})
# 4. # 獲取name對應(yīng)值的類型
ret = r.type('xset4')
print(ret)
# 5.# 迭代獲取獲取所有值
print(r.zrange('xset10', 0, 100))
scan(cursor=0, match=None, count=None) scan_iter(match=None, count=None) # 同字符串操作,用于增量迭代獲取key
總結(jié)
以上是生活随笔為你收集整理的redis 介绍与操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Xss Csrf 简介
- 下一篇: 语雀发布博客园