Python操做Redis

Python-Redis

原文連接https://www.cnblogs.com/melonjiang/p/5342383.htmlhtml

1、redispython

  redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。redis

  Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合能夠對關係數據庫起到很好的補充做用。它提供了Python,Ruby,Erlang,PHP客戶端,使用很方便,Redis支持主從同步。數據能夠從主服務器向任意數量的從服務器上同步,從服務器能夠是關聯其餘從服務器的主服務器。這使得Redis可執行單層樹複製。從盤能夠有意無心的對數據進行寫操做。因爲徹底實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈記錄。數據庫

2、python操做redis緩存

一、鏈接方式bash

  redis-py提供兩個類Redis和StrictRedis用於實現Redis的命令,StrictRedis用於實現大部分官方的命令,並使用官方的語法和命令,Redis是StrictRedis的子類服務器

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis

r = redis.Redis(host='192.168.0.110', port=6379,db=0)
r.set('name', 'zhangsan')   #添加
print (r.get('name'))   #獲取
複製代碼

二、鏈接池app

  redis-py使用connection pool來管理對一個redis server的全部鏈接,避免每次創建、釋放鏈接的開銷。默認,每一個Redis實例都會維護一個本身的鏈接池。能夠直接創建一個鏈接池,而後做爲參數Redis,這樣就能夠實現多個Redis實例共享一個鏈接池。dom

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis

pool = redis.ConnectionPool(host='192.168.0.110', port=6379)
r = redis.Redis(connection_pool=pool)
r.set('name', 'zhangsan')   #添加
print (r.get('name'))   #獲取
複製代碼

三、操做Python-Redismemcached

四、管道

  redis-py默認在執行每次請求都會建立(鏈接池申請鏈接)和斷開(歸還鏈接池)一次鏈接操做,若是想要在一次請求中指定多個命令,則可使用pipline實現一次請求指定多個命令,而且默認狀況下一次pipline 是原子性操做。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis
pool = redis.ConnectionPool(host='192.168.0.110', port=6379)
r = redis.Redis(connection_pool=pool)

pipe = r.pipeline(transaction=True)

r.set('name', 'zhangsan')
r.set('name', 'lisi')

pipe.execute()
複製代碼

五、發佈和訂閱

首先定義一個RedisHelper類,鏈接Redis,定義頻道爲monitor,定義發佈(publish)及訂閱(subscribe)方法。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import redis

class RedisHelper(object):
    def __init__(self):
        self.__conn = redis.Redis(host='192.168.0.110',port=6379)#鏈接Redis
        self.channel = 'monitor' #定義名稱

    def publish(self,msg):#定義發佈方法
        self.__conn.publish(self.channel,msg)
        return True

    def subscribe(self):#定義訂閱方法
        pub = self.__conn.pubsub()
        pub.subscribe(self.channel)
        pub.parse_response()
        return pub
複製代碼

發佈者

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#發佈
from RedisHelper import RedisHelper

obj = RedisHelper()
obj.publish('hello')#發佈
複製代碼

訂閱者

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#訂閱
from RedisHelper import RedisHelper

obj = RedisHelper()
redis_sub = obj.subscribe()#調用訂閱方法

while True:
    msg= redis_sub.parse_response()
    print (msg)
複製代碼

Python-Redis

一、String 操做

  redis中的String在在內存中按照一個name對應一個value來存儲

set()

#在Redis中設置值,默認不存在則建立,存在則修改
r.set('name', 'zhangsan')
'''參數: set(name, value, ex=None, px=None, nx=False, xx=False) ex,過時時間(秒) px,過時時間(毫秒) nx,若是設置爲True,則只有name不存在時,當前set操做才執行,同setnx(name, value) xx,若是設置爲True,則只有name存在時,當前set操做才執行'''
複製代碼
setex(name, value, time)
#設置過時時間(秒)

psetex(name, time_ms, value)
#設置過時時間(豪秒)
複製代碼

mset()

#批量設置值
r.mset(name1='zhangsan', name2='lisi')
#或
r.mget({"name1":'zhangsan', "name2":'lisi'})
複製代碼

get(name)

  獲取值

mget(keys, *args)

#批量獲取
print(r.mget("name1","name2"))
#或
li=["name1","name2"]
print(r.mget(li))
複製代碼

getset(name, value)

#設置新值,打印原值
print(r.getset("name1","wangwu")) #輸出:zhangsan
print(r.get("name1")) #輸出:wangwu
複製代碼

getrange(key, start, end)

#根據字節獲取子序列
r.set("name","zhangsan")
print(r.getrange("name",0,3))#輸出:zhan
複製代碼

setrange(name, offset, value)

#修改字符串內容,從指定字符串索引開始向後替換,若是新值太長時,則向後添加
r.set("name","zhangsan")
r.setrange("name",1,"z")
print(r.get("name")) #輸出:zzangsan
r.setrange("name",6,"zzzzzzz")
print(r.get("name")) #輸出:zzangszzzzzzz
複製代碼

setbit(name, offset, value)

#對二進制表示位進行操做
''' name:redis的name offset,位的索引(將值對應的ASCII碼變換成二進制後再進行索引) value,值只能是 1 或 0 '''

str="345"
r.set("name",str)
for i in str:
    print(i,ord(i),bin(ord(i)))#輸出 值、ASCII碼中對應的值、對應值轉換的二進制
''' 輸出: 3 51 0b110011 4 52 0b110100 5 53 0b110101'''

r.setbit("name",6,0)#把第7位改成0,也就是3對應的變成了0b110001
print(r.get("name"))#輸出:145
複製代碼

getbit(name, offset)

#獲取name對應值的二進制中某位的值(0或1)
r.set("name","3") # 對應的二進制0b110011
print(r.getbit("name",5))   #輸出:0
print(r.getbit("name",6))   #輸出:1
複製代碼

bitcount(key, start=None, end=None)

#獲取對應二進制中1的個數
r.set("name","345")#0b110011 0b110100 0b110101
print(r.bitcount("name",start=0,end=1)) #輸出:7
''' key:Redis的name start:字節起始位置 end:字節結束位置'''
複製代碼

strlen(name)

#返回name對應值的字節長度(一個漢字3個字節)
r.set("name","zhangsan")
print(r.strlen("name")) #輸出:8
複製代碼

incr(self, name, amount=1)

#自增mount對應的值,當mount不存在時,則建立mount=amount,不然,則自增,amount爲自增數(整數)
print(r.incr("mount",amount=2))#輸出:2
print(r.incr("mount"))#輸出:3
print(r.incr("mount",amount=3))#輸出:6
print(r.incr("mount",amount=6))#輸出:12
print(r.get("mount")) #輸出:12
複製代碼

incrbyfloat(self, name, amount=1.0)

#相似 incr() 自增,amount爲自增數(浮點數)
複製代碼

decr(self, name, amount=1)

#自減name對應的值,當name不存在時,則建立name=amount,不然,則自減,amount爲自增數(整數)
複製代碼

append(name, value)

#在name對應的值後面追加內容
r.set("name","zhangsan")
print(r.get("name"))    #輸出:'zhangsan
r.append("name","lisi")
print(r.get("name"))    #輸出:zhangsanlisi
複製代碼

二、Hash 操做

redis中的Hash 在內存中相似於一個name對應一個dic來存儲

hset(name, key, value)

#name對應的hash中設置一個鍵值對(不存在,則建立,不然,修改)
r.hset("dic_name","a1","aa")
複製代碼

hget(name,key)

r.hset("dic_name","a1","aa")
#在name對應的hash中根據key獲取value
print(r.hget("dic_name","a1"))#輸出:aa
複製代碼

hgetall(name)

#獲取name對應hash的全部鍵值
print(r.hgetall("dic_name"))
複製代碼

hmset(name, mapping)

#在name對應的hash中批量設置鍵值對,mapping:字典
dic={"a1":"aa","b1":"bb"}
r.hmset("dic_name",dic)
print(r.hget("dic_name","b1"))#輸出:bb
複製代碼

hmget(name, keys, *args)

# 在name對應的hash中獲取多個key的值
li=["a1","b1"]
print(r.hmget("dic_name",li))
print(r.hmget("dic_name","a1","b1"))
複製代碼

hlen(name)、hkeys(name)、hvals(name)

dic={"a1":"aa","b1":"bb"}
r.hmset("dic_name",dic)

#hlen(name) 獲取hash中鍵值對的個數
print(r.hlen("dic_name"))

#hkeys(name) 獲取hash中全部的key的值
print(r.hkeys("dic_name"))

#hvals(name) 獲取hash中全部的value的值
print(r.hvals("dic_name"))
複製代碼

hexists(name, key)

#檢查name對應的hash是否存在當前傳入的key
print(r.hexists("dic_name","a1"))#輸出:True
複製代碼

hdel(name,*keys)

#刪除指定name對應的key所在的鍵值對
r.hdel("dic_name","a1")
複製代碼

hincrby(name, key, amount=1)

#自增hash中key對應的值,不存在則建立key=amount(amount爲整數)
print(r.hincrby("demo","a",amount=2))
複製代碼

hincrbyfloat(name, key, amount=1.0)

#自增hash中key對應的值,不存在則建立key=amount(amount爲浮點數)
複製代碼

hscan(name, cursor=0, match=None, count=None)

hscan_iter(name, match=None, count=None)

三、List 操做

redis中的List在在內存中按照一個name對應一個List來存儲

lpush(name,values)

# 在name對應的list中添加元素,每一個新的元素都添加到列表的最左邊
r.lpush("list_name",2)
r.lpush("list_name",3,4,5)#保存在列表中的順序爲5,4,3,2
複製代碼

rpush(name,values)

#同lpush,但每一個新的元素都添加到列表的最右邊
複製代碼

lpushx(name,value)

#在name對應的list中添加元素,只有name已經存在時,值添加到列表的最左邊
複製代碼

rpushx(name,value)

#在name對應的list中添加元素,只有name已經存在時,值添加到列表的最右邊
複製代碼

llen(name)

# name對應的list元素的個數
print(r.llen("list_name"))
複製代碼

linsert(name, where, refvalue, value))

# 在name對應的列表的某一個值前或後插入一個新值
r.linsert("list_name","BEFORE","2","SS")#在列表內找到第一個元素2,在它前面插入SS

'''參數: name: redis的name where: BEFORE(前)或AFTER(後) refvalue: 列表內的值 value: 要插入的數據'''
複製代碼

r.lset(name, index, value)

#對list中的某一個索引位置從新賦值
r.lset("list_name",0,"bbb")
複製代碼

r.lrem(name, value, num)

#刪除name對應的list中的指定值
r.lrem("list_name","SS",num=0)

''' 參數: name: redis的name value: 要刪除的值 num: num=0 刪除列表中全部的指定值; num=2 從前到後,刪除2個; num=-2 從後向前,刪除2個'''
複製代碼

lpop(name)

#移除列表的左側第一個元素,返回值則是第一個元素
print(r.lpop("list_name"))
複製代碼

lindex(name, index)

#根據索引獲取列表內元素
print(r.lindex("list_name",1))
複製代碼

lrange(name, start, end)

#分片獲取元素
print(r.lrange("list_name",0,-1))
複製代碼

ltrim(name, start, end)

#移除列表內沒有在該索引以內的值
r.ltrim("list_name",0,2)
複製代碼

rpoplpush(src, dst)

# 從一個列表取出最右邊的元素,同時將其添加至另外一個列表的最左邊
#src 要取數據的列表
#dst 要添加數據的列表
複製代碼

brpoplpush(src, dst, timeout=0)

#同rpoplpush,多了個timeout, timeout:取數據的列表沒元素後的阻塞時間,0爲一直阻塞
r.brpoplpush("list_name","list_name1",timeout=0)
複製代碼

blpop(keys, timeout)

#將多個列表排列,按照從左到右去移除各個列表內的元素
r.lpush("list_name",3,4,5)
r.lpush("list_name1",3,4,5)

while True:
    print(r.blpop(["list_name","list_name1"],timeout=0))
    print(r.lrange("list_name",0,-1),r.lrange("list_name1",0,-1))

'''keys: redis的name的集合 timeout: 超時時間,獲取完全部列表的元素以後,阻塞等待列表內有數據的時間(秒), 0 表示永遠阻塞'''
複製代碼

r.brpop(keys, timeout)

#同blpop,將多個列表排列,按照從右像左去移除各個列表內的元素
複製代碼

四、Set 操做

Set集合就是不容許重複的列表

sadd(name,values)

#給name對應的集合中添加元素
r.sadd("set_name","aa")
r.sadd("set_name","aa","bb")
複製代碼

smembers(name)

#獲取name對應的集合的全部成員
複製代碼

scard(name)

#獲取name對應的集合中的元素個數
r.scard("set_name")
複製代碼

sdiff(keys, *args)

#在第一個name對應的集合中且不在其餘name對應的集合的元素集合
r.sadd("set_name","aa","bb")
r.sadd("set_name1","bb","cc")
r.sadd("set_name2","bb","cc","dd")

print(r.sdiff("set_name","set_name1","set_name2"))#輸出:{aa}
複製代碼

sdiffstore(dest, keys, *args)

#至關於把sdiff獲取的值加入到dest對應的集合中
複製代碼

sinter(keys, *args)

# 獲取多個name對應集合的並集
r.sadd("set_name","aa","bb")
r.sadd("set_name1","bb","cc")
r.sadd("set_name2","bb","cc","dd")

print(r.sinter("set_name","set_name1","set_name2"))#輸出:{bb}
複製代碼

sinterstore(dest, keys, *args)

#獲取多個name對應集合的並集,再講其加入到dest對應的集合中
複製代碼

sismember(name, value)

#檢查value是不是name對應的集合內的元素
複製代碼

smove(src, dst, value)

#將某個元素從一個集合中移動到另一個集合
複製代碼

spop(name)

#從集合的右側移除一個元素,並將其返回
複製代碼

srandmember(name, numbers)

# 從name對應的集合中隨機獲取numbers個元素
print(r.srandmember("set_name2",2))
複製代碼

srem(name, values)

#刪除name對應的集合中的某些值
print(r.srem("set_name2","bb","dd"))
複製代碼

sunion(keys, *args)

#獲取多個name對應的集合的並集
r.sunion("set_name","set_name1","set_name2")
複製代碼

sunionstore(dest,keys, *args)

#獲取多個name對應的集合的並集,並將結果保存到dest對應的集合中
複製代碼

有序集合:

  在集合的基礎上,爲每元素排序,元素的排序須要根據另一個值來進行比較,因此,對於有序集合,每個元素有兩個值,即:值和分數,分數專門用來作排序。

zadd(name, *args, **kwargs)

# 在name對應的有序集合中添加元素
r.zadd("zset_name", "a1", 6, "a2", 2,"a3",5)
#或
r.zadd('zset_name1', b1=10, b2=5)
複製代碼

zcard(name)

#獲取有序集合內元素的數量
複製代碼

zcount(name, min, max)

#獲取有序集合中分數在[min,max]之間的個數
print(r.zcount("zset_name",1,5))
複製代碼

zincrby(name, value, amount)

#自增有序集合內value對應的分數
r.zincrby("zset_name","a1",amount=2)#自增zset_name對應的有序集合裏a1對應的分數
複製代碼

zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)

# 按照索引範圍獲取name對應的有序集合的元素
aa=r.zrange("zset_name",0,-1,desc=False,withscores=True,score_cast_func=int)
print(aa)
'''參數: name redis的name start 有序集合索引發始位置 end 有序集合索引結束位置 desc 排序規則,默認按照分數從小到大排序 withscores 是否獲取元素的分數,默認只獲取元素的值 score_cast_func 對分數進行數據轉換的函數'''
複製代碼

zrevrange(name, start, end, withscores=False, score_cast_func=float)

#同zrange,集合是從大到小排序的
複製代碼

zrank(name, value)、zrevrank(name, value)

#獲取value值在name對應的有序集合中的排行位置(從0開始)
print(r.zrank("zset_name", "a2"))

print(r.zrevrank("zset_name", "a2"))#從大到小排序
複製代碼

zscore(name, value)

#獲取name對應有序集合中 value 對應的分數
print(r.zscore("zset_name","a1"))
複製代碼

zrem(name, values)

#刪除name對應的有序集合中值是values的成員
r.zrem("zset_name","a1","a2")
複製代碼

zremrangebyrank(name, min, max)

#根據排行範圍刪除
複製代碼

zremrangebyscore(name, min, max)

#根據分數範圍刪除
複製代碼

zinterstore(dest, keys, aggregate=None)

r.zadd("zset_name", "a1", 6, "a2", 2,"a3",5)
r.zadd('zset_name1', a1=7,b1=10, b2=5)

# 獲取兩個有序集合的交集並放入dest集合,若是遇到相同值不一樣分數,則按照aggregate進行操做
# aggregate的值爲: SUM MIN MAX
r.zinterstore("zset_name2",("zset_name1","zset_name"),aggregate="MAX")
print(r.zscan("zset_name2"))
複製代碼

zunionstore(dest, keys, aggregate=None)

#獲取兩個有序集合的並集並放入dest集合,其餘同zinterstore,
複製代碼

其餘經常使用操做

delete(*names)

#根據name刪除redis中的任意數據類型
複製代碼

exists(name)

#檢測redis的name是否存在
複製代碼

keys(pattern='*')

#根據* ?等通配符匹配獲取redis的name
複製代碼

expire(name ,time)

# 爲某個name設置超時時間
複製代碼

rename(src, dst)

# 重命名
複製代碼

move(name, db))

# 將redis的某個值移動到指定的db下
複製代碼

randomkey()

#隨機獲取一個redis的name(不刪除)
複製代碼

type(name)

# 獲取name對應值的類型
複製代碼
相關文章
相關標籤/搜索