非關(guān)系型數(shù)據(jù)庫Redis
Redis是為了實現(xiàn)高速緩存服務,減小MySQL數(shù)據(jù)庫的壓力
Linux服務起停
CentOS
systemctl start 服務名 -> 啟動
systemctl stop 服務名 -> 停止
systemctl restart 服務名 -> 重啟
systemctl status 服務名 -> 查看狀態(tài)
systemctl enable 服務名 -> 開機自啟
systemctl disable 服務名 -> 禁止自啟
Ubuntu
service 服務名 start -> 啟動
進程查殺
ps -ef | grep "" -> 搜索全部包含字符串的內(nèi)容
ps -ef | grep "" | grep -v "grep" -> 搜索全部包含字符串的內(nèi)容并且過濾掉包含grep的內(nèi)容
ps -ef | grep -E正則表達式 -> 搜索全部包含符合正則表達式的內(nèi)容
xargs -> 將列變成行
ps -ef | grep "redis-server" | grep -v "grep" | awk '{print $2}' | xargs kill -> 精準查殺進程
pkill 進程名 -> 根據(jù)名字殺掉進程
killall 進程名 -> 根據(jù)名字殺掉進程
redis命令
ttl key ------> 查看key的存活時間
set key value ex N ------> 設(shè)置key的存活時間為N秒
set key value px N ------> 設(shè)置key的存活時間為N毫秒
shutdown ------> 關(guān)閉redis服務器
shutdown save ------> 保存并關(guān)閉redis服務器
save ------> 保存
bgsave ------> 后臺保存
dbsize ------> 查看數(shù)據(jù)庫大小
keys * ------> 獲取所有的key
keys ta* ------> 獲取ta開頭的key
redis默認開啟了16個數(shù)據(jù)庫
select 0-15 ------> 切換數(shù)據(jù)庫
flushdb ------> 清空當前數(shù)據(jù)庫
flushall ------> 清空所有數(shù)據(jù)庫
type keyp ------> 判斷key的類型
redis的數(shù)據(jù)類型
1.字符串 - string
set key value
get key
strlen key
append key value ------> 追加
mset key1 value1 key2 value2 ... ------> 同時設(shè)置多組值
mget key1 key2 ...
incr key ------> 當key的值為數(shù)字時,數(shù)值加一
incrby key N ------> 為key的值加N
decr key ------> 減一
decrby key N ------> 減N
getrange key m n ------> 從m取到n
setrange key N value ------> 從n開始用value覆蓋key的value值
2.哈希 - hash
hset key field value 設(shè)置鍵和值
hmset key field1 value1 field2 value2 同時設(shè)置多個鍵和值
hget key field 查看指定的鍵對應的值
hmget key fieldl field2 同時查看多個鍵和值
hgetall key 獲取所有的值和鍵
hkeys key 獲取所有的鍵
hvals key 獲取所有的值
hexists key filed 判斷是否存在對應的值
3.列表 - list
lpush list value1 value2 ... 插入到最左邊
rpush list value1 value2 ... 插入到最右邊
lpop list 取最左邊
rpop list 取最右邊
lrange list start end 查看列表片段
lindex list index 查看指定下標對應的元素
llen list 列表長度
lrem list count value 刪除指定個數(shù)的元素
4.集合 - set
sadd set value1 value2 ... 添加元素
srem set value 移除元素
spop set 獲取隨機元素
smembers set 查看所有元素
sismember set value 查看元素是否在集合內(nèi)
scard set 查看元素個數(shù)
sinter set1 set2 交集
sunion set1 set2 并集
sdiff set1 set2 差集
5.有序集合 - zset(元素自帶一個值,可以修改)
zadd zset score1 mem1 score2 mem2 ... 添加
zrem zset mem 移除
zrange zset start end 按score升序查看
zrevrange zset start end 按score降序查看
zscore zset mem 查看score值
zincrby zset value mem 改變score的值
6.地理位置(LBS應用-Location-Based Service - 基于位置的服務)
geoadd zset longitude1 latitude1 member1 longitude2 latitude2 member2 ... 添加經(jīng)緯度信息
geopos zset member1 member2 ... 獲取指定的位置的經(jīng)緯度
geodist zset member1 member2 [unit] 計算兩點間的距離,默認單位是米,[unit]是單位,可以修改為m,km,mi英里,ft英尺
georadius zset longitude1 latitude1 radius m/km/mi/ft 獲取以點zset為圓心,radius為半徑的圓的范圍內(nèi)的所有的坐標點;后面加withdist,可同時獲取距離,加withcoord,可同時獲取點的經(jīng)緯度
加密技術(shù)
對稱加密 : 加密和解密使用相同的密鑰 - AES
非對稱加密 : 加密和解密使用不同的密鑰(公鑰和私鑰) - 適合互連網(wǎng) - RSA
免密操作
ssh-keygen -t rsa -b 2048 -c anjhon@163.com - 生成公鑰和私鑰
t 指定算法; b 指定強度; c 指定郵箱
進入到.ssh文件,
id_rsa - 私鑰
id_rsa.pub - 公鑰
將公鑰復制到網(wǎng)站的公鑰設(shè)置
若有known-hosts文件,且網(wǎng)站鏈接不上,直接刪除known-hosts文件
Python中的redis
連接redis服務器:
redis.Redis(host='', password='', prot='')
host : redis所在服務器公網(wǎng)地址;
password : 登錄口令;
port : redis的服務端口
連接時會返回一個連接對象:
redis_cli = redis.Redis(host='', password='', prot='')
使用redis完成相應的操作
python中使用redis的數(shù)據(jù)類型:
import redis # 導入redis模塊
redis_cli = redis.Redis(host='10.10.10.10', password='123456', port='6379') # 連接redis服務器
# print(redis_cli)
if redis_cli.ping():
# hash的使用
redis_cli.hmset('stu1', {
'stuname': 'xiaoming',
'stuid': '001',
'stusex': '1',
'stuaddr': '肖家河'
})
print(redis_cli.hget('stu1', 'stuname'))
# 有序集合的使用
redis_cli.zadd('zset1', {
'an': 100,
'yong': 200,
'duan': 300
})
items = redis_cli.zrevrange('zset1', 0, -1)
print(list(map(bytes.decode, items)))
print(redis_cli.zscore('zset1', 'an'))
# 列表的使用
redis_cli.rpush('list1', 1, 2, 3, 4, 5)
list1 = redis_cli.lrange('list1', 0, -1)
print(list(map(int, list1)))
# 字符串的使用
redis_cli.set('username', 'an')
print(redis_cli.ttl('username'))
print(redis_cli.get('username').decode('utf-8'))
redis_cli.set('user_age', '25')
redis_cli.set('user_tel', '133')
else:
print('連接失敗')
擴展:
pip freeze > requirement.txt 將虛擬環(huán)境依賴項寫入到文件
pip install -r requirement.txt 按照文件安裝依賴項
序列化: 把一個對象變成字符串(str)或字節(jié)串(bytes)
反序列化: 把字符串或者字節(jié)串還原成對象
json.dumps() 序列化(字符串轉(zhuǎn)換成字節(jié)串)
json.loads() 反序列化(字節(jié)串轉(zhuǎn)換成字符串)
pickle.dumps() 序列化(字符串轉(zhuǎn)換成字節(jié)串)
pickle.loads() 反序列化(字節(jié)串轉(zhuǎn)換成字符串)
數(shù)據(jù)上傳redis服務器并從redis獲取數(shù)據(jù)
import redis
import pickle
class Student:
def __init__(self, name, age, sex, addr):
self.name = name
self.age = age
self.sex = sex
self.addr = addr
def __repr__(self): # 魔法方法(將數(shù)據(jù)顯示出來)
return '%s, %d, %s, %s' % (self.name, self.age, self.sex, self.addr)
stu1 = Student('小明', 20, '男', '昆明')
stu2 = Student('小黃', 30, '女', '上海')
list1 = [stu1, stu2] # 將學生對象添加到列表中
redis_cli = redis.Redis(host='10.10.10.10', password='123456', port='6379') # 連接redis服務器
if redis_cli.ping():
# redis_cli.set('student_all', pickle.dumps(list1)) - 將本地的數(shù)據(jù)添加到redis
redis_stu = pickle.loads(redis_cli.get('student_all')) # 獲取redis內(nèi)的數(shù)據(jù)并進行反序列化
print(redis_stu)
else:
print('連接失敗')
將redis作為用戶請求和數(shù)據(jù)庫之間的緩存介質(zhì)
import pymysql
import redis
import pickle
import time
def load_depts_from_db():
conn = pymysql.connect( # 連接本地的MySQL服務器
host='localhost',
port=3306,
user='root',
password='123456',
charset='utf8',
autocommit=True,
database='hrs'
)
depts = ()
try: # 異常捕獲
with conn.cursor() as cursor:
cursor.execute('select dno, dname, dloc from tb_dept') # 獲取數(shù)據(jù)
depts = cursor.fetchall()
except pymysql.MySQLError as err:
print(err)
finally:
conn.close()
return depts
def main():
redis_cli = redis.Redis(host='10.10.10.10', password='123456', port='6379')
start = time.time()
data = redis_cli.get('depts') # 獲取redis的depts對應的數(shù)據(jù)
if data:
depts = pickle.loads(data) # 若獲取到數(shù)據(jù),將數(shù)據(jù)反序列化并保存下來
else:
depts = load_depts_from_db() # 若沒有數(shù)據(jù),從數(shù)據(jù)庫獲取數(shù)據(jù),并將數(shù)據(jù)保存到redis中,以便下次使用時優(yōu)先從redis中獲取,以減輕服務器的壓力并且提高數(shù)據(jù)獲取效率
redis_cli.set('depts', pickle.dumps(depts))
end = time.time()
print(depts)
print(f'執(zhí)行時間: {end - start}秒')
if __name__ == '__main__':
main()