Redis語句總結 一、基本概念 Redis 全稱: Remote Dictionary Server(遠程字典伺服器)的縮寫,以字典結構存儲數據,並允許其他應用通過TCP協議讀寫字典中的內容。 使用C語言編寫,並以記憶體作為數據存儲介質,所以讀寫數據的效率極高 *redis的官方只提供了linux版 ...
Redis語句總結
一、基本概念
Redis 全稱: Remote Dictionary Server(遠程字典伺服器)的縮寫,以字典結構存儲數據,並允許其他應用通過TCP協議讀寫字典中的內容。 使用C語言編寫,並以記憶體作為數據存儲介質,所以讀寫數據的效率極高
*redis的官方只提供了linux版本的redis,window系統的redis是微軟團隊根據官方的linux版本高仿的
二、Redis資料庫特點
-
Redis支持數據的持久化
可以將記憶體中的數據保存在磁碟中,重啟的時候可以再次載入進行使用
-
持久化的兩種方式:
-
RDB(Redis DataBase)
RDB持久化通過fork出一個子進程,在指定的時間間隔內將記憶體中的數據集快照寫入到二進位文件中。這個文件通常命名為`dump.rdb`。
-
AOF(Append Only File)
AOF持久化通過記錄所有的寫命令,並以追加式的方式將這些命令保存到AOF文件中。
-
-
三、Redis的應用場景
- 緩存系統("熱點" 數據:高頻讀、低頻寫):緩存用戶信息,優惠券過期時間,驗證碼過期時間、session、token等
- 計數器:帖子的瀏覽數,視頻播放次數,評論次數、點贊次數等
- 消息隊列,秒殺系統
- 排行榜(有序集合)
- 發佈訂閱:粉絲關註、消息通知
四、Redis安裝
-
安裝包下載地址 (建議使用5.X+版本)
-
平臺安裝軟體
-
Windows 系統安裝並啟動
Redis
-
雙擊 .msi 文件安裝軟體
-
通過指定配置文件路徑啟動
Redis
伺服器redis-server D:/soft/redis/redis.windows.conf
-
Redis
伺服器 啟動/停止# 啟動服務 redis-server --service-start # 關閉服務 redis-server --service-stop
-
-
-
Ubuntu平臺安裝軟體
安裝命令:sudo apt-get install -y redis-server 卸載命令:sudo apt-get purge --auto-remove redis-server 關閉命令:sudo service redis-server stop 開啟命令:sudo service redis-server start 重啟命令:sudo service redis-server restart 配置文件:/etc/redis/redis.conf
五、Redis基本配置
-
配置
# window下的配置文件保存在軟體 安裝目錄下 # mac或者linux操作系統Redis的配置信息在/etc/redis/redis.conf下。 # 查看編輯指令: sudo vi /etc/redis/redis.conf
-
核心配置選項
-
綁定ip:如果需要遠程訪問,可將此⾏註釋,或綁定⼀個真實ip
bind 127.0.0.1
-
端⼝,預設為6379
port 6379
-
是否以守護進程運⾏
# 1. 如果以守護進程運⾏,則不會在命令⾏阻塞,類似於服務 # 2. 如果以⾮守護進程運⾏,則當前終端被阻塞 # 3. 設置為yes表示守護進程,設置為no表示⾮守護進程 # 4. 推薦設置為yes daemonize yes
-
RDB持久化的備份文件
dbfilename dump.rdb
-
RDB持久化資料庫數據文件的所在目錄
dir /var/lib/redis
-
⽇志⽂件
logfile "/var/log/redis/redis-server.log"
-
資料庫,預設有16個
database 16
-
六、基本指令
# 啟動redis伺服器
sudo service redis start
# 關閉redis伺服器
sudo service redis stop
# 運⾏連接測試命令
ping
# 本地連接
redis-cli
# 遠程連接
redis-cli -h IP地址 -P 埠
# 切換數據數據(Redis預設支持16個資料庫,從0開始的遞增數字命名)
select 庫名
# 查看伺服器端和客戶端的幫助⽂檔
redis-server --help
redis-cli --help
# 其他指令
# 查看redis伺服器進程
ps aux | grep redis
# 殺死redis伺服器
sudo kill -9 pid
# 指定載入的配置文件
sudo redis-server /etc/redis/redis.conf
# 清空所有庫中鍵值對
flushall
# 清空當前庫中鍵值對
flushdb
五、Reids數據結構
- redis是key-value的數據結構,每條數據都是⼀個鍵值對
- 鍵的類型是字元串
- 鍵不能重覆
- 值的類型分為五種自有類型和一種自定義類型:
- 字元串string
- 哈希hash
- 列表list
- 集合set
- 有序集合zset
- 數據的操作行為
- 保存
- 修改
- 獲取
- 刪除
- 官⽹命令⽂檔
六、數據操作
1. string類型
字元串類型是 Redis 中最為基礎的數據存儲類型,它在 Redis 中是二進位安全的,這便意味著該類型可以接受任何格式的數據,如JPEG圖像數據或Json對象描述信息等。在Redis中字元串類型的Value最多可以容納的數據長度是512M。
【保存】
如果設置的鍵不存在則為添加,如果設置的鍵已經存在則修改
-
設置鍵值
set key value # eg: 設置鍵為name值為fl的數據 set name fl
-
設置鍵值,值不可修改
setnx key value # eg: 設置鍵為name值為fl的數據 setnx name fl # setnx鍵對應的值不可修改,這裡修改name無效 setnx name fl1 get name >> "fl"
-
設置多個鍵值
mset key1 value1 key2 value2 ... # eg: 設置鍵為'a1'值為'python'、鍵為'a2'值為'java'、鍵為'a3'值為'c' mset a1 python a2 java a3 c
-
追加值
append key value # eg: 向鍵a1對應的值中追加值' haha' append a1 'haha'
-
自增自減
# key 對用值必須為數字類型字元串 incr key decr key incrby key increment decrby key increment # eg: 向鍵age對應的值自增100 incrby age 100
-
查詢字元串長度
strlen key # eg: 查詢鍵age的長度 strlen age
【查詢】
-
獲取:根據鍵獲取值,如果不存在此鍵則返回nil
get key # eg: 獲取鍵'name'的值 get 'name'
-
根據多個鍵獲取多個值
mget key1 key2 ... # eg: 獲取鍵a1、a2、a3'的值 mget a1 a2 a3
2. 鍵命令
-
查找鍵,參數⽀持正則表達式
keys pattern # eg1: 查看所有鍵 keys * # *:匹配任意字元 # ?:匹配一個字元 # []:匹配括弧里的任一字元 # \ :轉義 # eg2: 查看名稱中包含a的鍵 keys 'a*'
-
判斷鍵是否存在,如果存在返回1,不存在返回0
exists key1 # eg: 判斷鍵a1是否存在 exists a1
-
查看鍵對應的value的類型
type key # eg:查看鍵a1的值類型,為redis⽀持的五種類型中的⼀種 type a1
-
刪除鍵及對應的值
del key1 key2 ... # eg: 刪除鍵a2、a3 del a2 a3
-
設置過期時間,以秒為單位; 如果沒有指定過期時間則⼀直存在,直到使⽤DEL移除
expire key seconds # eg: 設置鍵'a1'的過期時間為3秒 expire 'a1' 3
-
查看有效時間,以秒為單位
ttl key # eg:查看鍵'bb'的有效時間 ttl bb
-
讓鍵重新變成永久(成功返回1, 否則返回0,表示鍵不存在或者本身就是永久的)
PERSIST 鍵
-
設置鍵值對同時設置過期時間:
setex key value EX seconds setex key seconds value # eg: 設置鍵為aa值為aa過期時間為3秒的數據 setex aa aa ex 3 setex aa 3 aa
3.hash類型
hash⽤於存儲對象,對象的結構為屬性、值; 值的類型為string
【增加、修改】
-
設置單個屬性 或 多個屬性
hset key field value hmset key field1 value1 field2 value2 ... # eg: 設置鍵 user的屬性name為fengling hset user name fengling # eg: 設置鍵u2的 屬性name為fengling、屬性age為18 hmset u2 name fengling age 18
-
其他
# 存在返回1 不存在返回0 hexists 鍵 域 # 不存在是添加,存在什麼也不做 hsetnx 鍵 域 域值 # 增加數字 hincrby 鍵 域 自增值
【查詢】
-
獲取指定鍵 所有的屬性 或 所有的值
hkeys key hvals key # eg1: 獲取鍵u2的所有屬性 hkeys u2 # eg2: 獲取鍵u2所有屬性的值 hvals u2
-
獲取⼀個屬性的值 或 多個屬性的值
hget key field hmget key field1 field2 ... # eg: 獲取鍵u2屬性'name'的值 hget u2 'name' # eg: 獲取鍵u2屬性'name'、'age的值 hmget u2 name age
-
獲取鍵中所有屬性和值
hgetall key
-
獲取域的個數
hlen key # eg: 獲取鍵u2屬性個數 hlen u2
【刪除】
-
刪除屬性,屬性對應的值會被⼀起刪除
hdel key field1 field2 ... # eg: 刪除鍵'u2'的屬性'age' hdel u2 age
4. list類型
列表的元素類型為string; 按照插⼊順序排序
【增加】
-
插⼊數據
# 在列表左側/右側插入數據 lpush key value1 value2 ... rpush key value1 value2 ... # eg1:從鍵為'a1'的列表左側加⼊數據a b c lpush a1 a b c # eg2:從鍵為'a1'的列表右側加⼊數據0 1 rpush a1 0 1
-
在指定元素的前或後插⼊新元素
linsert key before或after 現有元素 新元素 # eg: 在鍵為'a1'的列表中元素'b'前加⼊'3' linsert a1 before b 3
【查詢】
-
返回列表⾥指定範圍內的元素
-
start、stop為元素的下標索引
-
索引從左側開始,第⼀個元素為0
-
索引可以是負數,表示從尾部開始計數,如-1表示最後⼀個元素
lrange key start stop # eg: 獲取鍵為'a1'的列表所有元素 lrange a1 0 -1
-
-
返回列表⾥指定索引值的元素
lindex key value # eg: 獲取列表num中索引為1的元素 lindex num 1
-
返回列表成員長度
llen key # eg: 獲取列表num中元素個數 llen num
【修改】
-
設置指定索引位置的元素值
-
索引從左側開始,第⼀個元素為0
-
索引可以是負數,表示尾部開始計數,如-1表示最後⼀個元素
lset key index value # eg: 修改鍵為'a1'的列表中下標為1的元素值為'z' lset a 1 z
-
【刪除】
-
刪除指定元素
-
將列表中前count次出現的值為value的元素移除
-
count > 0: 從頭往尾移除
-
count < 0: 從尾往頭移除
-
count = 0: 移除所有
lrem key count value # eg1:向列表'a2'中加⼊元素'a'、'b'、'a'、'b'、'a'、'b' lpush a2 a b a b a b # eg2:從'a2'列表右側開始刪除2個'b' lrem a2 -2 b # eg3:查看列表'py12'的所有元素 lrange a2 0 -1
-
-
移除並獲取列表的第一個成員或最後一個成員
# 刪除列表第一個成員, 並獲取移除的元素 lpop key # 刪除列表最後一個成員, 並獲取移除的元素 rpop key
5. set類型
set 無序集合,元素為string類型;元素具有唯⼀性,不重覆
說明:對於集合沒有修改操作
【增加】
-
添加元素
sadd key member1 member2 ... # eg: 向鍵'a3'的集合中添加元素'zhangsan'、'lisi'、'wangwu' sadd a3 zhangsan sili wangwu
【查詢】
-
獲取所有的元素
smembers key # eg: 獲取鍵'a3'的集合中所有元素 smembers a3
-
隨機獲取多個元素
# count>0,隨機獲取count個元素,不可重覆 # count<0,隨機獲取count個元素,可重覆 SRANDMEMBER key [count]
-
獲取元素個數
scard 鍵
【刪除】
-
隨機刪除count個元素
spop 鍵 [count]
-
刪除指定元素
srem key value1 value2 value3 ... # eg: 刪除鍵'a3'的集合中元素'wangwu'和 'zs' srem a3 wangwu zs
【判斷】
-
判斷元素是否存在
sismember 鍵 元素值
【交集、差集和並集】
# 交集、比較多個集合中共同存在的成員
sinter key1 key2 key3 ...
# 差集、比較多個集合中不同的成員
sdiff key1 key2 key3 ...
# 並集、合併所有集合的成員,並去重
sunion key1 key2 key3 ...
# eg: 計算set1 set2 set3 set4的交並差集
sadd set1 1 2 3 4
sadd set2 1 3 4 5
sadd set3 1 3 5 6
sadd set4 2 3 4
sinter set1 set2
>> "1" "3" "4"
sinter set1 set2 set3 set4
>> "3"
sdiff set1 set2
>> "2"
sdiff set2 set1
>> "5"
sunion set1 set2 set3 set4
>> "1" "2" "3" "4" "5" "6"
6. zset類型
zet 有序集合(sorted set) 元素為string類型; 元素具有唯⼀性,不重覆. 每個元素都會關聯⼀個double類型的score,表示權重,通過權重將元素從小到大排序
說明:沒有修改操作
【增加】
-
添加元素
zadd key score1 member1 score2 member2 ... # 向鍵'a4'的集合中添加元素'lisi'、'wangwu'、'zhaoliu'、'zhangsan',權重分別為4、5、6、3 zadd a4 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan
【查詢】
-
返回指定範圍內的元素, 按score排序
-
start、stop為元素的下標索引
-
索引從左側開始,第⼀個元素為0
-
索引可以是負數,表示從尾部開始計數,如-1表示最後⼀個元素
zrange key start stop [withscores] zrevrange key start stop [withscores] # eg1: 獲取鍵'a4'的集合中所有元素,按score從低到高排序 zrange a4 0 -1 # eg2: 獲取鍵'a4'的集合中所有元素,按score從低到高排序,並輸出score zrange a4 0 -1 withscores # eg3: 獲取鍵'a4'的集合中所有元素,按score從高到低排序 zrevrange a4 0 -1
-
-
返回score值在min和max之間的成員
# LIMIT中offset代表跳過多少個元素,count是返回幾個 zrangebyscore key min max [WITHSCORES] [LIMIT offset count] zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count] # eg1: 獲取鍵'a4'的集合中許可權值在5和6之間的成員,按score從低到高排序 zrangebyscore a4 5 6 # eg2: 獲取鍵'a4'的集合中許可權值在5和6之間的成員,按score從高到低排序 zrevrangebyscore a4 6 5 # eg3: 獲取鍵'a4'的集合中許可權值在3和60之間的成員,按score從低到高排序;跳過第一個元素獲取兩個元素 zrangebyscore a4 3 60 limit 1 2
-
返回成員member的score值
zscore key member # 獲取鍵'a4'的集合中元素'zhangsan'的權重 zscore a4 zhangsan
-
獲取指定分數範圍的元素個數
zcount key min max # 獲取鍵'a4'的集合中的元素權重為 3-5 的元素個數 zcount a4 3 5
-
按score對指定成員在集合中的排名(排名從0開始計算)
# score從小到大的排名 zrank key member # score從大到小的排名 zrevrank key member # 集合a4中元素zhaoliu的排名 zrank a4 zhaoliu
【修改】
-
修改指定元素的score
zincrby key 增加值 member # 將 鍵'a4'的元素zhaoliu的score增加10 zincrby a4 10 zhaoliu
【刪除】
-
刪除指定元素
zrem key member1 member2 ... # eg: 刪除集合'a4'中元素'zhangsan' zrem a4 zhangsan
-
刪除權重在指定範圍的元素
zremrangebyscore key min max # eg: 刪除集合'a4'中許可權在5、6之間的元素 zremrangebyscore a4 5 6
-
刪除指定數量的成員
# 刪除指定數量的成員,從最低score開始刪除, count預設為1 zpopmin key [count] # 刪除指定數量的成員,從最高score開始刪除, count預設為1 zpopmax key [count] # eg: 刪除集合'a4'中score最小的元素 zpopmin a4
7. 比特流操作
# 按從左到右的偏移量設置一個bit數據的值
setbit key offset value
# 獲取一個bit數據的值
getbit
# 統計字元串被設置為1的bit數.
bitcount
# 返回字元串裡面第一個被設置為1或者0的bit位。
bitpos
# eg:
setbit mykey 7 1
>> "\x01"
六、分佈訂閱
-
訂閱 subscribe
# 訂閱法語 subscribe channel1 channel2 channel3... # eg: 訂閱一個名為 info 的 channel subscribe info >>> Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "info" 3) (integer) 1
-
發佈 public
# 發佈法語 publish channel message # eg: 給 info 頻道發佈消息 "python" publish info python # 返回訂閱的人數 >>> publish info "python" (integer) 2
-
運行結果
# 訂閱方終端顯示內容 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "info" 3) (integer) 1 1) "message" 2) "info" 3) "python"
-
redis與python交互
-
發佈訂閱消費者
import redis my_redis = redis.Redis(host="127.0.0.1", port=7777) # 創建訂閱者對象 subscribe = my_redis.pubsub() subscribe.subscribe("room_01") # 忽略 訂閱本身的響應 subscribe.parse_response() while True: print("waitting...") listen_msg = subscribe.parse_response() print(listen_msg)
-
發佈訂閱生產者
import redis import time my_redis = redis.Redis(host="127.0.0.1", port=7777) for item in "hello": time.sleep(1) my_redis.publish("room_01", item)
-