redis基本操作

余生没有余生發表於2024-11-29

為什麼學習redis,前幾天有個需求,用到了redis庫,之前學習過但僅限於大學的時候,這個時候差不多忘光了,需求測的時候也是現學的幾個查詢指令。印象最深的是開發設計的時候儲存了10個不同key值但value(list字串)相同的資料,當時問過為什麼要存十個,解釋為 “為了防止頻繁的訪問一個key導致的熱key問題,所以儲存10個相同value的key,隨機訪問,分散壓力”。後面查詢資料才發現,頻繁訪問一個會導致CPU資源過載,記憶體資源緊張,負載不均衡等問題。

一.環境搭建

我是直接在網上下載的win redis-x64.zip壓縮包,解壓到本地後可以看到兩個檔案,一個是redis-server.exe redis服務啟動程式,另一個是redis-cli.exe redis客戶端操作程式。壓縮包地址:https://pan.baidu.com/s/1t_NpWnE_qj4TvyESyvXYDA?pwd=4c0a 提取碼:4c0a

二.基本使用

1.啟動服務

redis-server.exe redis.windows.conf  # 在解壓目錄下開啟cmd,執行此命令

2.開啟redis客戶端連線

redis-cli.exe  # 在解壓目錄下另外開啟cmd,執行此命令,服務不要關閉

輸入ping返回PONG即連線成功

ip預設本地ip,埠預設6379

3.切換庫

select index  # redis共有16個庫,index為0-15,預設為0號庫

4.設定key和value值

set key value   # 設定key值和對應的value值
get key  # 透過key獲取value值

5.停止服務

shutdown

6.其它常用操作

dbsize:檢視當前庫key值數量

flushdb:刪除當前庫所有資料

exit:退出客戶端連線

keys *:檢視當前庫所有key值(還可模糊匹配:*萬用字元,?佔位符,例:*明*,*ming,li*)

exists key:判斷key是否存在(例:exists name 存在返回1,不存在返回0)

expire key seconds:設定key過期時間(例如:expire name 30,設定name存活30s,30秒後key會失效刪除)

ttl key:查詢key剩餘存活時間(-1 表示未設定存活時間,永久生效,-2已失效,存活時間已過,正數表示剩餘存活時間)

type key:查詢vaule資料型別

del key:刪除key

append key value:在當前value末尾追加內容

strlen key:返回value長度

三.儲存型別

1.string

字串是Redis中最基本的資料型別,可以儲存任何形式的字串,包括數字、文字等

儲存時使用:set key value(透過set儲存的value都是string型別)

2.雜湊(Hash)

雜湊型別是一個鍵值對的集合,適用於儲存物件型別的資料。每個雜湊表可以包含多個欄位和值,非常適合表示具有多個屬性的資料物件

1)HSET key field value:設定雜湊表欄位的值。

2)HGET key field:獲取雜湊表欄位的值。

3)HDEL key field:刪除雜湊表的某個欄位

3.列表(list)

列表是一個雙向連結串列,支援在列表的兩端進行高效的插入和刪除操作

1)宣告一個key,value值為list的

lpush namelist 'liming'  # 當key不存在時,建立一個key並賦予value值

2)新增多個vallue

lpush namelist '2' '3'  # 預設在最左側新增,即(['3','2','liming'])

3)根據下標查詢value list值

lrange namelist 0 100  # 查詢namelist  key對於的value list中0-100的下標值

4)向list右側新增value值

rpush namelist 4 5  # 即['3','2','liming',4,5]

5)向右側新增單個元素值

 rpushx namelist 6  # 即[.......4,5,6],若key不存在則新增失敗

6)向左新增單個元素值

lpushx namelist 0  # 若key不存在則新增失敗

7)透過下標獲取對應的元素值

lindex namelist 2

8)刪除最左側的值

lpop namelist

9)刪除最右側的值

rpop namelist

10)刪除

lrem namelist 0 4  # 刪除list中值為4的全部元素
lrem namelist 2 4  # 刪除list中第二個元素值為4的元素

11)查詢list長度

llen key

12)插入元素

linsert key before 3 2  # 在3前插入2
linsert key after 3 2  #在3後插入2

4.集合(set)

集合是一種無序、不重複的資料型別。Redis提供了高效的集合操作,如求交集、並集、差集等

1)建立一個set型別的value值

sadd set 4 5 6  # 賦予set的元素值有三個,4,5,6

2)檢視全部的value值

smembers set

3)判斷value值是否存在

sismember key value

4)判斷元素個數

scard key

5)刪除元素

 srem set 1,2,3 4 5  # 刪除1,2,3  4  5三個元素值

5.有序集合(zset)

有序集合與普通集合類似,但每個元素都有一個關聯的分數(score),Redis會根據分數對元素進行自動排序

1)ZADD key score member:向有序集合中新增元素並指定分數

zadd age 1 2 2 3  # 新增兩個元素2,3

2)ZRANGE key start stop:獲取指定範圍內的有序集合成員

zrange age 0 100

3)ZREM key member:刪除有序集合中的某個元素

zrem age 4

四.python操作

1.安裝redis庫

pip install redis

2.例項操作

# pip install redis
import time

import redis

host = '127.0.0.1'  # redis服務地址
port = 6379  # redis服務埠

r = redis.StrictRedis(host=host, port=port, db=0, decode_responses=True)  # decode_responses=True設定true返回list型別,不設定返回位元組
r.delete('age')  # 刪除key
key = r.keys()  # 獲取資料庫所有的key,返回list
print(key)
r.set('python', 'python', ex=10)  # set(key,value,過期時間(ex設定的是秒,px設定毫秒))
time.sleep(3)
print(r.ttl('python'))  # 查詢key剩餘存活時間
r.set('python', 'pythoned', nx=True)
'''
nx=True當key值python不存在時,新增資料,存在則新增失敗
xx=True 當key值python存在時,修改value值
'''

print(r.get('python'))  # 透過key獲取value
print(r.dbsize())
r.quit()  # 關閉連線

操作方法和dos差不多,r為redis例項化物件,直接用r.的方式呼叫方法操作即可。

3.python實現隨機訪問key來避免頻繁的訪問一個key導致的熱key問題

import random

import redis

host = '127.0.0.1'  # redis服務地址
port = 6379  # redis服務埠

r = redis.StrictRedis(host=host, port=port, db=1, decode_responses=True)  # decode_responses=True設定true返回list型別,不設定返回位元組
key_list = ['key0', 'key1', 'key2', 'key3', 'key4', 'key5', 'key6', 'key7', 'key8', 'key9']
for key in key_list:
    r.set(key, 1)
keys = r.keys()
a = random.choice(keys)
print(r.get(a))

相關文章