Redis 是咱們在互聯網應用中使用最普遍的一個 NoSQL 數據庫,基於 C 開發的鍵值對存儲數據庫。c++
Redis 這個名字是 Remote Dictionary Service 字母縮寫。redis
不少人想到 Redis,就想到緩存。但實際上 Redis 除了緩存以外,還有許多更加豐富的使用場景。好比分佈式鎖,限流。docker
四種方式獲取一個 Redis:shell
直接編譯安裝(推薦使用)數據庫
提早準備好 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:app
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.conf 配置文件,將daemonize 守護線程啓動方式開啓
配置完成後,保存退出,啓動 redis
redis-server redis.conf
String 是 Redis 裏邊最最簡單的一種數據結構。在 Redis 中,因此的 key 都是字符串(序列化後的字符串),可是,不一樣的 key 對應的 value 則具有不一樣的數據結構,咱們所說的五種不一樣的數據類型,主要是指 value 的數據類型不一樣。
Redis 中的字符串是動態字符串,內部是能夠修改的,像 Java 中的 StringBuffer,它採用分配冗餘空間的方式來減小內存的頻繁分配。在 Redis 內部結構中,通常實際分配的內存會大於須要的內存,當字符串小於 1M 的時候,擴容都是在現有的空間基礎上加倍,擴容每次擴 1M 空間,最大 512M。
set 就是給一個 key 賦值的。
使用 append 命令時,若是 key 已經存在,則直接在對應的 value 後追加值,不然就建立新的鍵值對。
能夠實現對 value 的減 1 操做(前提是 value 是一個數字),若是 value 不是數字,會報錯,若是value 不存在,則會給一個默認的值爲 0,在默認值的基礎上減一。
和 decr 相似,可是能夠本身設置步長,該命令第二個參數就是步長。
好比把K3 的值 減10 設置每次遞減的步長爲10便可
get 用來獲取一個 key 的 value。
getrange 能夠用來返回 key 對應的 value 的子串,這有點相似於 Java 裏邊的 substring。這個命令第二個和第三個參數就是截取的起始和終止位置,其中,0表示起始字符串,-1 表示最後一個字符串,-2 表示倒數第二個字符串,以此類推...
注意:原來存在在redis中 key對應的value 不會發生改變
獲取並更新某一個 key。
給某一個 key 的 value 自增
給某一個 key 的 value 自增,同時還能夠設置步長
和 incrby 相似,可是自增的步長能夠設置爲浮點數。 incrby 是不能夠增長浮點數的
批量獲取和批量存儲
查看 key 的有效期, -1 表明永遠不會過時 , -2 表明已通過期
在給 key 設置 value 的同時,還設置過時時間,時間到了
和 setex 相似,只不過這裏的時間單位是毫秒(1000ms = 1s)。
默認狀況下, set 命令會覆蓋已經存在的 key,setnx 則不會。
批量設置,若是有一個存在,整個操做會失敗。
指定offset(偏移量) 覆蓋一個已經存在的 key 的value
查看字符串長度
在 Redis 中,字符串都是以二進制的方式來存儲的。例如 set k1 a,a 對應的 ASCII 碼是 97,97 轉爲二進制是 01100001,BIT 相關的命令就是對二進制進行操做的。
key 對應的 value 在 offset 處的 bit 值
修改 key 對應的 value 在 offset 處的 bit 值
統計二進制數據中 1 的個數, 採用位
bitCount應用場景舉例,假設我要記錄測算系統每一個用戶當前登陸的次數,好比用戶名爲: taoguoguo
#命令以下 setbit key 當前登陸次數 偏移量 #第一次登陸 setbit taoguoguo 1 1 #第二次登陸 setbit taoguoguo 2 1 #第三次登陸 setbit taoguoguo 3 1 #當前登陸次數統計 bitcount taoguoguo
Redis中的List其實是一個string
類型的雙向鏈表,所以既能夠作棧也能夠作隊列來使用。不一樣的是棧是先進後出,隊列是先進先出。鏈表被普遍地用於實現Redis的各類功能,如列表鍵、發佈與訂閱、慢查詢、監視器等。Redis中單個List可容納2^32-1
約40億個元素
鏈表的特色:
將全部指定的值插入到存於 key 的列表的頭部。若是 key 不存在,那麼在進行 push 操做前會建立一個空列表。 若是 key 對應的值不是一個 list 的話,那麼會返回一個錯誤。
向存於 key 的列表的尾部插入全部指定的值。
返回列表指定區間內的元素,索引從0開始,-1爲最後一個。
移除並返回列表的頭元素。
移除並返回列表的尾元素。
返回列表中,下標爲 index 的元素。
ltrim 能夠對一個列表進行修剪,相似於subList。
阻塞式的彈出,至關於 lpop 的阻塞版,若是當前List數據爲空,那麼在阻塞時長內若是有添加元素 會進行彈出,若是沒有元素加入,命令超過期間自動中止。
另外一客戶端在阻塞時間加入新元素至k1鏈表
Redis 的 Set 是 String 類型的無序集合。集合成員是惟一的,這就意味着集合中不能出現重複的數據。
Redis 中集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是 O(1)。
集合中最大的成員數爲 2^32 - 1 (4294967295, 每一個集合可存儲40多億個成員)。
添加元素到一個 key 中
獲取一個 key 下的全部元素
移除指定的元素
返回某一個成員是否在集合中, 0 表明不存在, 1表示存在
返回集合的數量
隨機返回一個元素
隨機返回而且出棧一個元素
把一個元素從一個集合移到另外一個集合中去
返回兩個集合的差集,不一樣集合的順序,差集結果是不同的
返回兩個集合的交集
這個相似於 sdiff ,不一樣的是,計算出來的結果會保存在一個新的集合中
相似於 sinter,只是將計算出來的交集保存到一個新的集合中
求並集
求並集而且將結果保存到新的集合中
Redis hash 是一個 string 類型的 field(字段) 和 value(值) 的映射表,hash 特別適合用於存儲對象。
Redis 中每一個 hash 能夠存儲 2^32 - 1 鍵值對(40多億)。
添加值
獲取值
批量設置
批量獲取
刪除一個指定的 field
默認狀況下,若是 key 和 field 相同,會覆蓋掉已有的 value,hsetnx 則不會
獲取全部的 value
獲取全部的 key
同時獲取全部的 key 和 value
返回 field 是否存在, 0 不存在, 1存在
給指定的 value 自增
能夠自增一個浮點數
返回 某一個 key 中 value 的數量
返回某一個 key 中的某一個 field 的字符串長度
Redis 有序集合和集合同樣也是 string 類型元素的集合,且不容許重複的成員。
不一樣的是每一個元素都會關聯一個 double 類型的分數。redis 正是經過分數來爲集合中的成員進行從小到大的排序。
有序集合的成員是惟一的,但分數(score)卻能夠重複。
集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是 O(1)。 集合中最大的成員數爲 232 - 1 (4294967295, 每一個集合可存儲40多億個成員)。
將指定的元素添加到有序集合中
返回 member 的 score 值
返回集合中的一組元素,能夠加上 withscores
連同分數一塊兒返回
返回一組元素,可是是倒序
返回元素個數
返回 score 在某一個區間內的元素,默認是閉區間,若是要開區間 在 score值 前面加上 (
按照 score 的範圍返回元素
返回元素的排名(從小到大)
返回元素排名(從大到小)
score自增
給兩個集合求交集,給交集求和
彈出一個元素
計算有序集合中成員數量
返回指定區間內的成員
刪除一個 key/value
序列化給定的 key
判斷一個 key 是否存在
查看一個 key 的有效期 , -1 永不過時 , -2 已通過期
給一個 key 設置有效期,若是 key 在過時以前被從新 set 了,則過時時間會失效
移除一個 key 的過時時間
查看全部的 key
和 ttl 同樣,只不過這裏返回的是毫秒