Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫。
Redis 與其他 key - value 緩存產品有以下三個特點:
Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
Redis支持數據的備份,即master-slave模式的數據備份。
1-概覽
Redis是典型的Key-Value類型數據庫,Key為字符類型,Value的類型常用的為五種類型:String、Hash 、List 、 Set 、 Ordered Set
2- Redis內部內存管理
redis的讀寫結構
redis數據庫最外層是一個字典 最外層的字典內每個key-value都是name-dic結構 也就是每個元素都是(字典名稱-字典x)的結構,空可以作為字典名稱, 而字典x內的可以存儲上面的所有數據類型.
所以我們在操作時,如果指定字典名稱,就進入對應的字典,如果沒有指定字典名稱,就進入名稱為空的字典進行操作.
案例
調試環境python3.6,調試python操作redis數據庫,首先要在本地或服務器安裝redis數據庫。安裝參考:http://blog.csdn.net/luanpeng825485697/article/details/79363000
在python3.6下我們使用redis庫。
pip install redis
安裝python庫的方法,請查看Python庫的安裝與卸載
安裝成功后就可以編程代碼實現python對redis數據庫的操作了
python3.6操作redis數據庫前請先確保redis服務已經打開
python3.6下代碼如下
1 #python3.6操作redis數據庫。使用前請先確保redis服務已經打開
2
3 print("=====================redis數據庫=====================") 4
5 import redis 6
7 # 連接數據庫
8 r = redis.Redis(host='127.0.0.1', port=6379,db=0) 9 # 使用連接池連接數據庫。這樣就可以實現多個Redis實例共享一個連接池
10 pool = redis.ConnectionPool(host='127.0.0.1', port=6379) 11 r = redis.Redis(connection_pool=pool) 12
13 # =============================1、String 操作===============================
14
15 #在Redis中設置值,默認不存在則創建,存在則修改
16 r.set('name', 'zhangsan') 17 r.mset(name1='zhangsan', name2='lisi') #批量設置值
18 r.mset({"name3":'zhangsan1', "name4":'lisi1'}) #批量設置值
19 # 字符串局部更新。setrange(name, offset, value)
20 r.setrange("name",1,"z") #修改字符串內容,從指定字符串索引開始向后替換
21 r.setrange("name",6,"zzzzzzz") #如果新值太長時,則向后添加
22
23
24 # 參數:set(name, value, ex=None, px=None, nx=False, xx=False)
25 # ex,過期時間(秒)
26 # px,過期時間(毫秒)
27 # nx,如果設置為True,則只有name不存在時,當前set操作才執行,同setnx(name, value)
28 # xx,如果設置為True,則只有name存在時,當前set操作才執行
29
30 # r.setex(name, value, time)
31 # #設置過期時間(秒)
32 # 33 # r.psetex(name, time_ms, value)
34 # #設置過期時間(豪秒)
35
36 # 字符串轉化為整型,再自增屬性mount對應的值,當屬性mount不存在時,則創建mount=amount,否則,則自增,amount為自增數(整數)
37 print(r.incr("mount",amount=2)) 38 print(r.incr("mount")) 39 print(r.incr("mount",amount=3)) 40 print(r.incr("mount",amount=6)) 41 print(r.get("mount")) #輸出:12
42 # 字符串轉化為浮點數,再自增。incrbyfloat(self, name, amount=1.0)
43 print(r.incrbyfloat('mount', amount=1.0)) 44 #自減name對應的值,當name不存在時,則創建name=amount,否則,則自減,amount為自增數(整數)
45 print(r.decr("mount",amount=6)) 46
47 #在name對應的值后面追加內容
48 r.set("name","zhangsan") 49 r.append("name","lisi") 50 print(r.get("name")) #輸出:zhangsanlisi
51
52 # 獲取值
53 print(r.get('name')) # 獲取值
54 print(r.mget("name1","name2")) #批量獲取
55 print(r.mget(["name3","name4"])) #批量獲取
56
57 # 讀取后重設 getset(name, value)
58 #設置新值,打印原值
59 print(r.getset("name1","wangwu")) #輸出:zhangsan
60 print(r.get("name1")) #輸出:wangwu
61
62 #根據字節獲取子序列 getrange(key, start, end)
63 print(r.getrange("name",0,3))#輸出:zzan
64
65 print(r.strlen("name")) #返回name對應值的字節長度(一個漢字3個字節)
66
67
68
69
70
71 # =============================2、Hash 操作===============================
72 # 增改操作
73 # hset(name, key, value) #name對應的hash中設置一個鍵值對(不存在,則創建,否則,修改)
74 r.hset("dic_name","a1","aa") 75 r.hmset("dic_name",{"a1":"aa","b1":"bb"}) #在name對應的hash中批量設置鍵值對,mapping:字典
76
77 #自增hash中key對應的值,不存在則創建key=amount(amount為整數)
78 print(r.hincrby("dic_name","a",amount=2)) 79 #自增hash中key對應的值,不存在則創建key=amount(amount為浮點數)
80 print(r.hincrbyfloat("dic_name","a",amount=1.0)) 81
82 # 查詢操作
83 print(r.hget("dic_name","a1")) #在name對應的hash中根據key獲取value
84 print(r.hmget("dic_name",["a1","b1"])) # 在name對應的hash中獲取多個key的值
85 print(r.hmget("dic_name","a1","b1")) # 在name對應的hash中獲取多個key的值
86 print(r.hgetall("dic_name")) #獲取name對應hash的所有鍵值
87 print(r.hlen("dic_name")) #hlen(name) 獲取hash中鍵值對的個數
88 print(r.hkeys("dic_name")) #hkeys(name) 獲取hash中所有的key的值
89 print(r.hvals("dic_name")) #hvals(name) 獲取hash中所有的value的值
90
91 print(r.hexists("dic_name","a1")) # 檢查name對應的hash是否存在當前傳入的key
92
93
94 # 刪除
95 r.hdel("dic_name","a1") #刪除指定name對應的key所在的鍵值對
96
97 # =============================3、List 操作===============================
98 #增改操作
99 # 在name對應的list中添加元素,每個新的元素都添加到列表的最左邊.不存在列表是創建列表
100 r.lpush("list_name",2) 101 r.lpush("list_name",3,4,5)#保存在列表中的順序為5,4,3,2
102 # rpush(name,values)#同lpush,但每個新的元素都添加到列表的最右邊
103 # lpushx(name,value)#在name對應的list中添加元素,只有name已經存在時,值添加到列表的最左邊
104 # rpushx(name,value)#在name對應的list中添加元素,只有name已經存在時,值添加到列表的最右邊
105
106 # linsert(name, where, refvalue, value)) 其中where: BEFORE(前)或AFTER(后),refvalue: 列表內的值 value: 要插入的數據
107 r.linsert("list_name","BEFORE","2","SS") #在列表內找到第一個元素2,在它前面插入SS
108 r.lset("list_name",0,"bbb") #對list中的某一個索引位置重新賦值
109 r.lpop("list_name") #移除列表的左側第一個元素,返回值則是第一個元素
110 r.rpoplpush('list1_name', 'list2_name') # 從一個列表取出最右邊的元素,同時將其添加至另一個列表的最左邊
111
112 # 查詢操作
113 print(r.llen("list_name")) # name對應的list元素的個數
114 print(r.lindex("list_name",1)) #根據索引獲取列表內元素
115 print(r.lrange("list_name",0,-1)) #分片獲取元素
116
117
118 # 刪除操作
119 r.lrem("list_name","SS",num=0) #r.lrem(name, value, num) 其中value: 要刪除的值 num: num=0 刪除列表中所有的指定值;num=2 從前到后,刪除2個;num=-2 從后向前,刪除2個'''
120 r.ltrim("list_name",0,2) #移除列表內沒有在該索引之內的值
121
122 print(r.blpop(["list_name","list_name1"],timeout=0)) #將多個列表排列,按照從左到右去移除各個列表內的元素。timeout: 超時時間,獲取完所有列表的元素之后,阻塞等待列表內有數據的時間(秒), 0 表示永遠阻塞
123 # r.brpop(keys, timeout) #同blpop,將多個列表排列,按照從右向左去移除各個列表內的元素
124
125 # =============================4、set 操作===============================
126 # 增改操作
127 #給name對應的集合中添加元素
128 r.sadd("set_name","aa") 129 r.sadd("set_name","aa","bb") 130 r.smove("set_name1", "set_name2", 'aa') #將某個元素從一個集合中移動到另外一個集合
131 r.spop("set_name") #從集合的右側移除一個元素,並將其返回
132
133
134
135 # 查詢操作
136 print(r.smembers('set_name')) #獲取name對應的集合的所有成員
137 print(r.scard("set_name")) #獲取name對應的集合中的元素個數
138 print(r.sdiff("set_name","set_name1","set_name2"))# 在第一個name對應的集合中且不在其他name對應的集合的元素集合
139 # sdiffstore(dest, keys, *args) #相當於把sdiff獲取的值加入到dest對應的集合中
140
141 print(r.sinter("set_name","set_name1","set_name2")) # 獲取多個name對應集合的交集
142 # sinterstore(dest, keys, *args) #獲取多個name對應集合的交集,再將其加入到dest對應的集合中
143 print(r.sunion("set_name","set_name1","set_name2")) #獲取多個name對應的集合的並集
144 # sunionstore(dest,keys, *args)#獲取多個name對應的集合的並集,並將結果保存到dest對應的集合中
145
146 print(r.srandmember("set_name2",2)) # 從name對應的集合中隨機獲取numbers個元素
147
148 print(r.sismember("set_name", 'aa')) #檢查value是否是name對應的集合內的元素
149
150 # 刪除操作
151 r.srem("set_name2","bb","dd") #刪除name對應的集合中的某些值
152
153 # =============================5、有序集合 操作===============================
154 # 在集合的基礎上,為每元素排序,元素的排序需要根據另外一個值來進行比較,所以,對於有序集合,每一個元素有兩個值,即:值和分數,分數專門用來做排序。
155 # 增改操作
156 r.zadd("zset_name", "a1", 6, "a2", 2,"a3",5) # 在name對應的有序集合中添加元素
157 r.zadd('zset_name1', b1=10, b2=5) # 在name對應的有序集合中添加元素
158
159
160
161 # 查詢操作
162 print(r.zcard("zset_name")) #獲取有序集合內元素的數量
163 print(r.zcount("zset_name",1,5)) #獲取有序集合中分數在[min,max]之間的個數
164
165 r.zincrby("zset_name","a1",amount=2)#自增zset_name對應的有序集合里a1對應的分數
166
167 # 按照索引范圍獲取name對應的有序集合的元素.start起始索引,end終點索引,desc排序規則,默認按照分數從小到大排序,withscores是否獲取元素的分數,默認只獲取元素的值,score_cast_func 對分數進行數據轉換的函數
168 aa=r.zrange("zset_name",0,1,desc=False,withscores=True,score_cast_func=int) 169
170
171 print(r.zscore("zset_name","value1")) #獲取name對應有序集合中 value 對應的分數
172 print(r.zrank("zset_name", "value1")) #獲取value值在name對應的有序集合中的排行位置(從0開始)
173 print(r.zrevrank("zset_name", "value1"))#從大到小排序
174
175 # 刪除操作
176
177 r.zrem("zset_name","value1","value2") #刪除name對應的有序集合中值是values的成員
178 r.zremrangebyrank("zset_name", 3, 5) #根據排行范圍刪除
179 r.zremrangebyscore("zset_name", 3, 5) #根據分數范圍刪除
180 r.zinterstore("zset_dest",("zset_name1","zset_name2"),aggregate="MAX") # 獲取兩個有序集合的交集並放入dest集合,如果遇到相同值不同分數,則按照aggregate進行操作:aggregate的值為: SUM MIN MAX
181 # r.zunionstore(dest, keys, aggregate=None) #獲取兩個有序集合的並集並放入dest集合,其他同zinterstore,
182
183
184 # =============================6、通用操作===============================
185 r.delete('name') #根據name刪除redis中的任意數據類型
186 print(r.exists('name')) #檢測redis的name是否存在
187 print(r.keys(pattern='*')) #根據* ?等通配符匹配獲取redis的name
188 print(r.expire('name' ,time=3000)) # 為某個name設置超時時間
189 r.rename('name', 'name1') # 重命名
190 r.move('name', 'db1') # 將redis的某個值移動到指定的db下
191 print(r.randomkey()) #隨機獲取一個redis的name(不刪除)
192 print(r.type('name')) # 獲取name對應值的類型
193
194 # redis-py默認在執行每次請求都會創建(連接池申請連接)和斷開(歸還連接池)一次連接操作,
195 # 如果想要在一次請求中指定多個命令,則可以使用pipline實現一次請求指定多個命令,並且默認情況下一次pipline 是原子性操作。
196 pipe = r.pipeline(transaction=True) 197
198 r.set('name', 'zhangsan') 199 r.set('name', 'lisi') 200
201 pipe.execute()
原文鏈接:https://blog.csdn.net/luanpeng825485697/article/details/79363490