1.Redis
Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。它支持多種類型的數據結構,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與范圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內置了 復制(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的 磁盤持久化(persistence), 并通過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)。Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫。
Redis 與其他 key - value 緩存產品有以下三個特點:
- Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
- Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
- Redis支持數據的備份,即master-slave模式的數據備份。
2.Redis安裝
1.windows安裝
下載官方文件之后,安裝即可。
在命令窗口輸入命令
redis-cli
啟動成功
- 設置遠程訪問
找到redis的配置文件
注釋bind 127.0.0.1即可實現遠程連接訪問
2.linux安裝
- 下載安裝包解壓,解壓完畢在文件夾內打開命令窗口
#輸入命令
make
#完畢之后在當前窗口輸入新的命令
sudo make install
- 設置redis在后臺運行
把daemonize 改為yes即可實現在后臺運行
-
啟動和關閉redis服務
#啟動redis服務
./redis-server redis.conf
#查看redis服務進程 是否啟動成功
ps -ef | grep redis
ps -A | grep redis
#redis客戶端啟動
redis-cli
#關閉redis服務
ps -A | grep redis
3.redis常見配置
- 配置文件redis.conf
- 常見配置項
- bind 127.0.0.1 [綁定ip地址,遠程訪問請注釋]
- port 6379 [默認訪問地址 6379]
- daemonize yes [是否以后臺進程<守護進程>運行]
- dbfilename dump.rdb [存儲數據的文件]
- dir ./. [存儲數據的文件所在路徑]
- redis中的數據類型
- redis的數據存儲:key=value 鍵值對
- key<鍵>的數據類型:字符串
- value<值的類型>:
- string字符串
- hash哈希
- list列表
- set集合
- zset有序集合
4.redis數據操作
- string:字符串操作
set key value :給一個key賦值value
setex key seconds value:給一個key設置值value,過期時間seconds
mset key value [key value]:設置多個鍵值對get key:根據key獲取一個值
mget key [key]:根據多個key獲取多個值incr key :將key對應的值+1
incrby key increment:將key對應的值+increment
decr key:將key對應的值-1
decrby key increment:將key對應的值-incrementappend key value:將value的值拼接到x后面
strlen key:獲取key對應的值的長度
- key操作
keys pattern:查找鍵,支持正則
exists key:查找鍵是否存在,存在返回1,否則返回0
type key:查看鍵對應的值的類型
del key:根據key刪除鍵值對
expire key seconds:給key設置過期時間
ttl key:查看鍵的有效時間(顯示結果為-2 的話表示過期,-1表示永不過期)
- hash:用于存儲對象,對象的格式為鍵值對
hset key field value:設置單個屬性
hmset key field value [field value]:設置多個屬性hget key field :獲取key對應的值
hmget key field [field]:獲取多個key對應的value值
hgetall key:獲取所有屬性和值
hkeys key:獲取所有的屬性
hlen key:獲取包含屬性的個數
hvals key:獲取所有的值
hexists key field:判斷屬性是否存在
hdel key field [field]:根據屬性名稱刪除屬性及值
hstrlen key field:返回值的字符串長度
- list列表:有序存儲多個數據
lpush key value [value]:列表頭部增加多個數據
rpush key value [value]:列表尾部增加多個數據
linsert key before | after privot value:在一個元素錢/后插入數據
lset key index value:設置指定索引的元素的值lpop key:刪除并且獲取key對應的list第一個元素
rpop key:刪除并且獲取key對應的list最后一個元素
lrange key start stop:返回存在在key的list中指定范圍的數據llen key:獲取列表的長度
lindex key index:獲取列表中索引對應的元素
ltrim key start stop:獲取列表中start~stop組成的新的列表
- set集合:無序存儲多個數據
sadd key value [value]:添加多個數據到key集合中
smembers key:獲取key集合中所有的數據
sismember key value:判斷value是否在key集合中存在
scard key:獲取key集合中元素的個數sinter key [key]:獲取多個集合 交集
sdiff key [key]:獲取多個集合的差集
sunion key [key]:獲取多個集合的并集
- zset集合:有序存儲多個數據
- sorted set,有序集合
- 元素為string類型
- 元素具有唯一性,不重復
- 每個元素都會關聯一個double類型的score,表示權重,通過權重將元素從小到大排序
- 元素的score可以相同
zadd key score value [ score value]:添加多個帶權重的數據到key集合中
zrange key start stop:獲取指定范圍中所有的元素
zcard key:返回元素的個數
zcount key min max :返回score值在min和max之間的數據
zscore key member:返回集合中member元素的score值
5.redis發布訂閱
- 發布者不是計劃發送消息給特定的接收者(訂閱者),而是發布的消息分到不同的頻道,不需要知道什么樣的訂閱者訂閱
- 訂閱者對一個或多個頻道感興趣,只需接收感興趣的消息,不需要知道什么樣的發布者發布的
- 發布者和訂閱者的解耦合可以帶來更大的擴展性和更加動態的網絡拓撲
- 客戶端發到頻道的消息,將會被推送到所有訂閱此頻道的客戶端
- 客戶端不需要主動去獲取消息,只需要訂閱頻道,這個頻道的內容就會被推送過來
- 消息的格式
推送消息的格式包含三部分
part1:消息類型,包含三種類型
- subscribe,表示訂閱成功
- unsubscribe,表示取消訂閱成功
- message,表示其它終端發布消息
如果第一部分的值為subscribe,則第二部分是頻道,第三部分是現在訂閱的頻道的數量
如果第一部分的值為unsubscribe,則第二部分是頻道,第三部分是現在訂閱的頻道的數量,如果為0則表示當前沒有訂閱任何頻道,當在Pub/Sub以外狀態,客戶端可以發出任何redis命令
如果第一部分的值為message,則第二部分是來源頻道的名稱,第三部分是消息的內容
subscribe 頻道名稱 [頻道名稱]:訂閱多個頻道
unsubscribe 頻道名稱 [頻道名稱]:取消多個頻道的訂閱
publish 頻道 消息:向指定的頻道推送消息
打開多個命令窗口:
- 第一個窗口當做訂閱者
輸入命令:
#啟動redis redis-cli #選擇數據庫 select 0 #訂閱頻道 subscribe zhiji
- 第二個窗口當做客戶端
輸入命令
#啟動redis redis-cli #選擇數據庫 select 1 #發布消息 publish zhiji 'hellow'
6.主從雙備
主從配置
一個master可以擁有多個slave,一個slave又可以擁有多個slave,如此下去,形成了強大的多級服務器集群架構
比如,將ip為192.168.1.10的機器作為主服務器,將ip為192.168.1.11的機器作為從服務器設置主服務器的配置
bind 192.168.1.10 設置從服務器的配置
注意:在slaveof后面寫主機ip,再寫端口,而且端口必須寫
通過redis.**.conf配置完成主從雙備
bind配置主數據庫服務器
slaveof配置從數據庫服務器
bind 192.168.1.11 slaveof 192.168.1.10 6379 在master和slave分別執行info命令,查看輸出信息
在master上寫數據
set hello world 在slave上讀數據
get hello