Redis
Windows下直接解壓可用,連接:https://pan.baidu.com/s/1rD4ujoN7h96TtHSu3sN_hA 密碼:t02credis
1、簡介
- redis是一種高速高性能的內存數據庫,存儲的是鍵值對數據;
- 因爲極高的存儲和訪問速度,redis常被用來做爲數據緩存服務器;
- 另外redis是支持數據持久化的(即redis會自動將數據寫入磁盤)——這是redis大殺四方的重要緣由;
- redis支持多個slave端同時向master端進行寫入,這常常被用在分佈式爬蟲等場景中;
- 2010年之後redis開始大面積流行,關係型數據庫(核心數據)+redis(緩存)是常規的、常見的數據解決方案;
1 Redis的數據類型
- 字符串string
- 哈希hash
- 列表list
- 集合set
- 有序集合zset
2、Redis管理基本操做
- redis-server.exe redis.windows.conf // 使用配置啓動redis服務
- redis-cli.exe // 打開客戶端
- redis-cli --help // 查看客戶端幫助
- redis-cli -h 127.0.0.1 -p 6379 -a 123456 // 使用密碼訪問遠程redis
- redis-cli --stat -a 123456 // 查看服務狀態
- help @xxx // 分類幫助信息
- help @connection
- select 15 // 選擇最後一個數據庫(共提供16個數據庫)
- quit // 退出客戶端
- help @server
- flushdb //清空當前庫數據,謹慎使用
- flushall // 清空全部數據庫,謹慎使用
- monitor // 監視服務端收到的信息
- auth 123456 // 使用密碼登陸
- ping // 測試服務端鏈接狀態
3、Redis數據基本操做
一、 key
- keys * //顯示全部鍵,慎用,數據量大時致使卡死
- keys a* // 顯示全部以a開頭的鍵
- exists name age //判斷name和age這兩個鍵存在幾個
- type name //查看值的類型
- del name age //刪除鍵
- expire name 30 //name鍵值30秒過時
- ttl name //查看鍵值的過時時間
- persist name // 取消鍵的過時時間
- rename name nickname // 重命名鍵(這樣作不安全,容易覆蓋已有數據)
- renamenx name nickname // 確保不會覆蓋其它鍵才重命名(nx=not exists,x後綴=exists)
二、 字符串string
- 設置
- set name bill //設置鍵值
- setex name 20 bill //鍵值20秒後過時
- mset age 60 gender male //一次性存儲多個鍵值
- 獲取
- get name //不存在則返回null
- mget name age //一次性拿取多個鍵值
- 運算
- incr/decr age //將age加減1
- incrby/decrby age 20 //將age加減20
- 其它
- append name gates //向原有value拼接字符串,不存在時等同於set
- strlen key //獲取值長度
三、 哈希hash
- hset p1 name bill // 設置p1對象的name爲bill
- hset p1 age 18 // 設置p1對象的age爲18
- hmset p2 name jobs age -1 //設置p2對象的name爲jobs,age爲-1
- hget p1 name // 獲取p1的name屬性值
- hmget p1 name age // 同時獲取p1的name和age
- hgetall p1 // 獲取p1的所有鍵值
- hkeys p1 // 獲取p1的所有鍵
- hvals p1 // 獲取p1的所有值
- hlen p1 // 獲取p1中全部字段的數量
- hexists p1 name // 判斷p1中是否有name字段
- hdel p1 name // 刪除p1中的name字段
- hdel p2 name age // 刪除p2中的name和age字段
- hstrlen p1 age // p1中的age的長度
四、 列表list
- lpush mlist 2 // 從左側向列表mlist追加元素2
- rpush mlist 3 // 從右側向列表mlist追加元素3
- linsert mlist after 3 4 // 在列表mlist中3的後邊追加元素4
- lset mlist 1 200 // 設置列表mlist中的第1個元素爲200(下標從0開始)
- lrange mlist 0 3 // 查看列表mlist中下標[0到3]的元素
- lrange mlist 0 -1 //從頭看到尾
- lpop mlist // 從列表左側彈出一個值
- rpop mlist // 從列表右側彈出一個值
- ltrim mlist 0 1 // 修剪掉mlist下標[0,1]之外的元素
- llen mlist // 列表元素個數
- lindex mlist 0 // 獲取mlist中下標0的元素
五、 集合set
- sadd mset 1 2 3 4 // 向集合mset中添加元素1,2,3,4
- smembers mset // 查看集合mset中的元素
- scard mset // 查詢集合元素個數
- sinter mset mset2 //求mset和mset2的交集
- sunion mset mset2 // 求mset和mset2的並集
- sdiff mset mset2 //求mset相比mset2的差集(mset有而mset2無的部分)
- sismember mset 3 //判斷3是不是mset中的元素
六、 有序集合zset
- zadd mzset 10 bill 9 jobs 6 jackma // 添加多個值及相應權重
- zrange mzset 0 -1 // 返回第一個到最後一個之間全部的元素,按權重升序排列
- zcard mzset // 元素個數
- zcount mzset 6 10 // 下標6-10之間的元素個數
- zscore mzset jackma // 返回 jackma在mzset中的權重
4、圖形界面客戶端
連接:https://pan.baidu.com/s/1Ndt61mEK2IFIugUkfdlzuw 密碼:q8i5數據庫
5、與Python的交互
方法一:
模塊引入參考
中的安裝第三方模塊windows
方法二:緩存
pip install redis
模塊名稱:redis。安全
- rClient = redis.Redis(…)
- rClient.set(‘name’,‘bill’)
import redis
client = redis.Redis(
host='localhost',
port=6379,
db=5,
password='123456'
)
ret = client.set("name", "bill")
print(client.get('name'))#b'bill'
print(ret, type(ret))#True <class 'bool'>
client.mset({'age': 60, 'gender': 'male'})
print(client.mget('name', 'age', 'gender'))#[b'bill', b'60', b'male']
client.hmset("p1", {'name': 'jobs', 'age': -1, 'gender': 'male'})
print(client.hgetall('p1'))#{b'name': b'jobs',
b'age': b'-1',
b'gender': b'male'}
client.lpush('mlist', 2, 3, 4)
print(client.lrange('mlist', 0, -1))#[b'4', b'3', b'2']
client.sadd('mset', 'bill', 'steve', '被KO的藝龍')
print(client.smembers('mset'))#{b'steve',
b'\xe8\xa2\xabKO\xe7\x9a\x84\xe8\x89\xba\xe9\xbe\x99',
b'bill'}
client.zadd('mzset', 'bill', 10, 'steve', 11, jack=8)
print(client.zrange('mzset',0,-1))#[b'jack', b'bill', b'steve']
print('GAME OVER!')
輸出:
Connected to pydev debugger (build 173.4674.54)
b'bill'
True <class 'bool'>
[b'bill', b'60', b'male']
{b'name': b'jobs', b'age': b'-1', b'gender': b'male'}
[b'4', b'3', b'2']
{b'bill', b'\xe8\xa2\xabKO\xe7\x9a\x84\xe8\x89\xba\xe9\xbe\x99', b'steve'}
[b'jack', b'bill', b'steve']
GAME OVER!
6、redis事務
- redis支持事務的方式
- 將批量數據操做逐個加入隊列
- 若是批量操做過程當中發生異常,不提交事務便可
- 提交事務,執行隊列中的全部操做,並保證其原子性
- 注意事項
- 數據操做在加入隊列時不會進行語法檢查
- 若是數據操做存在語法錯誤,會形成只有部分數據提交的BUG
- 此時redis也並不支持事務回滾
- 因此語法錯誤必須在上線前自行完成檢查和修正
- 主要事務操做
- 命令行執行事務
- WATCH key1 key2 key3
- 觀察本次事務要修改的key,若是該key在事務執行過程當中被其它事務修改,則當前事務提交不能成功
- 目的:保證併發安全
- multi
- 執行具體事務操做(增刪改查)
- exec
- 提交事務,若是觀察的key被其它事務併發修改,則本次事務提交無效
- Python中執行事務
- API
- pipe = client.pipiline()
- pipe.watch(‘a’, ‘b’, ‘c’)
- pipe.multi()
- CRUD…
- except WatchError as we:…
- pipe.reset()
- pipe.execute()
'''
redis事務
·redis事務機制保證【正確事務代碼】的原子性(所有執行或所有放棄)
·對於語法錯誤的代碼,redis不支持異常和回滾
·redis的態度:語法錯誤應該在上線以前自行發現並修正
'''
import redis
txClient = redis.Redis(
host='localhost',
port=6379,
db=7,
password='123456' )
pipe = txClient.pipeline(transaction=True)
try:
pipe.watch('who', 'a', 'b', 'c')
pipe.multi()
pipe.set('who', 'leijun', ex=60 * 5)
print(pipe.get('who'))
pipe.hmset('p1', {'who': 'leijun', 'age': 50, 'word': 'are you ok'})
print(pipe.hgetall('p1')) # print(5 / 0)
# 普通業務異常,被try所捕獲,事務不會提交
# pipe.incr("p1")
# redis語法錯誤,只有提交時纔會發生異常且沒法回滾,必須在上線前予以修正
pipe.incr('a')
pipe.incr('b')
pipe.incr('c')
except WatchError as we:
pipe.reset()#清空管道
print('監控數據被外界污染,事務已取消!we=',we)
except Exception as e:
print("bad luck:e=", e)
print('事務未提交')
else:
try:
pipe.execute()
print('事務已提交')
except Exception as e:
print('事務提交異常,請檢查代碼語法!e=',e)
輸出:
Connected to pydev debugger (build 173.4674.54)
Pipeline<ConnectionPool<Connection<host=localhost,port=6379,db=7>>>
Pipeline<ConnectionPool<Connection<host=localhost,port=6379,db=7>>>
事務已提交