redis非關係型資料庫的基本型別以及簡單操作
2018.01.19**************************************************************
author: wills
redis有五大型別 sting hash list set zset
set p 1 設定p的值為1
get p 獲取p的值
incr p 整數p的值增加1
decr p 整數p的值減少1
redis相關 REmote Dictionary Server
增
1. set mykey “test” 為鍵mykey設定新值,並覆蓋原有值
2. getset mcounter 0 先取值mcounter的值,再給mcounter賦值,取得值是mcounter之前的值
3. setex mykey 10 “hello” 設定mykey的過期時間為10s,在存活時間內可以取mykey的值,過期後mykey不在存在
4. setnx mykey “hello” 若該鍵不存在,則為該鍵設定新值
刪
1. del mykey 刪除已有鍵
改
1.append mykey “hello” 若該鍵不存在,返回當前value的長度,若存在則返回追加後的長度
2. incr mykey 如果mykey的值是整數則其值增加1,否則出錯
3. decr mykey 如果mykey的值是整數其值減一,否則報錯
4. decrby mykey 3 如果mykey的值為整數則其值 - 3
5. setrange mykey 20 dd 把mykey中第21和22
查
1. exists mykey 判斷mykey這個鍵是否存在,存在返回1,不存在返回0
2. get mykey 獲取mykey對應的值
3. strlen mykey 檢視mykey的長度
4. ttl mykey 檢視mykey的存活時間,一直存在則為-1,不存在-2 ,有存在時間則返回剩餘存在時間
5. mget key1 key2 key3 批量的獲取鍵
6. 檢視資料型別 type p
下面是一個我用python模擬賬號登入的操作,輸入的賬號和密碼先和非關係型資料庫redis裡面的資料進行,當比較結果匹配時直接顯示登入成功,如果不匹配,那麼再去關係型資料集mysql裡面login這個儲存使用者名稱和密碼的表裡查詢,看有沒有匹配,如果匹配成功則返回登入成功,並且修改redis對應的值,如果還是沒有匹配那麼返回錯誤,程式碼如下。
# 匯入sys模組,用於接收命令列傳入的引數,模擬使用者在網頁或者app上輸入的賬號密碼
import sys
# 匯入pymysql,redis模組用於連線相關資料庫
import pymysql
import redis
# 定義連線mysql的函式
def con_mysql(sql):
# 連線的資料庫是我自己放在阿里雲伺服器上的,埠是預設的3306
# db表示我的資料放在test1資料庫裡面
db = pymysql.connect(
host='120.79.131.105',
user='root',
passwd='13579',
db='test1',
port=3306,
charset='utf8')
# 建立一塊快取區,儲存sql語句執行後獲得的結果
cursor = db.cursor()
# 執行sql語句,sql語句通過引數傳入
cursor.execute(sql)
data = cursor.fetchall()
db.close()
# 返回值會執行sql語句返回的結果
return data
# 定義連線redis函式
def con_redis():
return redis.Redis(host='120.79.131.105', password='123456', port=6379)
def main():
# 首先獲取傳入的引數使用者名稱和密碼
username = sys.argv[1]
passwd = sys.argv[2]
# 連線redis,獲得一個物件r,用r對redis裡面的資料進行相應的操作
r = con_redis()
# 查詢redis中名為user的雜湊表,裡面存放著所有的使用者名稱和密碼
r_names = r.hkeys('user')
flag = False
# user表的鍵表示使用者名稱,對其進行遍歷,看看有沒有和輸入使用者名稱相同的,如果有繼續比較相應的密碼,如果沒有則進入下一步,flag標籤在這裡用來進行特殊條件判斷
# flag初始值=2,一旦進入迴圈,其值變為false,
for name in r_names:
name = name.decode('utf8')
# 如果使用者名稱存在,再查詢相應的密碼
if username == name:
r_passwd = r.hget('user', username).decode('utf8')
if r_passwd == passwd:
flag = True
print('登入成功')
# 如果找到對應的賬號密碼輸出登入成功,並且跳出迴圈,並且將flag的值置為True
break
# 如果在redis沒有找到對應賬號密碼,再去mysql裡面尋找
if not flag:
# sql表示資料庫查詢語句
sql = 'select * from login;'
mysql = con_mysql(sql)
f = True
for user in mysql:
if user[0] == username and user[1] == int(passwd):
r.hset('user', username, passwd)
print('登入成功,重新整理redis')
f = False
break
if f:
print('使用者名稱或密碼錯誤')
# 這裡表示在資料庫也沒有找到對應的賬號與密碼
else:
print('使用者名稱或密碼錯誤')
if __name__ == '__main__':
main()