# 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测试带宽和延时