# redis-數據類型和發布訂閱
[TOC]
## 一、 redis數據類型
1. redis支持5種數據類型
```sh
String 字符串
Hash 哈希
List 列表
Set 集合
Sorted set 有序集合
```
2. 基礎命令
```sh
set 設置key
get 獲取key的值
exists 判斷key是否存在
keys 顯示所有的key
del 刪除指定的key
type 獲取key的類型
```
更多詳細命令見官方中文站點。redis.cn和redisdoc.com
## 二、 數據類型命令和操作
### 1. 字符串類型
1) 操作命令
```sh
set 設置key
get 獲取key的值
mset 同時設置多個key
mget 同時獲取抖個key
del 刪除指定的key
append 追加內容到value
strlen 獲取字符串key的長度
incr 自增key值
inryby 指定步長的自增key
decr 自減key值
decrby 指定步長的自減key
incrbyfloat 浮點類型的自增
```
2) 簡單舉例:
```sh
10.0.0.41:6379> append luokey 123
(integer) 10 #追加值到key中
10.0.0.41:6379> get luokey
"luogang123"
10.0.0.41:6379> incr abc
(integer) 1 #自增
10.0.0.41:6379> incr abc
(integer) 2
10.0.0.41:6379> incrby abc 3
(integer) 7 #步長為3的自增
10.0.0.41:6379> decr abc
(integer) 6 #自減
10.0.0.41:6379> decrby abc 2
(integer) 4 #補償為2的自減
10.0.0.41:6379> mset key1 a key2 b key3 c
OK #設置多個key
root@xxx ~]# 10.0.0.41:6379> mget key1 key2 key3
1) "a" #同時獲取多個key
2) "b"
3) "c"
```
3) 應用場景
常規計數:微博數,粉絲數等。
### 2. 哈希類型命令(字典類型)
此類型的鍵最多232-1個,此類key中,可以存放多個數據,例如一本書的屬性,顏色、價格、大小,可以存儲在同一個哈希類型的key中,而不用分別存儲在三個字符串類型的key中
1) 命令
```sh
hset 設置哈希key的一個字段的值
hget 獲取哈希key的一個字段的值
hmset 設置一個哈希key的多個字段的值
hmget 獲取一個哈希key的多個字段的值
hgetall 獲取一個哈希key的所有字段的值
hdel 刪除一個哈希key的一個字段
del 刪除一個哈希key
```
2) 簡單舉例:
```sh
11.10.0.0.41:6379> hset car name bmw
(integer) 1 #設置key car的name字段的值
10.0.0.41:6379> hset car price 500
(integer) 1 #設置key car的PRICE字段的值
10.0.0.41:6379> hmget car name price
1) "bmw" #查看哈希key car的多個字段的值
2) "500"
10.0.0.41:6379> hmset book name sguo price 100 color red
OK #設置哈希key name的多個字段
10.0.0.41:6379> hdel book name
(integer) 1 #刪除某個字段
10.0.0.41:6379> hgetall book
1) "price" #查看該key所有字段的值
2) "100"
3) "color"
4) "red"
3) 應用場景
```
存儲部分變更的數據,如用戶信息等。
3. 列表類型
用來存取一個有序的字符串的列表,可以分別從列表的兩側插入數據,也可以分別從列表兩側讀取(彈出)數據。0表示第一個元素,-1表示最后一個元素,-2表示倒數第二個元素
1) 命令
```sh
lpush 從列表左側插入數據,可一次性插入多個元素
lpop 從列表左側彈出數據
rpush 從列表右側插入數據,可一次性插入多個元素
rpop 從列表右側彈出數據
lrange 讀取列表指定范圍的數據
lrem 從存于 key 的列表里移除前 count 次出現的值為 value 的元素
count > 0: 從頭往尾移除值為 value 的元素。
count < 0: 從尾往頭移除值為 value 的元素。
count = 0: 移除所有值為 value 的元素。
```
2) 簡單舉例:
```sh
11.10.0.0.41:6379> lpush mylist k1 k2
(integer) 2 #從左側插入兩個數據
10.0.0.41:6379> rpush mylist k3 k4
(integer) 4 #從右側插入兩個數據
10.0.0.41:6379> lrange mylist 0 -1
1) "k2" #查看所有數據
2) "k1"
3) "k3"
4) "k4"
10.0.0.41:6379> lpop mylist
"k2" 從左側彈出數據
10.0.0.41:6379> lpop mylist
"k1"
10.0.0.41:6379> lpop mylist
"k3"
10.0.0.41:6379> lpop mylist
"k4"
10.0.0.41:6379> lpop mylist
(nil) #數據彈出完后,列表就為空
lrem mylist 0 k1
(integer) 1 #移除列表中所有值為k1的元素
```
3) 應用場景
消息隊列系統,比如sina微博, 微信朋友圈
### 4. 無序集合和有序集合
集合的概念就是定義一組數據,可以對這種類型的數據取交集、并集、差集等,合計分為無序合計和有序合計,差別是有序合集中的每個子,都有一個分數,可以根據分數排序或導出,無序集合命令已s開頭,有序集合命令以z開頭。
1) 命令
```sh
sadd 添加一個多多個元素到集合里
scard 獲取集合里面的元素數量
sinter 獲取兩個集合的交集
sdiff 獲取兩個集合的差集
sdiffstore 獲取兩個集合的差集并寫入新的集合中
smembers 獲取集合里面的所有key
```
2) 舉例
```sh
127.0.0.1:6379> sadd lxl pg1 pg2 baoqiang masu marong
(integer) 5
127.0.0.1:6379> sadd jnl baoqiang yufan baobeier zhouxingchi
(integer) 4
127.0.0.1:6379> SUNION lxl jnl
1) "zhouxingchi"
2) "baobeier"
3) "pg2"
4) "yufan"
5) "masu"
6) "baoqiang"
7) "pg1"
8) "marong"
127.0.0.1:6379> SINTER lxl jnl
1) "baoqiang"
127.0.0.1:6379> SDIFF lxl jnl
1) "masu"
2) "pg1"
3) "marong"
4) "pg2"
127.0.0.1:6379> SDIFF jnl lxl
1) "yufan"
2) "zhouxingchi"
3) "baobeier"
```
3) 應用場景
微博中一個多個用戶的共同好友等,排行榜中取top n等
## 三、 發布訂閱
redis也支持消息中間模式,即發布-訂閱模式-MQ,redis的發布訂閱功能較簡單,這里做簡單介紹,實際工作中,用的更多的mq是rabbitmq,kafka等其他消息中間件
使用消息中間件的好處是,發布者只管發布信息到指定通道,接受者只管從通道接受信息,不用管中間過程, 松耦合且易于擴展。
### 1. 命令說明
```sh
PUBLISH channel msg
# 將信息 message 發送到指定的頻道 channel
SUBSCRIBE channel [channel ...]
# 訂閱頻道,可以同時訂閱多個頻道
UNSUBSCRIBE [channel ...]
# 取消訂閱指定的頻道, 如果不指定頻道,則會取消訂閱所有頻道
PSUBSCRIBE pattern [pattern ...]
# 訂閱一個或多個符合給定模式的頻道,每個模式以 * 作為匹配符,比如 it* 匹配所 有以 it 開頭的頻道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有 以 news. 開頭的頻道( news.it 、 news.global.today 等等),諸如此類
PUNSUBSCRIBE [pattern [pattern ...]]
# 退訂指定的規則, 如果沒有參數則會退訂所有規則
PUBSUB subcommand [argument [argument ...]]
# 查看訂閱與發布系統狀態
```
注意:使用發布訂閱模式實現的消息隊列,當有客戶端訂閱channel后只能收到后續發布到該頻道的消息,之前發送的不會緩存,必須Provider和Consumer同時在線。
### 2. 發布訂閱例子
同時打開兩個redis窗口,然后一個從庫發布頻道,另一個窗口訂閱頻道
1) 訂閱單個頻道
```sh
# 窗口1:
127.0.0.1:6379> SUBSCRIBE baodi
# 窗口2:
127.0.0.1:6379> PUBLISH baodi "jin tian zhen kaixin!"
```
訂閱成功后,第一個窗口輸入的消息,會在第二個窗口顯示
2) 訂閱多頻道:
```sh
# 窗口1:
127.0.0.1:6379> PSUBSCRIBE wang*
# 窗口2:
127.0.0.1:6379> PUBLISH wangbaoqiang "jintian zhennanshou "
```
- shell編程
- 變量1-規范-環境變量-普通變量
- 變量2-位置-狀態-特殊變量
- 變量3-變量子串
- 變量4-變量賦值三種方法
- 變量5-數組相關
- 計算1-數值計算命令和案例
- 計算2-expr命令舉例
- 計算3-條件表達式和各種操作符
- 計算4-條件表達式和操作符案例
- 循環1-函數的概念與作用
- 循環2-if與case語法
- 循環3-while語法
- 循環4-for循環
- 其他1-判斷傳入的參數為0或整數的多種思路
- 其他2-while+read按行讀取文件
- 其他3-給輸出內容加顏色
- 其他4-shell腳本后臺運行知識
- 其他5-6種產生隨機數的方法
- 其他6-break,continue,exit,return區別
- if語法案例
- case語法案例
- 函數語法案例
- WEB服務軟件
- nginx相關
- 01-簡介與對比
- 02-日志說明
- 03-配置文件和虛擬主機
- 04-location模塊和訪問控制
- 05-status狀態模塊
- 06-rewrite重寫模塊
- 07-負載均衡和反向代理
- 08-反向代理監控虛擬IP地址
- nginx與https自簽發證書
- php-nginx-mysql聯動
- Nginx編譯安裝[1.12.2]
- 案例
- 不同客戶端顯示不同信息
- 上傳和訪問資源池分離
- 配置文件
- nginx轉發解決跨域問題
- 反向代理典型配置
- php相關
- C6編譯安裝php.5.5.32
- C7編譯php5
- C6/7yum安裝PHP指定版本
- tomcxat相關
- 01-jkd與tomcat部署
- 02-目錄-日志-配置文件介紹
- 03-tomcat配置文件詳解
- 04-tomcat多實例和集群
- 05-tomcat監控和調優
- 06-Tomcat安全管理規范
- show-busy-java-threads腳本
- LVS與keepalived
- keepalived
- keepalived介紹和部署
- keepalived腦裂控制
- keepalived與nginx聯動-監控
- keepalived與nginx聯動-雙主
- LVS負載均衡
- 01-LVS相關概念
- 02-LVS部署實踐-ipvsadm
- 03-LVS+keepalived部署實踐
- 04-LVS的一些問題和思路
- mysql數據庫
- 配置和腳本
- 5.6基礎my.cnf
- 5.7基礎my.cnf
- 多種安裝方式
- 詳細用法和命令
- 高可用和讀寫分離
- 優化和壓測
- docker與k8s
- docker容器技術
- 1-容器和docker基礎知識
- 2-docker軟件部署
- 3-docker基礎操作命令
- 4-數據的持久化和共享互連
- 5-docker鏡像構建
- 6-docker鏡像倉庫和標簽tag
- 7-docker容器的網絡通信
- 9-企業級私有倉庫harbor
- docker單機編排技術
- 1-docker-compose快速入門
- 2-compose命令和yaml模板
- 3-docker-compose命令
- 4-compose/stack/swarm集群
- 5-命令補全和資源限制
- k8s容器編排工具
- mvn的dockerfile打包插件
- openstack與KVM
- kvm虛擬化
- 1-KVM基礎與快速部署
- 2-KVM日常管理命令
- 3-磁盤格式-快照和克隆
- 4-橋接網絡-熱添加與熱遷移
- openstack云平臺
- 1-openstack基礎知識
- 2-搭建環境準備
- 3-keystone認證服務部署
- 4-glance鏡像服務部署
- 5-nova計算服務部署
- 6-neutron網絡服務部署
- 7-horizon儀表盤服務部署
- 8-啟動openstack實例
- 9-添加計算節點流程
- 10-遷移glance鏡像服務
- 11-cinder塊存儲服務部署
- 12-cinder服務支持NFS存儲
- 13-新增一個網絡類型
- 14-云主機冷遷移前提設置
- 15-VXALN網絡類型配置
- 未分類雜項
- 部署環境準備
- 監控
- https證書
- python3.6編譯安裝
- 編譯安裝curl[7.59.0]
- 修改Redhat7默認yum源為阿里云
- 升級glibc至2.17
- rabbitmq安裝和啟動
- rabbitmq多實例部署[命令方式]
- mysql5.6基礎my.cnf
- centos6[upstart]/7[systemd]創建守護進程
- Java啟動參數詳解
- 權限控制方案
- app發包倉庫
- 版本發布流程
- elk日志系統
- rsyslog日志統一收集系統
- ELK系統介紹及YUM源
- 快速安裝部署ELK
- Filebeat模塊講解
- logstash的in/output模塊
- logstash的filter模塊
- Elasticsearch相關操作
- ES6.X集群及head插件
- elk收集nginx日志(json格式)
- kibana說明-漢化-安全
- ES安裝IK分詞器
- zabbix監控
- zabbix自動注冊模板實現監控項自動注冊
- hadoop大數據集群
- hadoop部署
- https證書
- certbot網站
- jenkins與CI/CD
- 01-Jenkins部署和初始化
- 02-Jenkins三種插件安裝方式
- 03-Jenkins目錄說明和備份
- 04-git與gitlab項目準備
- 05-構建自由風格項目和相關知識
- 06-構建html靜態網頁項目
- 07-gitlab自動觸發項目構建
- 08-pipelinel流水線構建項目
- 09-用maven構建java項目
- iptables
- 01-知識概念
- 02-常規命令實戰
- 03-企業應用模板
- 04-企業應用模板[1鍵腳本]
- 05-企業案例-共享上網和端口映射
- SSH與VPN
- 常用VPN
- VPN概念和常用軟件
- VPN之PPTP部署[6.x][7.x]
- 使用docker部署softether vpn
- softEther-vpn靜態路由表推送
- SSH服務
- SSH介紹和部署
- SSH批量分發腳本
- 開啟sftp日志并限制sftp訪問目錄
- sftp賬號權限分離-開發平臺
- ssh配置文件最佳實踐
- git-github-gitlab
- git安裝部署
- git詳細用法
- github使用說明
- gitlab部署和使用
- 緩存數據庫
- zookeeper草稿
- mongodb數據庫系列
- mongodb基本使用
- mongodb常用命令
- MongoDB配置文件詳解
- mongodb用戶認證管理
- mongodb備份與恢復
- mongodb復制集群
- mongodb分片集群
- docker部署mongodb
- memcached
- memcached基本概念
- memcached部署[6.x][7.x]
- memcached參數和命令
- memcached狀態和監控
- 會話共享和集群-優化-持久化
- memcached客戶端-web端
- PHP測試代碼
- redis
- 1安裝和使用
- 2持久化-事務-鎖
- 3數據類型和發布訂閱
- 4主從復制和高可用
- 5redis集群
- 6工具-安全-pythonl連接
- redis配置文件詳解
- 磁盤管理和存儲
- Glusterfs分布式存儲
- GlusterFS 4.1 版本選擇和部署
- Glusterfs常用命令整理
- GlusterFS 4.1 深入使用
- NFS文件存儲
- NFS操作和部署
- NFS文件系統-掛載和優化
- sersync與inotify
- rsync同步服務
- rsyncd.conf
- rsync操作和部署文檔
- rsync常見錯誤處理
- inotify+sersync同步服務
- inotify安裝部署
- inotify最佳腳本
- sersync安裝部署
- 時間服務ntp和chrony
- 時間服務器部署
- 修改utc時間為cst時間
- 批量操作與自動化
- cobbler與kickstart
- KS+COBBLER文件
- cobbler部署[7.x]
- kickstart部署[7.x]
- kickstar-KS文件和語法解析
- kickstart-PXE配置文件解析
- 自動化之ansible
- ansible部署和實踐
- ansible劇本編寫規范
- 配置文件示例
- 內網DNS服務
- 壓力測試
- 壓測工具-qpefr測試帶寬和延時