NoSQL簡介
NoSQL,全名為Not Only SQL,指的是非關系型的數據庫
隨着訪問量的上升,網站的數據庫性能出現了問題,於是nosql被設計出來
優點/缺點
優點:
高可擴展性
分布式計算
低成本
架構的靈活性,半結構化數據
沒有復雜的關系
缺點:
沒有標准化
有限的查詢功能(到目前為止)
最終一致是不直觀的程序
分類
類型 部分代表 特點
列存儲 Hbase 、 Cassandra 、 Hypertable 顧名思義,是按列存儲數據的。最大的特點是方便存儲結構化和半結構化數據,方便做數據壓縮,對針對某一列或者某幾列的查詢有非常大的IO優勢。
文檔存儲 MongoDB 、CouchDB 文檔存儲一般用類似json的格式存儲,存儲的內容是文檔型的。這樣也就有有機會對某些字段建立索引,實現關系數據庫的某些功能。
key-value存儲 TokyoCabinet/Tyrant、 BerkeleyDB、MemcacheDB 、 Redis 可以通過key快速查詢到其value。一般來說,存儲不管value的格式,照單全收。(Redis包含了其他功能)
圖存儲 Neo4J、 FlockDB 圖形關系的最佳存儲。使用傳統關系數據庫來解決的話性能低下,而且設計使用不方便。
對象存儲 db4o 、 Versant 通過類似面向對象語言的語法操作數據庫,通過對象的方式存取數據。
xml數據庫 BerkeleyDB、 XML、 BaseX 高效的存儲XML數據,並支持XML的內部查詢語法,比如XQuery,Xpath。
redis相關資源:
Redis 官網:https://redis.io/
Redis 在線測試:http://try.redis.io/
Redis菜鳥教程: https://www.runoob.com/redis/redis-tutorial.html
Redis安裝 配置服務器 啟動客戶端 數據操作 發布訂閱 主從配置 卸載Redis
Redis安裝
在線安裝
直接輸入命令 sudo apt-get install redis-server
安裝完成后,Redis服務器會自動啟動。
啟動 Redis
輸入命令:redis-server
使用 ps -aux|grep redies 命令可以看到服務器系統進程默認端口6379
查看 redis 是否還在運行
|
1
2
3
|
ps -ef | grep redis
--> 查看進程
netstat -an|grep 6379
--> redis的端口號是6379
$redis-cli
-->
|
使用netstat -nlt|grep 6379命令可以看到redis服務器狀態
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN
使用sudo /etc/init.d/redis-server status命令可以看到Redis服務器狀態
Redis服務器基本配置
配置文件為/etc/redis/redis.conf(在線安裝推薦)或者 /usr/local/redis/redis.conf(手動安裝)
首先sudo vi /etc/redis/redis.conf
添加Redis的訪問賬號
Redis服務器默認是不需要密碼的,假設設置密碼為hzlarm。
去掉requirepass 前面的注釋#,在后面添加密碼
requirepass hzlarm
開啟Redis的遠程連接
注釋掉綁定地址#bind 127.0.0.1
修改Redis的默認端口
port 6379
Redis以守護進程運行
如果以守護進程運行,則不會在命令行阻塞,類似於服務
如果以非守護進程運行,則當前終端被阻塞,無法使用
推薦改為yes,以守護進程運行
daemonize no|yes
Redis的數據文件
dbfilename dump.rdb
數據文件存儲路徑
dir /var/lib/redis
配置
解決-ubuntu18.04 安裝redis無法啟動
主機上禁用了IPv6,而Ubuntu的redis-server軟件包(版本5:4.0.9-1)附帶了:綁定127.0.0.1 :: 1
解決辦法
修改redis配置文件中的 bind 地址;注釋 bind 地址或將 bind 地址修改為 0.0.0.0
vim /etc/redis/redis.conf
// 注釋bind地址
#bind 127.0.0.1 ::1
//或修改bind地址-並允許其開放訪問
bind 0.0.0.0
啟動redis 服務
service redis-server start
檢查服務及端口
systemctl status redis-server
完成后重新啟動服務器
sudo /etc/init.d/redis-server restart or
sudo service redis-server restart or
sudo redis-server /etc/redis/redis.conf
Redis安裝 配置服務器 啟動客戶端 數據操作 發布訂閱 主從配置 卸載Redis
啟動客戶端
安裝Redis服務器,會自動地一起安裝Redis命令行客戶端程序。命令行輸入 redis-cli 如果設置了密碼hzlarm
redis-cli -a hzlarm
常用命令: Redis命令不區分大小寫
ping返回PONG表示暢通
help 命令行的幫助
quit 或者Ctrl+d或者Ctrl+c退出
鍵的命令
查找鍵,參數支持正則KEYS pattern例如keys *查看所有的key列表
判斷鍵是否存在,如果存在返回1,不存在返回0EXISTS key [key ...]
查看鍵對應的value的類型TYPE key
刪除鍵及對應的值DEL key [key ...]
設置過期時間,以秒為單位
創建時沒有設置過期時間則一直存在,直到使用使用DEL移除EXPIRE key seconds
查看有效時間,以秒為單位TTL key
修改 key 的名稱RENAME key newkey
Redis安裝 配置服務器 啟動客戶端 數據操作 發布訂閱 主從配置 卸載Redis
數據操作
redis是key-value的數據,所以每個數據都是一個鍵值對
鍵的類型是字符串
值的類型分為五種:
字符串string
哈希hash
列表list
集合set
有序集合zset
數據操作的全部命令,可以查看中文網站
接下來逐個介紹操作各類型的命令
各個數據類型應用場景:
類型 簡介 特性 場景
String(字符串) 二進制安全 可以包含任何數據,比如jpg圖片或者序列化的對象,一個鍵最大能存儲512M —
Hash(字典) 鍵值對集合,即編程語言中的Map類型 適合存儲對象,並且可以像數據庫中update一個屬性一樣只修改某一項屬性值(Memcached中需要取出整個字符串反序列化成對象修改完再序列化存回去) 存儲、讀取、修改用戶屬性
List(列表) 鏈表(雙向鏈表) 增刪快,提供了操作某一段元素的API 1,最新消息排行等功能(比如朋友圈的時間線) 2,消息隊列
Set(集合) 哈希表實現,元素不重復 1、添加、刪除,查找的復雜度都是O(1) 2、為集合提供了求交集、並集、差集等操作 1、共同好友 2、利用唯一性,統計訪問網站的所有獨立ip 3、好友推薦時,根據tag求交集,大於某個閾值就可以推薦
Sorted Set(有序集合) 將Set中的元素增加一個權重參數score,元素按score有序排列 數據插入集合時,已經進行天然排序 1、排行榜 2、帶權重的消息隊列
string
string是redis最基本的類型,一個 key 對應一個 value
最大能存儲512MB數據
string類型是二進制安全的,即可以為任何數據,比如數字、圖片、序列化對象等
命令
設置
設置鍵值set key value
設置鍵值及過期時間,以秒為單位SETEX key seconds value
設置鍵值及過期時間,以毫秒為單位PSETEX key milliseconds value
設置多個鍵值MSET key value [key value ...]
只有在 key 不存在時設置 key 的值。SETNX key value
同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。MSETNX key value [key value ...]
用 value 參數覆寫給定 key 所儲存的字符串值,從偏移量 offset 開始。SETRANGE key offset value
獲取
根據鍵獲取值,如果不存在此鍵則返回nilGET key
根據多個鍵獲取多個值MGET key1 [key2 ...]
返回 key 中字符串值的子字符GETRANGE key start end
將給定 key 的值設為 value ,並返回 key 的舊值(old value)。GETSET key value
運算(要求:值是數字)
將key對應的value加1INCR key
將key對應的value加整數INCRBY key increment
將key對應的value減1DECR key
將key對應的value減整數DECRBY key decrement
其它
追加值APPEND key value
獲取值長度STRLEN key
hash
Redis hash 是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40多億)。
命令
設置
設置單個屬性HSET key field value
設置多個屬性HMSET key field1 value [field2 value ...]
只有在字段 field 不存在時,設置哈希表字段的值。HSETNX key field value
獲取
獲取一個屬性的值HGET key field
獲取多個屬性的值HMGET key field1 [field2 ...]
獲取所有屬性和值HGETALL key
獲取所有的屬性HKEYS key
返回包含屬性的個數HLEN key
獲取所有值HVALS key
其它
判斷屬性是否存在HEXISTS key field
刪除屬性及值HDEL key field [field ...]
返回值的字符串長度HSTRLEN key field ERR unknown command ‘HSTRLEN’
查看哈希表 key 中,指定的字段是否存在HEXISTS key field
為哈希表 key 中的指定字段的整數值加上增量 incrementHINCRBY key field increment
為哈希表 key 中的指定字段的浮點數值加上增量 incrementHINCRBYFLOAT key field increment
迭代哈希表中的鍵值對HSCAN key cursor [MATCH pattern] [COUNT count]
list
列表是簡單的string列表,按照插入順序排序
可以在列表的頭部或者尾部添加元素
命令
設置
在頭部插入一個或多個數據LPUSH key value1 [value2 ...]
將一個值插入到已存在的列表頭部LPUSHX key value
在尾部插入一個或多個數據RPUSH key value1 [value2 ...]
為已存在的列表添加值RPUSHX key value
在列表的元素前或后插入新元素LINSERT key BEFORE|AFTER pivot value
通過索引設置列表元素的值LSET key index value(索引是基於0的下標,索引可以是負數,表示偏移量是從list尾部開始計數,如-1表示列表的最后一個元素)
獲取
移出並獲取列表的第一個元素LPOP key
移出並返回列表最后一個元素RPOP key
移除列表元素LREM key count value(count > 0 : 從表頭開始向表尾搜索,移除與 VALUE 相等的元素,數量為 COUNT 。count < 0 : 從表尾開始向表頭搜索,移除與 VALUE 相等的元素,數量為 COUNT 的絕對值。count = 0 : 移除表中所有與 VALUE 相等的值。)
獲取列表指定范圍內的元素LRANGE key start stop
(start和stop偏移量都是基於0的下標,偏移量也可以是負數,表示偏移量是從list尾部開始計數,如-1表示列表的最后一個元素)
移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。BLPOP key1 [key2 ] timeout
移出並獲取列表的最后一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。BRPOP key1 [key2 ] timeout
從列表中彈出一個值,將彈出的元素插入到另外一個列表中並返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。BRPOPLPUSH source destination timeout
移除列表的最后一個元素,並將該元素添加到另一個列表並返回RPOPLPUSH source destination
其它
對一個列表進行修剪(trim),讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除LTRIM key start stop
(start 和 stop偏移量都是基於0的下標,偏移量也可以是負數,表示偏移量是從list尾部開始計數,如-1表示列表的最后一個元素)
獲取列表長度LLEN key
通過索引獲取列表中的元素LINDEX key index
set
Set 是 String 類型的無序集合。集合成員是唯一的,不能出現重復的數據。
集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是 O(1)。
命令
設置
添加元素SADD key member [member ...]
獲取
返回key集合所有的元素SMEMBERS key
返回集合元素個數SCARD key
其它
求多個集合的交集SINTER key [key ...]
返回給定所有集合的交集並存儲在集合destination 中SINTERSTORE destination key1 [key2]
求某集合與其它集合的差集SDIFF key [key ...]
返回給定所有集合的差集並存儲在 集合destination 中SDIFFSTORE destination key1 [key2]
將 member 元素從 source 集合移動到 destination 集合SMOVE source destination member
求多個集合的合集SUNION key [key ...]
判斷元素是否在集合中SISMEMBER key member
移除並返回集合中的一個隨機元素SPOP key
返回集合中一個或多個隨機數SRANDMEMBER key [count]
移除集合中一個或多個成員SREM key member1 [member2]
所有給定集合的並集存儲在 destination 集合中SUNIONSTORE destination key1 [key2]
迭代集合中的元素SSCAN key cursor [MATCH pattern] [COUNT count]
zset
有序集合和集合一樣也是string類型元素的集合,且不允許重復的成員。
每個元素都會關聯一個double類型的score,表示權重,通過權重將元素從小到大排序,元素的score可以相同
命令
設置
添加ZADD key score member [score member ...]
獲取
返回指定范圍內的元素ZRANGE key start stop
返回元素個數ZCARD key
返回有序集key中,score值在min和max之間的成員ZCOUNT key min max
返回有序集key中,成員member的score值ZSCORE key member
…
ZINCRBY key increment member
有序集合中對指定成員的分數加上增量 increment
ZINTERSTORE destination numkeys key [key ...]
計算給定的一個或多個有序集的交集並將結果集存儲在新的有序集合 key 中
ZLEXCOUNT key min max
在有序集合中計算指定字典區間內成員數量
ZRANGEBYLEX key min max [LIMIT offset count]
通過字典區間返回有序集合的成員
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
通過分數返回有序集合指定區間內的成員
ZRANK key member
返回有序集合中指定成員的索引
ZREM key member [member ...]
移除有序集合中的一個或多個成員
ZREMRANGEBYLEX key min max
移除有序集合中給定的字典區間的所有成員
ZREMRANGEBYRANK key start stop
移除有序集合中給定的排名區間的所有成員
ZREMRANGEBYSCORE key min max
移除有序集合中給定的分數區間的所有成員
ZREVRANGE key start stop [WITHSCORES]
返回有序集中指定區間內的成員,通過索引,分數從高到底
ZREVRANGEBYSCORE key max min [WITHSCORES]
返回有序集中指定分數區間內的成員,分數從高到低排序
ZREVRANK key member
返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序
ZUNIONSTORE destination numkeys key [key ...]
計算給定的一個或多個有序集的並集,並存儲在新的 key 中
ZSCAN key cursor [MATCH pattern] [COUNT count]
迭代有序集合中的元素(包括元素成員和元素分值)
Redis安裝 配置服務器 啟動客戶端 數據操作 發布訂閱 主從配置 卸載Redis
發布訂閱
發布者不是計划發送消息給特定的接收者(訂閱者),而是發布的消息分到不同的頻道,不需要知道什么樣的訂閱者訂閱
訂閱者對一個或多個頻道感興趣,只需接收感興趣的消息,不需要知道什么樣的發布者發布的
發布者和訂閱者的解耦合可以帶來更大的擴展性和更加動態的網絡拓撲
客戶端發到頻道的消息,將會被推送到所有訂閱此頻道的客戶端
客戶端不需要主動去獲取消息,只需要訂閱頻道,這個頻道的內容就會被推送過來
消息的格式
推送消息的格式包含三部分
第一部分
:消息類型,包含三種類型
subscribe,表示訂閱成功
unsubscribe,表示取消訂閱成功
message,表示其它終端發布消息
如果第一部分的值為subscribe,則第二部分是頻道,第三部分是現在訂閱的頻道的數量
如果第一部分的值為unsubscribe,則第二部分是頻道,第三部分是現在訂閱的頻道的數量,如果為0則表示當前沒有訂閱任何頻道,當在Pub/Sub以外狀態,客戶端可以發出任何redis命令
如果第一部分的值為message,則第二部分是來源頻道的名稱,第三部分是消息的內容
命令
訂閱SUBSCRIBE 頻道名稱 [頻道名稱 ...]
取消訂閱,如果不寫參數,表示取消所有訂閱UNSUBSCRIBE 頻道名稱 [頻道名稱 ...]
將信息發送到指定的頻道。PUBLISH 頻道 消息
Redis安裝 配置服務器 啟動客戶端 數據操作 發布訂閱 主從配置 卸載Redis
主從配置
一個master可以擁有多個slave,一個slave又可以擁有多個slave,如此下去,形成了強大的多級服務器集群架構
比如,將ip為192.168.1.10的機器作為主服務器,將ip為192.168.1.11的機器作為從服務器
設置主服務器的配置
sudo vi /etc/redis/redis.conf修改綁定ip
bind 192.168.1.10 重啟redis服務器
設置從服務器的配置
sudo vi /etc/redis/redis.conf注意:在slaveof后面寫主機ip,再寫端口,而且端口必須寫
bind 192.168.1.11
slaveof 192.168.1.10 6379
重啟redis服務器
啟動客戶端redis-cli -h修改后的ip
在master和slave分別執行info命令,查看輸出信息
在master上寫數據
set hello world
在slave上讀數據
get hello
Redis安裝 配置服務器 啟動客戶端 數據操作 發布訂閱 主從配置 卸載Redis
卸載redies
sudo apt-get remove redis-server
sudo apt-get autoremove --purge redis-server
————————————————
版權聲明:本文為CSDN博主「hzlarm」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/hzlarm/article/details/99432240
