Redis入門
NoSQL 引言
NoSQL(Not Only SQL),意思是 不僅僅是SQL,泛指 非關係型數據庫。NoSQL 這個技術門類,早期就有人提出,發展至2009年趨勢越發高漲。
NoSQL 數據庫沒有標準的查詢語言(SQL),因此進行數據庫查詢需要制定數據模型,許多 NoSQL數據庫都有 REST式的數據接口或者查詢API。
爲什麼使用 NoSQL?
隨着互聯網網站的興起,傳統的關係數據庫在應付動態網站,特別是超大規模和高併發的純動態網站已經顯得力不從心,暴露了很多難以克服的問題。如:商城網站中對商品數據頻繁查詢、對熱搜商品的排行統計、訂單超時問題、以及微信朋友圈(音頻,視頻)存儲等相關需求 使用傳統的關係型數據庫實現就顯得非常複雜,雖然能實現相應功能但是在性能上卻不是那麼樂觀。NoSQL 這個技術門類的出現,更好的解決了這些問題,它告訴了世界不僅僅是SQL。
NoSQL 的四大分類(鍵值、列存儲、文檔、圖形)
1、鍵值(Key-Value)存儲數據庫
這一類數據庫主要會使用到一個哈希表,這個表中有一個特定的鍵和一個指針指向特定的數據。
- Key-Value 模型對於IT系統來說的優勢在於簡單、易部署。
- 但是如果 DBA 只對部分值進行查詢或更新的時候,Key-Value就顯得效率低下。
相關產品:
- Tokyo Cabinet/Tyrant,
- Redis
- SSDB
- Voldemort
- Oracle BDB
2、列存儲數據庫
這部分數據庫通常是用來應對分佈式存儲的海量數據。
特點:鍵仍然存在,但是它們的特點是指向了多個列。這些列是由列家族來安排的。
相關產品:Cassandra、HBase、Riak.
3、文檔型數據庫
文檔型數據庫的靈感是來自於 Lotus Notes 辦公軟件,而且它同第一種鍵值存儲相類似,該類型的數據模型是版本化的文檔,半結構化的文檔以特定的格式存儲,比如JSON。文檔型數據庫可以看作是鍵值數據庫的升級版,允許之間嵌套鍵值。而且文檔型數據庫比鍵值數據庫的查詢效率更高
特點:以文檔形式存儲;
相關產品:MongoDB、CouchDB、 MongoDb(4.x)、SequoiaDB(國產,已經開源)。
4、圖形(Graph)數據庫
圖形結構的數據庫同其他行列以及剛性結構的SQL數據庫不同,它使用靈活的圖形模型,並且能夠擴展到多個服務器上。
相關產品:Neo4J、InfoGrid、 Infinite Graph
NoSQL 應用場景
- 數據模型比較簡單;
- 需要靈活性更強的 IT 系統;
- 對數據庫性能要求較高;
- 不需要高度的數據一致性(事務的支持),性能要求高則說明允許數據有略微的偏差。
Redis 介紹
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker.
Redis 開源、遵循BSD協議、基於內存數據存儲,被用於作爲 數據庫、緩存、消息中間件
重點:Redis 是一個內存型的數據庫
Redis 特點
- Redis 是一個 高性能 key/value內存型數據庫;
- Redis 擁有豐富的數據類型;
- Redis 支持持久化;
- Redis 單線程,單進程;
Redis 安裝 與 配置
環境準備:
- vmware15.x+
- centos7.x+
Redis 官網下載源碼包:https://redis.io/
下載後上傳到 Linux 中,解壓縮文件:
tar -zxvf redis-4.0.10.tar.gz # 解壓Redis源碼包
ll # 查看當前文件目錄
centos7 安裝 gcc:
yum install -y gcc
進入解壓縮目錄執行如下命令:
make MALLOC=libc
編譯完成後執行如下命令:
make install PREFIX=/usr/redis
進入 /usr/redis 目錄啓動 Redis 服務:
./redis-server
Redis服務端口默認:6379
再打開一個命令行,進入 bin 目錄執行客戶端連接操作:
./redis-cli –p 6379
Redis 啓動服務的細節(加載配置啓動)
注:直接使用 ./redis-server
方式啓動使用的是 redis-server 這個 shell 腳本中默認配置;
如何在啓動 Redis 時指定配置文件啓動?
默認在redis安裝完成之後再安裝目錄沒有任何配置文件,需要在源碼目錄中複製 redis.conf 配置文件到安裝目錄;
cp redis.conf /usr/ redis
加載配置啓動 Redis:
./redis-server ../redis.conf
修改 redis 默認端口號:
vi redis.conf # 修改裏面 port 7000, 保存退出
開啓 Redis 遠程連接
默認 Redis 服務器沒有開啓遠程連接,也就是默認拒絕所有遠程客戶端連接;
1、修改配置文件開啓遠程連接:
vim redis.conf # 修改配置文件
修改 bind 127.0.0.1
爲 bind 0.0.0.0
,表示 允許一切客戶端連接
2、修改配置後重啓 Redis 服務:一定要加載配置文件啓動!
./redis-server ../redis.conf
我使用的是 Redis Desktop Manager 連接 Linux 下的 Redis:
如果連接失敗,關閉防火牆 後重新連接:
systemctl stop firewalld.service
Redis 端口占用(kill redis-server 進程)
啓用 Redis 出現:
Creating Server TCP listening socket *:6379: bind: Address already in use
6379 地址已經在使用(6379是 Redis 默認的端口)
解決方法:找到 redis-server 的進程 kill 掉
ps -ef | grep -i redis
kill -9 2700
Redis 常用指令
數據庫相關指令
Redis 庫
庫是 database 用來存放數據的一個基本單元,每個庫都可以存放獨立的 key-value 鍵值對,Redis 中每一個庫都有一個唯一名稱/編號,從 0 開始。
- 默認庫的個數:16 個(可以在配置文件中修改),庫的編號:0 - 15,默認使用 0號庫;
- 切換庫的命令:select dbid(庫編號)
Redis 操作庫的指令
- 清空當前的庫:
FLUSHDB
- 清空全部的庫:
FLUSHALL
Redis 客戶端顯示中文
啓動 Redis 時後面添加:--raw
./redis-cli -p 7000 --raw
Key 相關指令
DEL 指令
- 語法 :
DEL key [key ...]
- 作用 : 刪除給定的一個或多個 key,不存在的 key 會被忽略。
- 可用版本: >= 1.0.0
- 返回值: 被刪除 key 的數量。
EXISTS 指令
- 語法:
EXISTS key
- 作用: 檢查給定 key 是否存在。
- 可用版本: >= 1.0.0
- 返回值: 若 key 存在,返回1 ,否則返回0。
EXPIRE 指令
- 語法:
EXPIRE key seconds
- 作用: 爲給定 key 設置生存時間(秒),當 key 過期時(生存時間爲 0),它會被自動刪除。
- 可用版本: >= 1.0.0
- 時間複雜度: O(1)
- 返回值:設置成功返回 1 。
KEYS 指令
- 語法 :
KEYS pattern
- 作用 : 查找所有符合給定模式 pattern 的 key 。
- 語法:
KEYS *
:匹配數據庫中所有 key 。
KEYS h?llo
:匹配 hello ,hallo 和 hxllo 等。
KEYS h*llo
:匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo
: 匹配 hello 和 hallo ,但不匹配 hillo 。特殊符號用\
隔開 - 可用版本: >= 1.0.0
- 返回值: 符合給定模式的 key 列表。
MOVE 指令
- 語法 :
MOVE key db
- 作用 : 將當前數據庫的 key 移動到給定的數據庫 db 當中。
- 可用版本: >= 1.0.0
- 返回值: 移動成功返回 1 ,失敗則返回 0 。
PEXPIRE 指令
- 語法 :
PEXPIRE key milliseconds
- 作用 : 這個命令和
EXPIRE
命令的作用類似,但是它以 毫秒 爲單位設置 key 的生存時間
(EXPIRE
以秒爲單位) - 可用版本: >= 2.6.0
- 時間複雜度: O(1)
- 返回值:設置成功,返回1。key 不存在或設置失敗,返回0
PEXPIREAT 指令
- 語法 :
PEXPIREAT key milliseconds-timestamp
- 作用 : 這個命令和
EXPIREAT
命令類似,但它以 毫秒 爲單位設置 key 的過期 unix 時間戳(EXPIREAT
以秒爲單位) - 可用版本: >= 2.6.0
- 返回值:如果生存時間設置成功,返回 1 。當 key 不存在或沒辦法設置生存時間時,返回 0 。
(查看EXPIRE 命令獲取更多信息)
TTL 指令
- 語法 :
TTL key
- 作用 : 以秒爲單位,返回給定 key 的剩餘生存時間(TTL, time to live)。
- 可用版本: >= 1.0.0
- 返回值:
當 key 不存在時,返回 -2 。
當 key 存在但沒有設置剩餘生存時間時,返回 -1 。
否則,以秒爲單位,返回 key 的剩餘生存時間。 - Note : Redis 2.8 以前,當 key 不存在,或者 key 沒有設置剩餘生存時間時,命令都返回 -1 。
PTTL 指令
- 語法 :
PTTL key
- 作用 : 這個命令類似於 TTL 命令,但它以毫秒爲單位返回 key 的剩餘生存時間
(TTL 以秒爲單位) - 可用版本: >= 2.6.0
- 返回值: 當 key 不存在時,返回 -2 。當 key 存在但沒有設置剩餘生存時間時,返回 -1 。
- 否則,以毫秒爲單位,返回 key 的剩餘生存時間。
- 注意 : Redis 2.8 以前,當 key 不存在,或者 key 沒有設置剩餘生存時間時,命令都返回 -1 。
RANDOMKEY 指令
- 語法 :
RANDOMKEY
- 作用 : 從當前數據庫中隨機返回(不刪除) 一個 key 。
- 可用版本: >= 1.0.0
- 返回值:當數據庫不爲空時,返回一個 key 。當數據庫爲空時,返回
nil
。
RENAME 指令
- 語法 :
RENAME key newkey
- 作用 : 將 key 改名爲 newkey 。
當 key 和 newkey 相同,或者 key 不存在時,返回一個錯誤。
當 newkey 已經存在時,RENAME
命令將覆蓋舊值。 - 可用版本: >= 1.0.0
- 返回值: 改名成功時提示OK ,失敗時候返回一個錯誤。
TYPE 指令
- 語法 :
TYPE key
- 作用 : 返回 key 所儲存的值的類型。
- 可用版本: >= 1.0.0
- 返回值:
none
:key 不存在
string
:字符串
list
:列表
set
:集合
zset
:有序集
hash
:哈希表
String 類型
內存存儲模型:
命令 | 說明 |
---|---|
set | 設置一個key/value |
get | 根據key獲得對應的value |
mset | 一次設置多個key value |
mget | 一次獲得多個key的value |
getset | 獲得原始key的值,同時設置新值 |
strlen | 獲得對應key存儲value的長度 |
append | 爲對應key的value追加內容 |
getrange 索引0開始 | 截取value的內容 |
setex | 設置一個key存活的有效期(秒) |
psetex | 設置一個key存活的有效期(毫秒) |
setnx | 存在不做任何操作,不存在添加 |
msetnx原子操作(只要有一個存在不做任何操作) | 可以同時設置多個key,只要有一個存在都不保存 |
decr | 進行數值類型的-1操作 |
decrby | 根據提供的數據進行減法操作 |
incr | 進行數值類型的+1操作 |
incrby | 根據提供的數據進行加法操作 |
incrbyfloat | 根據提供的數據加入浮點數 |
List 類型
List 列表 相當於 Java 中的 List 集合,特點:元素有序 且 可以重複
命令 | 說明 |
---|---|
lpush | 將某個值加入到一個key列表頭部 |
lpushx | 同lpush,但是必須要保證這個key存在 |
rpush | 將某個值加入到一個key列表末尾 |
rpushx | 同rpush,但是必須要保證這個key存在 |
lpop | 返回和移除列表左邊的第一個元素 |
rpop | 返回和移除列表右邊的第一個元素 |
lrange | 獲取某一個下標區間內的元素 |
llen | 獲取列表元素個數 |
lset | 設置某一個指定索引的值(索引必須存在) |
lindex | 獲取某一個指定索引位置的元素 |
lrem | 刪除重複元素 |
ltrim | 保留列表中特定區間內的元素 |
linsert | 在某一個元素之前,之後插入新元素 |
Set 類型
特點:Set 類型 相當於Java 中的 Set 集合;特點:元素無序、不可以重複;
命令 | 說明 |
---|---|
sadd | 爲集合添加元素 |
smembers | 顯示集合中所有元素 無序 |
scard | 返回集合中元素的個數 |
spop | 隨機返回一個元素 並將元素在集合中刪除 |
smove | 從一個集合中向另一個集合移動元素 必須是同一種類型 |
srem | 從集合中刪除一個元素 |
sismember | 判斷一個集合中是否含有這個元素 |
srandmember | 隨機返回元素 |
sdiff | 去掉第一個集合中其它集合含有的相同元素 |
sinter | 求交集 |
sunion | 求和集 |
ZSet 類型
特點:可排序的 Set 集合,不可重複;
命令 | 說明 |
---|---|
zadd | 添加一個有序集合元素 |
zcard | 返回集合的元素個數 |
zrange 升序 zrevrange 降序 | 返回一個範圍內的元素 |
zrangebyscore | 按照分數查找一個範圍內的元素 |
zrank | 返回排名 |
zrevrank | 倒序排名 |
zscore | 顯示某一個元素的分數 |
zrem | 移除某一個元素 |
zincrby | 給某個特定元素加分 |
Hash 類型
特點:value 是一個 map 結構,存在 key、value,key 是無序的;
命令 | 說明 |
---|---|
hset | 設置一個key/value對 |
hget | 獲得一個key對應的value |
hgetall | 獲得所有的key/value對 |
hdel | 刪除某一個key/value對 |
hexists | 判斷一個key是否存在 |
hkeys | 獲得所有的key |
hvals | 獲得所有的value |
hmset | 設置多個key/value |
hmget | 獲得多個key的value |
hsetnx | 設置一個不存在的key的值 |
hincrby | 爲value進行加法運算 |
hincrbyfloat | 爲value加入浮點值 |