1.redis簡介
redis是一款開源免費的高性能key-value數據庫,redis特點:
- 支持更多的數據類型:字符串(String)、列表(List)、哈希(Map)、數字(Int)、集合(Set)、有序集合(sorted sets)。
- 為了保證效率,將數據保存在內存中。
- 周期性的將數據保存到磁盤。
- 支持數據備份,master-slave模式數據備份。
2.redis優勢
- 性能高
- 原子性
- 豐富的數據類型
- 豐富的特性
3.API使用
- 連接方式
- 連接池方式
- 豐富的數據類型操作
- 管道
- 發布訂閱
4.操作模式
redis-py提供兩個類Redis和StrictRedis用於實現Redis的命令,StrictRedis用於實現大部分官方的命令,並使用官方的語法和命令,Redis是StrictRedis的子類,用於向后兼容舊版本的redis-py。
import redis #創建一個redis實例,獲取一個新的連接 r = redis.Redis("127.0.0.1","6379") #以key-value的形式設置redis字符串數據 r.set("k1","v1") r.set("k2","v2") #獲取存儲的數據並輸出 print(r.get("k1")) print(r.get("k2"))
5. 通過連接池 使用 redis
import redis #首先獲取一個redis連接池 , 注意端口號不能使用字符串的方式 redisPool = redis.ConnectionPool(host="127.0.0.1",port=6379) #實例化一個redis實例,通過連接池 r = redis.Redis(connection_pool=redisPool) r.set("k1","v1") print(r.get("k1"))
6.字符串操作(String)
set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中設置值,默認,不存在則創建,存在則修改
參數:
ex,過期時間(秒)
px,過期時間(毫秒)
nx,如果設置為True,則只有name不存在時,當前set操作才執行
xx,如果設置為True,則只有name存在時,崗前set操作才執行
#set(name, value, ex=None, px=None, nx=False, xx=False) # r.set(name="k1",value="v1",ex=5) # print(r.get("k1")) 5秒后,get("k1") 為None r.set("k1","v1") r.set("k1","v1v1",nx=True) #如果redis中存在看,當前set操作無效 print(r.get("k1")) #v1
setnx(name, value)
設置值,只有name不存在時,執行設置操作(添加)
setex(name, value, time)
# 設置值
# 參數:
# time,過期時間(數字秒 或 timedelta對象
psetex(name, time_ms, value)
# 設置值
# 參數:
# time_ms,過期時間(數字毫秒 或 timedelta對象)
mset(*args, **kwargs) 批量設置值
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) #一種是關鍵字的方式 r.mset(k1="v1",k2="v2") #另一種是打散字典 r.mset(**{"k3":"v3","k4":"v4","k5":"v5"}) print(r.get("k1")) print(r.get("k3"))
mget(keys, *args) : 批量獲取值
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) #一種是關鍵字的方式 r.mset(k1="v1",k2="v2") #另一種是打散字典 r.mset(**{"k3":"v3","k4":"v4","k5":"v5"}) print(r.get("k1")) print(r.get("k3")) #批量獲取就是 放一個容器包含需要獲取的所有key print(r.mget("k1","k2","k3")) print(r.mget(["k1","k2","k3"])) print(r.mget(*["k1","k2","k3"])) print(r.mget(*("k1","k2","k3")))
getset(name, value)
設置新值並獲取原來的值
getrange(key, start, end):獲取子序列
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) r.set("k1","Hello World") #從0開始到索引為2的位置,和python切片不同,它包含尾部元素 print(r.getrange("k1", 0, 2)) # Hel #0 -1 獲取整個值的長度 print(r.getrange("k1", 0, -1))
setrange(name, offset, value)
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) r.set("k1","Hello World") #表示從0開始替換 123替換 Held的位置 r.setrange("k1",0,"123") print(r.get("k1"))#b'123lo World'
strlen(name) : 返回值的長度
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) r.set("k1","Hello World") print(r.strlen("k1")) #11
incr(self, name, amount=1)
# 自增 name對應的值
# 當name不存在時,則創建name=amount
# 參數:
# name,Redis的name
# amount,自增數(必須是整數)
# 注:同incrby
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) r.set("k1","1") # r.set("k1",1) 相同 print(r.get("k1")) #1 r.incr("k1",amount=1) print(r.get("k1")) #2
incrbyfloat(self, name, amount=1.0):同上,只是自增數是浮點數
decr(self, name, amount=1) : 自減對應的值,自增數是整數
append(key, value)
# 在redis name對應的值后面追加內容
# 參數:
key, redis的name
value, 要追加的字符串
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) r.set("k1","HelloWorld") print(r.get("k1")) #b'HelloWorld' r.append("k1","123") print(r.get("k1")) #b'HelloWorld123'
7.哈希的操作

hset(name, key, value)
# name對應的hash中設置一個鍵值對(不存在,則創建;否則,修改)
# 參數:
# name,redis的name
# key,name對應的hash中的key
# value,name對應的hash中的value
# 注:
# hsetnx(name, key, value),當name對應的hash中不存在當前key時則創建(相當於添加)
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) """ { foo :{"k1":"v1"} } """ r.hset("foo","k1","v1") print(r.hget("foo","k1"))
hmset(name, mapping)
# 在name對應的hash中批量設置鍵值對 # 參數: # name,redis的name # mapping,字典,如:{'k1':'v1', 'k2': 'v2'} # 如: # r.hmset('xx', {'k1':'v1', 'k2': 'v2'})
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) r.hmset("foo",{"k1":"v1","k2":"v2","k3":"v3"}) print(r.hget("foo", "k1")) print(r.hget("foo", "k2")) print(r.hget("foo", "k3"))
hget和hmget : 獲取的單個值,獲取多個key對應的值
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) """ { foo:{ k1:v1, k2:v2, k3:v3 } } """ #批量添加多個值 r.hmset("foo",{"k1":"v1","k2":"v2","k3":"v3"}) #print(r.hget("foo", "k1")) #print(r.hget("foo", "k2")) #print(r.hget("foo", "k3")) print(r.hmget("foo", ["k1", "k2", "k3"])) #[b'v1', b'v2', b'v3']
hgetall(name)
獲取name對應hash的所有鍵值
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) r.hmset("foo",{"k1":"v1","k2":"v2"}) print(r.hgetall("foo")) #{b'k1': b'v1', b'k2': b'v2', b'k3': b'v3'}
hlen(name):獲取name對應的hash中鍵值對的個數
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) r.hmset("foo",{"k1":"v1","k2":"v2"}) print(r.hlen("foo")) #3
hkeys(name) 、 hvals(name)
hkeys(name) : # 獲取name對應的hash中所有的key的值 hvals(name) : # 獲取name對應的hash中所有的value的值
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) print(r.hkeys("foo")) #[b'k1', b'k2', b'k3'] print(r.hvals("foo")) #[b'v1', b'v2', b'v3']
hexists(name, key) : 檢查name對應的hash是否存在當前傳入的key
r.hmset("foo",{"k1":"v1","k2":"v2","k3":"v3"}) print(r.hmget("foo", ["k1", "k2", "k3"])) #[b'v1', b'v2', b'v3'] # 檢查name中key是否存在 print(r.hexists("foo","k1")) #True
hdel(name,*keys) : 將name對應的hash中指定key的鍵值對刪除
r.hmset("foo",{"k1":"v1","k2":"v2","k3":"v3"}) print(r.hmget("foo", ["k1", "k2", "k3"])) #[b'v1', b'v2', b'v3'] print(r.hexists("foo","k1")) # True r.hdel("foo","k1") print(r.hexists("foo","k1")) # False
hscan(name, cursor=0, match=None, count=None)
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) 利用yield封裝hscan創建生成器,實現分批去redis中獲取數據
參數:
# match,匹配指定key,默認None 表示所有的key
# count,每次分片最少獲取個數,默認None表示采用Redis的默認分片個數
data = r.hscan_iter(name="foo") # <generator object StrictRedis.hscan_iter at 0x0000018F93516620> for i in data: print(i)
8.List操作
list操作,在redis中List在內存中按照一個name對應一個List來存儲

lpush(name,values):每個新的元素都添加到列表的最左邊
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) r.lpush('oo',11,22,33) print(r.lrange("oo",0,-1)) # 33 22 11
# rpush(name, values) 表示從右向左操作
lpushx(name,value) : 在name對應的list中添加元素,只有name已經存在時,值添加到列表的最左邊
llen(name): name對應的list元素的個數
import redis pool = redis.ConnectionPool(host="127.0.0.1",port=6379) r = redis.Redis(connection_pool=pool) # r.lpush('oo',11,22,33) print(r.lrange("oo",0,-1)) # 33 22 11 print(r.llen("oo")) # 3
linsert(name, where, refvalue, value))
