摘要:數據過期處理可以精確到毫秒的安裝及部署部署環境需要系統,同樣也有版本,可以練習使用。官方不典型支持。關閉進程正常關閉服務的地址端口號如果是本地服務,而且端口是這些參數可以省略。命令可以設置的有效期。修改端口,允許集群。
NoSql數據庫之Redis
1、什么是nosql,nosql的應用場景
2、Nonsql數據庫的類型
a) Key-value
b) 文檔型(類似于json)
c) 列式存儲
d) 圖式
3、redis的相關概念kv型的。
4、Redis的安裝及部署
5、Redis的使用方法及數據類型
a) Redis啟動及關閉
b) Redis的數據類型
i. String類型
ii. Hash類型
iii. List類型
iv. Set類型
v. SortedSet(zset)
6、redis數據庫的持久化
a) Rdb快照形式
b) Aof命令形式
7、主從復制
8、Redis集群
2 什么是nosql
2.1 nosql
Nosql=Not only sql,非關系型數據庫。
Web1.0:內容輸出型網站。類似于搜狐、網頁、新浪。
Web2.0:交互型的網站。例如人人網、微博等。
關系型數據庫遇到的問題:
1、High performance - 對數據庫高并發讀寫的需求
2、大數據量存儲。
3、High Scalability && High Availability- 對數據庫的高可擴展性和高可用性的需求
此時nosql數據出現了。
2.2 Nosql數據庫的類型
1、key-value類型。常用的就是redis。可以用作緩存使用。
2、文檔型。Mongodb。存儲的是類似于json的數據bson。
3、列式存儲。Hbase。基于hadoop的數據庫。
4、圖式存儲。典型應用:社交網絡
3 Redis的相關概念
3.1 什么是redis
Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫。它通過提供多種鍵值數據類型來適應不同場景下的存儲需求,目前為止Redis支持的鍵值數據類型如
下:
字符串類型
散列類型
列表類型
集合類型
有序集合類型。
3.2 Redis的應用場景
緩存(數據查詢、短連接、新聞內容、商品內容等等)。(最多使用)
分布式集群架構中的session分離。
聊天室的在線好友列表。
任務隊列。(秒殺、搶購、12306等等)
應用排行榜。
網站訪問統計。
數據過期處理(可以精確到毫秒)
4 Redis的安裝及部署
4.1 Redis部署環境
需要linux系統,centos6.4
Redis同樣也有windows版本,可以練習使用。官方不典型支持。推薦使用linux版本。
需要gcc的開發環境。
4.2 Redis的下載
http://redis.io/
在這里插入圖片描述
最新版本:3.0.3
本課程的版本:3.0.0
在這里插入圖片描述
是一個redis的源碼包,c語言開發的。
4.3 安裝步驟
第一步:安裝linux虛擬機。Centos6.4(32位)
第二步:把源碼包上傳到服務器。
第三步:解壓源碼包。
tar -zxvf redis-3.0.0.tar.gz
第四步:編譯源碼,需要gcc的環境。如果沒有就安裝一個,需要聯網。
安裝gcc:yum install gcc-c++
編譯源碼:進入源碼目錄,make。
第五步:安裝
make install PREFIX=/usr/local/redis
PREFIX:指定安裝目錄
在這里插入圖片描述
4.4 啟動和關閉
4.4.1 前端啟動模式
在bin 目錄下執行:
./redis-server
在這里插入圖片描述
4.4.2 后端啟動模式
需要redis.conf配置文件:
在這里插入圖片描述把此文件復制到redis的目錄。
修改redis.conf文件:daemonize yes(默認是no)
啟動:
./redis-server redis.conf
需要指定一個配置文件。
4.4.3 關閉redis
1、kill進程
2、正常關閉
./redis-cli -h 192.168.25.147 -p 6379 shutdown
-h:服務的ip地址
-p:端口號
如果是本地服務,而且端口是6379這些參數可以省略。
4.5 Redis的客戶端
4.5.1 Redis自帶客戶端:redis-cli
簡單命令:
Ping:測試服務器是否還活著。
Set:命令,添加一個key
Set key value
例子:
127.0.0.1:6379> set key1 100
OK
Get命令,取一個key的值
Get key
例子:
127.0.0.1:6379> get key1
“100”
4.5.2 Java的客戶端Jedis
如果遠程連接失敗,查看linux 的防火墻是否開放redis的服務端口。
第一種方法:關閉防火墻:
service iptables stop
第二種方法:修改配置文件開放指定端口。
第一步:修改:
vim /etc/sysconfig/iptables
在這里插入圖片描述第二步:重啟防火墻服務
[root@localhost ~]# service iptables restart
iptables: Flushing firewall rules: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
4.6 圖像客戶端
在這里插入圖片描述
Redis中默認有16個數據庫。0-15號。默認操作0號庫。
使用命令切換數據庫:
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 16
(error) ERR invalid DB index
127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]>
庫和庫之間相互隔離,不同的庫中可以有相同的key。
數據庫的數量在redis.conf中配置:
在這里插入圖片描述
5 Redis中的數據類型
5.1 String類型
基礎數據類型。在redis中所有的值都是字符串。在redis中命令不區分大小寫。
1、set命令:添加一個key
2、get命令:取一個key
3、Incr命令:加一命令。如果key的值是數值類型可以使用此命令。
127.0.0.1:6379> incr a
(integer) 101
4、decr命令:減一命令
127.0.0.1:6379> decr a
(integer) 100
5、del命令:刪除key
127.0.0.1:6379> del a
(integer) 1
127.0.0.1:6379> get a
(nil)
5.2 Hash類型
Key-value(hash)-key-value
|-key-value
|-key-value
命令:
1、Hset命令:添加一個key
Hset key hashkey value
127.0.0.1:6379> hset hash1 a 1
(integer) 1
2、hmset:批量添加key
Hmset key hkey1 value hkey2 value hkey3 value …
127.0.0.1:6379> hmset hash2 a 1 b 2 c 3 d 4
OK
3、hget命令:取一個hash key
127.0.0.1:6379> hget hash1 a
“1”
4、hmget命令:取多個hash key
127.0.0.1:6379> hmget hash2 a b c
“1” “2” “3” 4、自增命令:hincrby 127.0.0.1:6379> hmget hash2 a b c “1” “2” “3” 127.0.0.1:6379> hincrby hash2 a 10 (integer) 11
5.3 List類型
Redis中是鏈表形式的存儲。
可以當做隊列使用,也可以當做棧使用。
1、在左邊添加元素:lpush
Lpush key value1 value2 value3
127.0.0.1:6379> lpush list1 a b c d e f
(integer) 6
127.0.0.1:6379>
2、右邊添加元素:rpush
127.0.0.1:6379> rpush list1 1 2 3 4 5
(integer) 11
在這里插入圖片描述3、取最左邊元素:lpop,取完列表中此元素刪除。
127.0.0.1:6379> lpop list1
“f”
4、取最右元素:rpop
127.0.0.1:6379> rpop list1
“5”
127.0.0.1:6379>
5、查看列表中的元素:lrange
Lrange key 起始下標 結束下標(取全部的結束下標就是-1)
127.0.0.1:6379> lrange list1 0 3
“e” “d” “c” “b” 127.0.0.1:6379> lrange list1 0 -1 “e” “d” “c” “b” “a” “1” “2” “3” “4” 127.0.0.1:6379>
5.4 Set類型
特點:集合中的元素是無序的并且沒有重復的。
5.4.1 命令
1、向集合中添加元素:sadd
Sadd key value1 value2 value3 …
127.0.0.1:6379> sadd set1 a b c d e
(integer) 5
2、刪除元素:srem
Srem key value
127.0.0.1:6379> srem set1 a
(integer) 1
3、查看集合中的元素:smembers
Smembers key
127.0.0.1:6379> smembers set1
“c” “d” “b” “e” 127.0.0.1:6379>
5.4.2 集合的運算
1、差集運算
屬于A并且不屬于B的元素構成的集合。
在這里插入圖片描述SDIFF key [key …]
127.0.0.1:6379> sadd seta a b c d e
(integer) 5
127.0.0.1:6379> sadd setb c d e f g
(integer) 5
127.0.0.1:6379> sdiff seta setb
“a” “b” 2、交集運算 屬于A且屬于B的元素構成的集合。
在這里插入圖片描述SINTER key [key …]
127.0.0.1:6379> sinter seta setb
“c” “d” “e” 127.0.0.1:6379>
5.4.3 并集運算
屬于A或者屬于B的元素構成的集合
在這里插入圖片描述
SUNION key [key …]
127.0.0.1:6379> sunion seta setb
“c” “d” “b” “a” “f” “e” “g”
5.5 SortedSet類型(zset)
特點集合但是是有序的。在此集合中每個元素都有一個分數,可以根據分數升序排列。
5.5.1 命令
1、添加元素命令:zadd
Zadd key 得分 元素 得分 元素 。。。。。
127.0.0.1:6379> zadd zset1 1 a 2 b 3 c 4 d
(integer) 4
2、刪除元素:zrem
127.0.0.1:6379> zrem zset1 a
(integer) 1
3、查看計劃中的元素:zrange
Zrange key 起始下標 結束下標(-1全部)withscores(帶分數)
127.0.0.1:6379> zrange zset1 0 -1
“b” “c” “d” 127.0.0.1:6379> zrange zset1 0 -1 withscores “b” “2” “c” “3” “d” “4” 4、降序排列:zrevrange 127.0.0.1:6379> zrevrange zset1 0 -1 withscores “d” “4” “c” “3” “b” “2”
適用于應用排行榜。
6 Keys命令
6.1 可以設置key的有效期。
1、設置有效期:expire
Expire key 生存期(以秒為單位)
127.0.0.1:6379> set a 100
OK
127.0.0.1:6379> expire a 30
(integer) 1
2、查看key的生存期
Ttl key
-1:永久
-2:key不存在
3、持久化keypersist,可以把key持久化保存
127.0.0.1:6379> persist a
(integer) 1
6.2 其他keys命令
Keys命令,可以查看數據庫中所有的可以列表。
127.0.0.1:6379> keys *
“list1” “zset1” “a” “hash2” “key1” “setb” “seta” “list” “hash1” “hello” “set1”
7 Redis的持久化
兩種方案:
1、快照形式RDB形式。(默認開啟)
2、Aof形式。命令形式存儲。(需要手動開啟)
Rdb:速度快。丟失數據的概率大。
Aof:默認每秒鐘保存一次命令。性能低,可靠性高。最多丟失一秒的數據。
需要在redis.conf中配置。
Rdb:
在這里插入圖片描述
Aof方案:(append only file)
在這里插入圖片描述
兩種方案同時開啟,使用aof恢復數據。
8 主從復制
只需要修改redis.conf文件就可以。
需要配置兩個虛擬機,如果不能實現,至少需要兩個數據庫實例。
第一步:創建slave服務器的實例。
1、把redis的bin目錄復制一份。
2、修改redis.conf文件。修改端口號。
在這里插入圖片描述第二步:配置從服務器,主服務器不需要做任何修改。修改從服務器的redis.conf文件。
在這里插入圖片描述第三步:啟動從服務器
9 redis集群
9.1 集群架構圖
在這里插入圖片描述
9.2 集群中的槽slot
槽是用來存儲key。
9.3 redis-cluster投票:容錯
在這里插入圖片描述
(1)領著投票過程是集群中所有master參與,如果半數以上master節點與master節點通信超過(cluster-node-timeout),認為當前master節點掛掉.
(2):什么時候整個集群不可用(cluster_state:fail)?
a:如果集群任意master掛掉,且當前master沒有slave.集群進入fail狀態,也可以理解成集群的slot映射[0-16383]不完成時進入fail狀態. ps : redis-3.0.0.rc1加入cluster-require-full-coverage參數,默認關閉,打開集群兼容部分失敗.
b:如果集群超過半數以上master掛掉,無論是否有slave集群進入fail狀態.
ps:當集群不可用時,所有對集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤
9.4 安裝步驟
第一步:需要6臺虛擬機。至少需要6個redis實例。
在這里插入圖片描述第二步:修改每個實例的端口7001~7006。需要修改redis.conf文件。
第三步:安裝ruby環境
安裝ruby
yum install ruby
yum install rubygems
安裝ruby和redis的接口程序
拷貝redis-3.0.0.gem至/usr/local下
執行:
gem install /usr/local/redis-3.0.0.gem
第四步:在/root/redis-3.0.0/src目錄下有一個redis-trib.rb文件就是一個ruby的腳本文件,是用來創建redis集群的腳本文件。把此文件復制到/usr/local/redis-cluster目錄下。
第五步:修改每個實例的redis.conf文件。
在這里插入圖片描述第六步:啟動每個實例。
在這里插入圖片描述第七步:使用redis-trib.rb腳本創建集群。
./redis-trib.rb create --replicas 1 192.168.25.147:7001 192.168.25.147:7002 192.168.25.147:7003 192.168.25.147:7004 192.168.25.147:7005 192.168.25.147:7006
[root@localhost redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.25.147:7001 192.168.25.147:7002 192.168.25.147:7003 192.168.25.147:7004 192.168.25.147:7005 192.168.25.147:7006
Creating cluster Connecting to node 192.168.25.147:7001: OK Connecting to node 192.168.25.147:7002: OK Connecting to node 192.168.25.147:7003: OK Connecting to node 192.168.25.147:7004: OK Connecting to node 192.168.25.147:7005: OK Connecting to node 192.168.25.147:7006: OK Performing hash slots allocation on 6 nodes… Using 3 masters: 192.168.25.147:7001 192.168.25.147:7002 192.168.25.147:7003 Adding replica 192.168.25.147:7004 to 192.168.25.147:7001 Adding replica 192.168.25.147:7005 to 192.168.25.147:7002 Adding replica 192.168.25.147:7006 to 192.168.25.147:7003 M: a96e224fe9aa5667a908a721c18aeeb78c0e628d 192.168.25.147:7001 slots:0-5460 (5461 slots) master M: 22f03de15a3fd7260f5efa83539a342b94f07032 192.168.25.147:7002 slots:5461-10922 (5462 slots) master M: 75ccb72ea57cce1fbd951117c021d385f126b894 192.168.25.147:7003 slots:10923-16383 (5461 slots) master S: 2525654870fee9fa3a06d96c08f39e5c0912afea 192.168.25.147:7004 replicates a96e224fe9aa5667a908a721c18aeeb78c0e628d S: f153fb80c15168d6701d7ef2b5fddaff2f82ffef 192.168.25.147:7005 replicates 22f03de15a3fd7260f5efa83539a342b94f07032 S: 6d6565162bd0550f29fff20fe52ea6178f748fa1 192.168.25.147:7006 replicates 75ccb72ea57cce1fbd951117c021d385f126b894 Can I set the above configuration? (type ‘yes’ to accept): yes Nodes configuration updated Assign a different config epoch to each node Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join… Performing Cluster Check (using node 192.168.25.147:7001) M: a96e224fe9aa5667a908a721c18aeeb78c0e628d 192.168.25.147:7001 slots:0-5460 (5461 slots) master M: 22f03de15a3fd7260f5efa83539a342b94f07032 192.168.25.147:7002 slots:5461-10922 (5462 slots) master M: 75ccb72ea57cce1fbd951117c021d385f126b894 192.168.25.147:7003 slots:10923-16383 (5461 slots) master M: 2525654870fee9fa3a06d96c08f39e5c0912afea 192.168.25.147:7004 slots: (0 slots) master replicates a96e224fe9aa5667a908a721c18aeeb78c0e628d M: f153fb80c15168d6701d7ef2b5fddaff2f82ffef 192.168.25.147:7005 slots: (0 slots) master replicates 22f03de15a3fd7260f5efa83539a342b94f07032 M: 6d6565162bd0550f29fff20fe52ea6178f748fa1 192.168.25.147:7006 slots: (0 slots) master replicates 75ccb72ea57cce1fbd951117c021d385f126b894 [OK] All nodes agree about slots configuration. Check for open slots… Check slots coverage… [OK] All 16384 slots covered. [root@localhost redis-cluster]#
9.5 連接集群
9.5.1 使用redis-cli連接集群
redis01/redis-cli -p 7005 -c
連接集群必須添加-c參數。
9.5.2 查看集群信息
192.168.25.147:7003> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:3
cluster_stats_messages_sent:827
cluster_stats_messages_received:827
9.5.3 查看集群節點狀態
192.168.25.147:7003> cluster nodes
22f03de15a3fd7260f5efa83539a342b94f07032 192.168.25.147:7002 master - 0 1438330186924 2 connected 5461-10922
6d6565162bd0550f29fff20fe52ea6178f748fa1 192.168.25.147:7006 slave 75ccb72ea57cce1fbd951117c021d385f126b894 0 1438330185914 6 connected
f153fb80c15168d6701d7ef2b5fddaff2f82ffef 192.168.25.147:7005 slave 22f03de15a3fd7260f5efa83539a342b94f07032 0 1438330186420 5 connected
a96e224fe9aa5667a908a721c18aeeb78c0e628d 192.168.25.147:7001 master - 0 1438330188440 1 connected 0-5460
75ccb72ea57cce1fbd951117c021d385f126b894 192.168.25.147:7003 myself,master - 0 0 3 connected 10923-16383
2525654870fee9fa3a06d96c08f39e5c0912afea 192.168.25.147:7004 slave a96e224fe9aa5667a908a721c18aeeb78c0e628d 0 1438330187431 1 connected
9.6 添加節點
9.6.1 第一步:
創建一個新的redis實例,如果文件中存在nodes.conf,需要刪除。
9.6.2 第二步:
修改redis.conf文件。修改端口,允許集群。
9.6.3 第三步:
啟動服務器
9.6.4 第四步:
使用redis-trib.rb向集群添加節點。
[root@localhost redis-cluster]# ./redis-trib.rb add-node 192.168.25.147:7007 192.168.25.147:7001
Adding node 192.168.25.147:7007 to cluster 192.168.25.147:7001 Connecting to node 192.168.25.147:7001: OK Connecting to node 192.168.25.147:7006: OK Connecting to node 192.168.25.147:7002: OK Connecting to node 192.168.25.147:7003: OK Connecting to node 192.168.25.147:7005: OK Connecting to node 192.168.25.147:7004: OK Performing Cluster Check (using node 192.168.25.147:7001) M: a96e224fe9aa5667a908a721c18aeeb78c0e628d 192.168.25.147:7001 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 6d6565162bd0550f29fff20fe52ea6178f748fa1 192.168.25.147:7006 slots: (0 slots) slave replicates 75ccb72ea57cce1fbd951117c021d385f126b894 M: 22f03de15a3fd7260f5efa83539a342b94f07032 192.168.25.147:7002 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: 75ccb72ea57cce1fbd951117c021d385f126b894 192.168.25.147:7003 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: f153fb80c15168d6701d7ef2b5fddaff2f82ffef 192.168.25.147:7005 slots: (0 slots) slave replicates 22f03de15a3fd7260f5efa83539a342b94f07032 S: 2525654870fee9fa3a06d96c08f39e5c0912afea 192.168.25.147:7004 slots: (0 slots) slave replicates a96e224fe9aa5667a908a721c18aeeb78c0e628d [OK] All nodes agree about slots configuration. Check for open slots… Check slots coverage… [OK] All 16384 slots covered. Connecting to node 192.168.25.147:7007: OK Send CLUSTER MEET to node 192.168.25.147:7007 to make it join the cluster. [OK] New node added correctly.
9.6.5 第五步:分配槽。
添加完主節點需要對主節點進行hash槽分配這樣該主節才可以存儲數據。
redis集群有16384個槽,集群中的每個結點分配自已槽,通過查看集群結點可以看到槽占用情況。
在這里插入圖片描述
給剛添加的7007結點分配槽:
1:連接上集群
./redis-trib.rb reshard 192.168.101.3:7001(連接集群中任意一個可用結點都行)
2:輸入要分配的槽數量
在這里插入圖片描述
輸入 500表示要分配500個槽
3:輸入接收槽的結點id
在這里插入圖片描述這里準備給7007分配槽,通過cluster nodes查看7007結點id為15b809eadae88955e36bcdbb8144f61bbbaf38fb
輸入:15b809eadae88955e36bcdbb8144f61bbbaf38fb
4:輸入源結點id
在這里插入圖片描述這里輸入all
5:輸入yes開始移動槽到目標結點id
在這里插入圖片描述
9.6.6 第六步:給7007實例添加一個新的從服務器
1、創建一個新的redis實例
2、配置實例的端口號為7008
3、使用ruby腳本添加從節點。
執行如下命令:
./redis-trib.rb add-node --slave --master-id a66a2d3239122ad51f88fb6d1a0428effc18f98d 192.168.25.147:7008 192.168.25.147:7001
9.7 刪除結點:
./redis-trib.rb del-node 127.0.0.1:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017
刪除已經占有hash槽的結點會失敗,報錯如下:
[ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.
作者:kruppwang1
來源:CSDN
原文:https://blog.csdn.net/kruppwa...
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72532.html
閱讀 2919·2023-04-26 02:14
閱讀 3771·2019-08-30 15:55
閱讀 1855·2019-08-29 16:42
閱讀 2770·2019-08-26 11:55
閱讀 2855·2019-08-23 13:38
閱讀 496·2019-08-23 12:10
閱讀 1321·2019-08-23 11:44
閱讀 2826·2019-08-23 11:43