4.3 Redis緩存數(shù)據(jù)庫

非關(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()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捺癞,一起剝皮案震驚了整個濱河市注整,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雏吭,老刑警劉巖牵触,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咐低,居然都是意外死亡揽思,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門见擦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钉汗,“玉大人,你說我怎么就攤上這事鲤屡∷鹛担” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵酒来,是天一觀的道長卢未。 經(jīng)常有香客問我,道長堰汉,這世上最難降的妖魔是什么辽社? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮翘鸭,結(jié)果婚禮上滴铅,老公的妹妹穿的比我還像新娘。我一直安慰自己就乓,他們只是感情好汉匙,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著生蚁,像睡著了一般噩翠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上邦投,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天绎秒,我揣著相機與錄音,去河邊找鬼尼摹。 笑死见芹,一個胖子當著我的面吹牛剂娄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播玄呛,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼阅懦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了徘铝?” 一聲冷哼從身側(cè)響起耳胎,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惕它,沒想到半個月后怕午,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡淹魄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年郁惜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甲锡。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡兆蕉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缤沦,到底是詐尸還是另有隱情虎韵,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布缸废,位于F島的核電站包蓝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏企量。R本人自食惡果不足惜养晋,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梁钾。 院中可真熱鬧绳泉,春花似錦、人聲如沸姆泻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拇勃。三九已至四苇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間方咆,已是汗流浹背月腋。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榆骚。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓片拍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妓肢。 傳聞我的和親對象是個殘疾皇子捌省,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容