Redis概述安裝與基本數據類型 1. 什麼是NoSQL NoSQL( Not Only SQL ),意即不僅僅是SQL, 泛指非關係型的資料庫。Nosql這個技術門類,早期就有人提出,發展至2009年趨勢越發高漲。 2. NoSQL的廣泛應用 隨著大數據的興起,數據量的暴增,數據類型的豐富,傳統的 ...
Redis概述安裝與基本數據類型
1. 什麼是NoSQL
NoSQL( Not Only SQL
),意即不僅僅是SQL, 泛指非關係型的資料庫。Nosql這個技術門類,早期就有人提出,發展至2009年趨勢越發高漲。
2. NoSQL的廣泛應用
隨著大數據的興起,數據量的暴增,數據類型的豐富,傳統的關係資料庫在應付動態網站,特別是超大規模和高併發的純動態網站已經顯得力不從心,暴露了很多難以剋服的問題。如商城網站中對商品數據頻繁查詢
、對熱搜商品的排行統計
、訂單超時問題
、以及微信朋友圈(音頻,視頻)存儲等相關使用傳統的關係型資料庫實現就顯得非常複雜,雖然能實現相應功能但是在性能上卻不是那麼樂觀。nosql這個技術門類的出現,更好的解決了這些問題,它告訴了世界不僅僅是sql。
3. NoSQL的四大分類
3.1 鍵值(Key-Value)存儲資料庫
# 1.說明:
- 這一類資料庫主要會使用到一個哈希表,這個表中有一個特定的鍵和一個指針指向特定的數據。
# 2.特點
- Key/value模型對於IT系統來說的優勢在於簡單、易部署。
- 但是如果DBA只對部分值進行查詢或更新的時候,Key/value就顯得效率低下了。
# 3.相關產品
- Tokyo Cabinet/Tyrant,
- Redis 基於記憶體的 運行軟體--->磁碟--->記憶體中
- SSDB 基於磁碟的 直接與磁碟做交互--> IO
- Voldemort
- Oracle BDB
3.2 列存儲資料庫 ----> Hbase
# 1.說明
- 這部分資料庫通常是用來應對分散式存儲的海量數據。
# 2.特點
- 鍵仍然存在,但是它們的特點是指向了多個列。這些列是由列家族來安排的。列簇
- rowkey
# 3.相關產品
- Cassandra、HBase、ClickHouse等.
3.3 文檔型資料庫
# 1.說明
- 文檔型資料庫的靈感是來自於Lotus Notes辦公軟體的,而且它同第一種鍵值存儲相類似該類型的數據模型是版本化的文檔,半結構化的文檔以特定的格式存儲,比如JSON。文檔型資料庫可 以看作是鍵值資料庫的升級版,允許之間嵌套鍵值。而且文檔型資料庫比鍵值資料庫的查詢效率更高
{'id':1001,'name':xiaohu}
{'id':1001,'name':'xiaohu2,'address':'anhuihefei','likes':['play','eat'],'study':{'yuyan':java,'ruanjian':'mysql'}}
文檔資料庫對於單條數據來說,他的事務支持並沒有那麼強大
目前的mongodb5,支持了單條數據的事務,但是多條不行
# 2.特點
- 以文檔形式存儲
# 3.相關產品
- MongoDB、CouchDB、 MongoDb(4.x). 國內也有文檔型資料庫SequoiaDB,已經開源。
3.4 圖形(Graph)資料庫
# 1.說明
- 圖形結構的資料庫同其他行列以及剛性結構的SQL資料庫不同,它是使用靈活的圖形模型,並且能夠擴展到多個伺服器上。
# 2.特點
- NoSQL資料庫沒有標準的查詢語言(SQL),因此進行資料庫查詢需要制定數據模型。許多NoSQL資料庫都有REST式的數據介面或者查詢API。
# 3.相關產品
- Neo4J、InfoGrid、 Infinite Graph、OSS
4. NoSQL應用場景
-
數據模型比較簡單
-
需要靈活性更強的IT系統
-
對資料庫性能要求較高
-
不需要高度的數據一致性(NoSql資料庫對事務的支持都不是太好)
5. 什麼是Redis
Redis is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine.
Redis 開源 遵循BSD 基於記憶體數據存儲 被用於作為 資料庫 緩存 消息中間件
- 總結: redis是一個記憶體型的資料庫
6. Redis特點(面試必問)
-
Redis是一個高性能key/value記憶體型資料庫 在redis中,所有的數據形式都是以鍵值對的方式來存儲的
-
Redis支持豐富的數據類型 string,list,set,sorted set,hash 指的是鍵值對中的值的類型
-
Redis支持持久化 持久化:將數據落盤,明天會詳細說一說redis中的持久化
-
Redis單線程,單進程 由於是單線程和單進程的,所以它的線程是安全的,我們之前說的java中的多線程安全在分散式中不起作用,當時只針對一個JVM中是有效的。
7. Redis安裝
# 0.準備環境
- vmware 12.x+
- centos7.x+
# 1.下載redis源碼包
- https://redis.io/
# 2.下載完整源碼包
- redis-7.0.0.tar.gz
# 3.將下載redis資料包上傳到Linux中
# 4.解壓縮文件
[root@localhost ~]# tar -zxvf redis-7.0.10.tar.gz
[root@localhost ~]# ll
redis底層是由C語言編寫的
# 5.安裝gcc
- yum install -y gcc
# 6.進入解壓縮目錄執行如下命令
# 註意。一定要在Makefile文件的同目錄下使用下麵的命令對redis做編譯(切記:不要make test)
- yum install -y tcl
- make MALLOC=libc
# 7.編譯完成後執行如下命令
- make install PREFIX=/usr/local/soft/redis
# 8.進入/usr/redis目錄啟動redis服務
- ./redis-server
# 9.Redis服務埠預設是 6379
ps -aux|grep redis
# 10.進入bin目錄執行客戶端連接操作
- ./redis-cli -h localhost -p 6379
# 如果是在一臺機器上,可以省略後面的
- ./redis-cli
# 11.連接成功出現上面界面連接成功
簡單測試成功,給一個鍵值對,根據鍵獲取值,獲取所有的鍵
8. Redis資料庫相關指令
註意:(說這個之前,需要帶學生寫一個配置文件的修改和使用,庫的細節)
# 1. redis服務啟動的時候,如果單純的就是redis-server命令啟動,預設啟動後會占用6379的埠號
# 2. 一個redis服務相當於一個新的redis資料庫
# 3.修改埠號
一臺機器上可以同時啟動多個redis服務,只要每個redis服務所占用的埠號不同即可,要想啟動多個redis服務,就必須去修改埠號
在哪修改呢?在linux中,絕大部分的框架組件要想修改參數的話,可以去找到對應軟體的配置文件,然後做修改
redis服務啟動的時候會預設應用一個配置文件,預設服務啟動的時候會去編譯好的目錄下找到一個叫做redis.conf的文件,並非是安裝目錄
只要是單純的使用redis-server啟動的話,都會去編譯好的目錄下找到一個叫做redis.conf的文件去啟動,即便是修改了埠號,也是只能啟動一個redis服務。
修改redis.conf文件中的port 6379---> port xxxx
指定埠號啟動命令:redis-server /xxx/xx/redis.conf
# 4. 配置環境變數,為了可以在任意目錄下執行redis命令
vim /etc/profile
修改配置文件:
export JAVA_HOME=/usr/local/soft/jdk1.8.0_171
export REDIS_HOME=/usr/local/soft/redis
export PATH=.:$PATH:$JAVA_HOME/bin:$REDIS_HOME/bin
保存退出:
:wq
讓環境變數生效
source /etc/profile
# 5. 客戶端指定服務鏈接
如果就預設的redis-cli鏈接的話,預設連接的是本機localhost(127.0.0.1)的6379埠號的redis服務
指定連接某一臺機器上的某個埠號的redis服務
redis-cli -h 伺服器的ip地址 -p 埠號
舉例:redis-cli -h localhost -p 7000
# 6. 查看當前資料庫中的所有鍵 key *
# 7. 資料庫的概念
對於一個redis服務而言,包含預設有16個資料庫給我們使用,從0開始編號,共15號資料庫,預設使用的是0號資料庫
切換庫,select 庫號 舉例:使用1號庫:select 1
庫和庫之間數據不共用
庫和庫之間的鍵可以重名
8.1 資料庫操作指令
# 1.Redis中庫說明
- 使用redis的預設配置器動redis服務後,預設會存在16個庫,編號從0-15 配置文件中有個database相關的
- 可以使用select 庫的編號 來選擇一個redis的庫
# 2.Redis中清空庫的指令
- 清空當前的庫 FLUSHDB
- 清空全部的庫 FLUSHALL
# 3.redis客戶端顯示中文
- ./redis-cli -p 7000 --raw
8.2 操作key相關指令(分別演示案例)
# 1.DEL指令
- 語法 : DEL key [key ...]
- 作用 : 刪除給定的一個或多個key 。不存在的key 會被忽略。多個key之間使用空格隔開
- 可用版本: >= 1.0.0
- 返回值: 被刪除key 的數量。
# 2.EXISTS指令
- 語法: EXISTS key [key ...]
- 作用: 檢查給定key 是否存在。多個key之間使用空格隔開,只要有一個key存在,返回值就是1 新版本中會提示幾個鍵存在
- 可用版本: >= 1.0.0
- 返回值: 若key 存在,返回的是存在的個數。
# 3.EXPIRE 只能對已經存在的key設置過期時間
- 語法: EXPIRE key seconds
- 作用: 為給定key 設置生存時間,當key 過期時(生存時間為0 ),它會被自動刪除。
- 可用版本: >= 1.0.0
- 時間複雜度: O(1)
- 返回值:設置成功返回1 。
# 4.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 列表。
# 5.MOVE
- 語法 : MOVE key db (move name 1----將name鍵移動到1號庫)
- 作用 : 將當前資料庫的key 移動到給定的資料庫db 當中。
- 可用版本: >= 1.0.0
- 返回值: 移動成功返回1 ,失敗則返回0 。
# 6.PEXPIRE
- 語法 : PEXPIRE key milliseconds
- 作用 : 這個命令和EXPIRE 命令的作用類似,但是它以毫秒為單位設置key 的生存時間,而不像EXPIRE 命令那樣,以秒為單位。
- 可用版本: >= 2.6.0
- 時間複雜度: O(1)
- 返回值:設置成功,返回1 key 不存在或設置失敗,返回0
# 7.PEXPIREAT
- 語法 : PEXPIREAT key milliseconds-timestamp
- 作用 : 這個命令和EXPIREAT 命令類似,但它以毫秒為單位設置key 的過期unix 時間戳,而不是像EXPIREAT那樣,以秒為單位。
- 可用版本: >= 2.6.0
- 返回值:如果生存時間設置成功,返回1 。當key 不存在或沒辦法設置生存時間時,返回0 。(查看EXPIRE 命令獲取更多信息)
# 8.TTL
- 語法 : TTL key
- 作用 : 以秒為單位,返回給定key 的剩餘生存時間(TTL, time to live)。
- 可用版本: >= 1.0.0
- 返回值:
當key 不存在時,返回-2 。
當key 存在但沒有設置剩餘生存時間時,返回-1 。
否則,以秒為單位,返回key 的剩餘生存時間。
- Note : 在Redis 2.8 以前,當key 不存在,或者key 沒有設置剩餘生存時間時,命令都返回-1 。
# 9.PTTL
- 語法 : PTTL key
- 作用 : 這個命令類似於TTL 命令,但它以毫秒為單位返回key 的剩餘生存時間,而不是像TTL 命令那樣,以秒為單位。
- 可用版本: >= 2.6.0
- 返回值: 當key 不存在時,返回-2 。當key 存在但沒有設置剩餘生存時間時,返回-1 。
- 否則,以毫秒為單位,返回key 的剩餘生存時間。
- 註意 : 在Redis 2.8 以前,當key 不存在,或者key 沒有設置剩餘生存時間時,命令都返回-1 。
# 10.RANDOMKEY
- 語法 : RANDOMKEY
- 作用 : 從當前資料庫中隨機返回(不刪除) 一個key 。
- 可用版本: >= 1.0.0
- 返回值:當資料庫不為空時,返回一個key 。當資料庫為空時,返回nil 。
# 11.RENAME
- 語法 : RENAME key newkey
- 作用 : 將key 改名為newkey 。當key 和newkey 相同,RENAME 命令將覆蓋舊值。如果鍵不存在,才報錯
- 可用版本: >= 1.0.0
- 返回值: 改名成功時提示OK ,失敗時候返回一個錯誤。
# 12.TYPE
- 語法 : TYPE key
- 作用 : 返回key 所儲存的值的類型。
- 可用版本: >= 1.0.0
- 返回值:
none (key 不存在)
string (字元串)
list (列表)
set (集合)
zset (有序集)
hash (哈希表)
8.3 String類型(分別演示)
1. 記憶體存儲模型
2. 常用操作命令
命令 | 說明 |
---|---|
set | 設置一個key/value |
get | 根據key獲得對應的value |
mset | 一次設置多個key value |
mget | 一次獲得多個key的value |
getset | 獲得原始key的值,同時設置新值 |
strlen | 獲得對應key存儲value的長度 |
append | 為對應key的value追加內容 |
getrange 索引0開始 | 截取value的內容 到末尾-1 [開始,結束] |
setex | 設置一個key存活的有效期(秒) |
psetex | 設置一個key存活的有效期(毫秒) |
setnx | 存在不做任何操作,不存在添加 |
msetnx原子操作(只要有一個存在不做任何操作) | 可以同時設置多個key,只有有一個存在都不保存 |
decr | 進行數值類型的-1操作 |
decrby | 根據提供的數據進行減法操作 |
Incr | 進行數值類型的+1操作 |
incrby | 根據提供的數據進行加法操作 |
Incrbyfloat | 根據提供的數據加入浮點數(不是四捨五入) |
8.4 List類型
list 列表 相當於java中list 集合 特點 元素有序(插入和取出的順序一致) 且 可以重覆,key還是一個字元串,值是一個list
1.記憶體存儲模型
2.常用操作指令
命令 | 說明 |
---|---|
lpush | 將某個值加入到一個key列表頭部 lpush list1 xiaohu xiaohei xiaoming 當列表不存在的時候會進行創建 |
lpushx | 同lpush,但是必須要保證這個key存在 必須在列表進行存在的情況下從左插入 |
rpush | 將某個值加入到一個key列表末尾 |
rpushx | 同rpush,但是必須要保證這個key存在 |
lpop | 返回和移除列表左邊的第一個元素 |
rpop | 返回和移除列表右邊的第一個元素 |
lrange | 獲取某一個下標區間內的元素 lrange list 0 -1 |
llen | 獲取列表元素個數 |
lset | 設置某一個指定索引的值(索引必須存在) |
lindex | 獲取某一個指定索引位置的元素 |
lrem | 刪除重覆元素 |
ltrim | 保留列表中特定區間內的元素 |
linsert | 在某一個元素之前,之後插入新元素 |
8.5 Set類型
特點: Set類型 Set集合 元素無序 不可以重覆
1.記憶體存儲模型
2.常用命令 (如果set集合沒有元素,key也就不存在了)
命令 | 說明 |
---|---|
sadd | 為集合添加元素 |
smembers | 顯示集合中所有元素 無序 |
scard | 返回集合中元素的個數 |
spop | 隨機返回一個元素 並將元素在集合中刪除 |
smove | 從一個集合中向另一個集合移動元素 必須是同一種類型 |
srem | 從集合中刪除一個元素 |
sismember | 判斷一個集合中是否含有這個元素 |
srandmember | 隨機返回元素 後面可以加數字 表示每次返回的個數 |
sdiff | 去掉第一個集合中其它集合含有的相同元素 |
sinter | 求交集 |
sunion | 求和集 |
8.6 ZSet類型
特點: 可排序的set集合 排序 不可重覆
ZSET 官方 可排序SET sortSet
1.記憶體模型
2.常用命令
命令 | 說明 |
---|---|
zadd | 添加一個有序集合元素 zadd zset 2 xiaohu 3 xiaohu2 |
zcard | 返回集合的元素個數 |
zrange 升序 zrevrange 降序 | 返回一個範圍內的元素 如果想看看分數 withscores |
zrangebyscore | 按照分數查找一個範圍內的元素 zrangebyscore zset 0 20 withscores limit 0 2 |
zrank | 返回排名 |
zrevrank | 倒序排名 |
zscore | 顯示某一個元素的分數 |
zrem | 移除某一個元素 |
zincrby | 給某個特定元素加分 |
8.7 hash類型
特點: value 是一個map結構 存在key value key 無序的
redis key(String) value(map)
Map<String,Map<String,value>> map
舉例:map name zhangsan
1.記憶體模型
2.常用命令
命令 | 說明 |
---|---|
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加入浮點值 |
第一天說完上面知識點後,介紹可視化工具的安裝使用(引入修改配置文件,使得遠程連接)mac電腦的叫做medis https://getmedis.com/
下載官網:https://redisdesktop.com/download
註意問題:
1、如果還是連接不上,查看防火牆
2、埠被占用,可能是redis服務起多了 ps aux|grep redis