Redis 簡介
Redis 是我們在網際網路應用中使用最廣泛的一個 NoSQL 資料庫,基於 C 開發的鍵值對儲存資料庫。
Redis 這個名字是 Remote Dictionary Service 字母縮寫。
很多人想到 Redis,就想到快取。但實際上 Redis 除了快取之外,還有許多更加豐富的使用場景。比如分散式鎖,限流。
Redis 特點
- 支援資料持久化
- 支援多種不同的資料結構型別之間的對映
- 支援主從模式的資料備份
- 自帶了釋出訂閱系統
- 定時器、計數器
redis的安裝
四種方式獲取一個 Redis:
-
直接編譯安裝(推薦使用)
提前準備好 gcc 環境
yum install gcc-c++
接下來下載並安裝 Redis:
wget https://download.redis.io/releases/redis-6.2.1.tar.gz tar -zxvf redis-6.2.1.tar.gz cd redis-6.2.1/ make make install
安裝完成後,啟動 Redis:
redis-server redis.conf
啟動成功頁面如下:
-
使用Docker
Docker 安裝好之後,啟動 Docker ,直接執行安裝命令即可,啟動後返回容器執行的ID
docker run --name taoguoguo-redis -d -p 6379:6379 redis --requirepass 123
-
我們先檢視執行在Docker上的redis容器
docker ps
-
確保容器正在執行後,可以從宿主機上連線(前提是宿主機上存在 redis-cli),因為第一種編譯安裝方式我們已經在宿主機上安裝了redis 所以可以直接使用宿主機的命令列工具
#redis-cli 客戶端命令 預設引數有地址 -h 127.0.0.1 埠 -p 6379 密碼 -a '123' redis-cli -a 123
宿主機客戶端,連線成功!
-
如果宿主機上沒有安裝 Redis,那麼也可以進入到 Docker 容器種去操作 Redis:
#1.退出當前redis exit #2.進入Redis容器 docker exec -it taoguoguo-redis redis-cli -a 123
-
-
也可以直接安裝
-
CentOS
yum install redis
-
Ubuntu
apt-get install redis
-
Mac
brew install redis
-
-
通過線上體驗,使用Redis的相關功能 http://try.redis.io/
redis的後臺啟動
-
首先,修改 redis.conf 配置檔案,將daemonize 守護執行緒啟動方式開啟
配置完成後,儲存退出,啟動 redis
redis-server redis.conf
redis的資料型別
String
String 是 Redis 裡邊最最簡單的一種資料結構。在 Redis 中,所以的 key 都是字串(序列化後的字串),但是,不同的 key 對應的 value 則具備不同的資料結構,我們所說的五種不同的資料型別,主要是指 value 的資料型別不同。
Redis 中的字串是動態字串,內部是可以修改的,像 Java 中的 StringBuffer,它採用分配冗餘空間的方式來減少記憶體的頻繁分配。在 Redis 內部結構中,一般實際分配的記憶體會大於需要的記憶體,當字串小於 1M 的時候,擴容都是在現有的空間基礎上加倍,擴容每次擴 1M 空間,最大 512M。
set
set 就是給一個 key 賦值的。
append
使用 append 命令時,如果 key 已經存在,則直接在對應的 value 後追加值,否則就建立新的鍵值對。
decr
可以實現對 value 的減 1 操作(前提是 value 是一個數字),如果 value 不是數字,會報錯,如果value 不存在,則會給一個預設的值為 0,在預設值的基礎上減一。
decrby
和 decr 類似,但是可以自己設定步長,該命令第二個引數就是步長。
比如把K3 的值 減10 設定每次遞減的步長為10即可
get
get 用來獲取一個 key 的 value。
getrange
getrange 可以用來返回 key 對應的 value 的子串,這有點類似於 Java 裡邊的 substring。這個命令第二個和第三個引數就是擷取的起始和終止位置,其中,0表示起始字串,-1 表示最後一個字串,-2 表示倒數第二個字串,以此類推...
注意:原來存在在redis中 key對應的value 不會發生改變
getset
獲取並更新某一個 key。
incr
給某一個 key 的 value 自增
incrby
給某一個 key 的 value 自增,同時還可以設定步長
incrbyfloat
和 incrby 類似,但是自增的步長可以設定為浮點數。 incrby 是不可以增加浮點數的
mget 和 mset
批量獲取和批量儲存
ttl
檢視 key 的有效期, -1 代表永遠不會過期 , -2 代表已經過期
setex
在給 key 設定 value 的同時,還設定過期時間,時間到了
psetex
和 setex 類似,只不過這裡的時間單位是毫秒(1000ms = 1s)。
setnx
預設情況下, set 命令會覆蓋已經存在的 key,setnx 則不會。
msetnx
批量設定,如果有一個存在,整個操作會失敗。
setrange
指定offset(偏移量) 覆蓋一個已經存在的 key 的value
strlen
檢視字串長度
String(BIT) 相關命令
在 Redis 中,字串都是以二進位制的方式來儲存的。例如 set k1 a,a 對應的 ASCII 碼是 97,97 轉為二進位制是 01100001,BIT 相關的命令就是對二進位制進行操作的。
getbit
key 對應的 value 在 offset 處的 bit 值
setbit
修改 key 對應的 value 在 offset 處的 bit 值
bitcount
統計二進位制資料中 1 的個數, 採用位
bitCount應用場景舉例,假設我要記錄測算系統每個使用者當前登入的次數,比如使用者名稱為: taoguoguo
#命令如下
setbit key 當前登入次數 偏移量
#第一次登入
setbit taoguoguo 1 1
#第二次登入
setbit taoguoguo 2 1
#第三次登入
setbit taoguoguo 3 1
#當前登入次數統計
bitcount taoguoguo
List
Redis中的List實際上是一個string
型別的雙向連結串列,因此既可以做棧也可以做佇列來使用。不同的是棧是先進後出,佇列是先進先出。連結串列被廣泛地用於實現Redis的各種功能,如列表鍵、釋出與訂閱、慢查詢、監視器等。Redis中單個List可容納2^32-1
約40億個元素
連結串列的特點:
- 連結串列中的元素是有序的,可通過索引下標來獲取某個元素或某個範圍內的元素列表。
- 連結串列中的元素是可以重複的
lpush
將所有指定的值插入到存於 key 的列表的頭部。如果 key 不存在,那麼在進行 push 操作前會建立一個空列表。 如果 key 對應的值不是一個 list 的話,那麼會返回一個錯誤。
rpush
向存於 key 的列表的尾部插入所有指定的值。
lrange
返回列表指定區間內的元素,索引從0開始,-1為最後一個。
lpop
移除並返回列表的頭元素。
rpop
移除並返回列表的尾元素。
lindex
返回列表中,下標為 index 的元素。
ltrim
ltrim 可以對一個列表進行修剪,類似於subList。
blpop/brpop
阻塞式的彈出,相當於 lpop 的阻塞版,如果當前List資料為空,那麼在阻塞時長內如果有新增元素 會進行彈出,如果沒有元素加入,命令超過時間自動停止。
另一客戶端在阻塞時間加入新元素至k1連結串列
Set
Redis 的 Set 是 String 型別的無序集合。集合成員是唯一的,這就意味著集合中不能出現重複的資料。
Redis 中集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是 O(1)。
集合中最大的成員數為 2^32 - 1 (4294967295, 每個集合可儲存40多億個成員)。
sadd
新增元素到一個 key 中
smembers
獲取一個 key 下的所有元素
srem
移除指定的元素
sismemeber
返回某一個成員是否在集合中, 0 代表不存在, 1表示存在
scard
返回集合的數量
srandmember
隨機返回一個元素
spop
隨機返回並且出棧一個元素
smove
把一個元素從一個集合移到另一個集合中去
sdiff
返回兩個集合的差集,不同集合的順序,差集結果是不一樣的
sinter
返回兩個集合的交集
sdiffstore
這個類似於 sdiff ,不同的是,計算出來的結果會儲存在一個新的集合中
sinterstore
類似於 sinter,只是將計算出來的交集儲存到一個新的集合中
sunion
求並集
sunionstore
求並集並且將結果儲存到新的集合中
Hash
Redis hash 是一個 string 型別的 field(欄位) 和 value(值) 的對映表,hash 特別適合用於儲存物件。
Redis 中每個 hash 可以儲存 2^32 - 1 鍵值對(40多億)。
hset
新增值
hget
獲取值
hmset
批量設定
hmget
批量獲取
hdel
刪除一個指定的 field
hsetnx
預設情況下,如果 key 和 field 相同,會覆蓋掉已有的 value,hsetnx 則不會
hvals
獲取所有的 value
hkeys
獲取所有的 key
hgetall
同時獲取所有的 key 和 value
hexists
返回 field 是否存在, 0 不存在, 1存在
hincrby
給指定的 value 自增
hincrbyfloat
可以自增一個浮點數
hlen
返回 某一個 key 中 value 的數量
hstrlen
返回某一個 key 中的某一個 field 的字串長度
ZSet
Redis 有序集合和集合一樣也是 string 型別元素的集合,且不允許重複的成員。
不同的是每個元素都會關聯一個 double 型別的分數。redis 正是通過分數來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(score)卻可以重複。
集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是 O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可儲存40多億個成員)。
zadd
將指定的元素新增到有序集合中
zscore
返回 member 的 score 值
zrange
返回集合中的一組元素,可以加上 withscores
連同分數一起返回
zrevrange
返回一組元素,但是是倒序
zcard
返回元素個數
zcount
返回 score 在某一個區間內的元素,預設是閉區間,如果要開區間 在 score值 前面加上 (
zrangebyscore
按照 score 的範圍返回元素
zrank
返回元素的排名(從小到大)
zrevrank
返回元素排名(從大到小)
zincrby
score自增
zinterstore
給兩個集合求交集,給交集求和
zrem
彈出一個元素
zlexcount
計算有序集合中成員數量
zrangebylex
返回指定區間內的成員
Key相關操作
del
刪除一個 key/value
dump
序列化給定的 key
exists
判斷一個 key 是否存在
ttl
檢視一個 key 的有效期 , -1 永不過期 , -2 已經過期
expire
給一個 key 設定有效期,如果 key 在過期之前被重新 set 了,則過期時間會失效
persist
移除一個 key 的過期時間
keys *
檢視所有的 key
pttl
和 ttl 一樣,只不過這裡返回的是毫秒
資料型別總結
- 四種資料型別(list/set/zset/hash),在第一次使用時,如果容器不存在,就自動建立一個
- 四種資料型別(list/set/zset/hash),如果裡邊沒有元素了,那麼立即刪除容器,釋放記憶體。