Redis


简介

简介

Redis 是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库

特点

  • 优秀的性能,数据是存储在内存中,读写速度非常快,可支持并发10W QPS

  • 单线程但进程,是线程安全的,采用IO 多路复用制

  • 可作为分布式锁

  • 支持五种数据类型

  • 支持数据持久化到磁盘

  • 可以作为消息中间件使用,支持消息发布及订阅


一、安装

Windows

Linux

  • 下载:https://redis.io/ 选择对应版本进行下载
  • 安装:
    • 下载完成后进行解压并进入目录
      • tar -zxvf 需要解压的包名
    • 安装基本环境gcc
      • 安装命令:yum install gcc-c++
      • 查看当前gcc的版本: gcc -v
      • PS:注意gcc版本
    • 解压的redis目录下安装
      • 执行命令1:make
      • 执行命令2:make install
    • 进入Redis安装目录
      • 目录: /usr/local/bin (默认路径)
    • 拷贝配置文件(使用拷贝的配置运行)
      • 创建配置文件目录(在 /usr/local/bin 路径下) :mkdir myconfig
      • 拷贝:cp /usr/local/bin/redis.conf myconfig/
    • 将redis修改为后台运行(在拷贝的配置文件中修改)
      • 打开配置文件: vim redis.conf
      • 修改 daemonize nodaemonize yes
      • 执行保存命令:点击键盘esc、执行wq!
    • 启动
      • 使用指定的配置文件运行:redis-server myconfig/redis.conf
    • 连接测试
      • redis-cli -p 6379

Docker

  • 下载:
    • 搜索redis镜像:docker search redis
    • 选择适合的镜像进行下载:docker pull <镜像名称>:<版本号>
  • 挂载配置文件(在执行启动时进行配置挂载)
    • 挂载redis的配置文件
      • 创建文件路径:mkdir -p /home/myredis/
      • 将 配置文件redis.conf 移动到该目录下
      • redis.conf的标准文件在redis官网可以找到
    • 挂载redis 的持久化文件(为了数据的持久化)。
      • 创建文件路径:mkdir -p /home/myredis/data
  • 安装/启动:
    • 启动命令 docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis -v /home/myredis/myredis.conf:/etc/redis/redis.conf -v /home/myredis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass 000415
      • –restart=always 总是开机启动
      • –log是日志方面的
      • -p 6379:6379 将6379端口挂载出去
      • –name 给这个容器取一个名字
      • -v 数据卷挂载
        • /home/myredis/myredis.conf:/etc/redis/redis.conf 这里是将 liunx 路径下的myredis.conf 和redis下的redis.conf 挂载在一起。
        • /home/myredis/data:/data 同上
      • -d redis 表示后台启动redis
      • redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录 /etc/redis/redis.conf 也就是liunx下的/home/myredis/myredis.conf
      • –appendonly yes 开启redis 持久化
      • –requirepass 000415 设置密码
  • 查看运行状态/日志:
    • 运行状态:docker ps -a |grep <容器名>
    • 日志:docker logs --since 30m <容器名>
      • 查看此容器30分钟之内的日志情况
  • 进入容器并连接客户端:docker exec -it <容器名> <bash命令>

二、Redis操作手册

数据类型

命令大全

  • Redis命令十分丰富,包括的命令组有ClusterConnectionGeoHashesHyperLogLogKeysListsPub/SubScriptingServerSetsSorted SetsStringsTransactions一共14个redis命令组两百多个redis命令,Redis中文命令大全
  • 查看网址:http://www.redis.cn/commands.html

三、三大特殊数据类型

Geospatial(地理位置)

简介

  • 城市经纬度查询: 经纬度查询
  • 两极无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
  • 有效的经度从**-180度到180度**。
  • 有效的纬度从**-85.05112878度到85.05112878度**。
  • m 为米、km 为千米、mi 为英里、ft 为英尺。
  • geo本质上还是个集合,Redis官方对其进行了二次封装

操作

zset指令
  • 注意:geo的查看方式和zset的命令是一致的
ZRANGE(按次序返回指定区间的元素)
  • 语法:ZRANGE key 开始下标 结束下标
    • 结束下标为-1 则代表按次序返回开始下标及之后的所有元素
  • 示例:
# 查询 city 的第一个元素 也就是0号下标元素
127.0.0.1:6379> ZRANGE city 0 0
1) "hefei"
# 查询 city 的 0 到 1之间的元素(含头含尾)
127.0.0.1:6379> ZRANGE city 0 1
1) "hefei"
2) "nanjing"
# 查询 city 的所有元素
127.0.0.1:6379> ZRANGE city 0 -1
1) "hefei"
2) "nanjing"
zrem(删除元素)
  • 语法:zrem key name
  • 示例:
#删除 city 的 lasa
127.0.0.1:6379> ZREM city lasa
# 成功后返回成功个数
(integer) 1
geo指令
geoadd(添加)
  • 语法:geoadd key 经度 纬度 name
  • 示例:geoadd city 118.8921 31.32751 nanjing 117.30794 31.79322 hefei
    • 可多个添加 经度1 纬度1 name1 经度2 纬度2 name2
    • 成功后返回添加成功的数量:(integer) 2
  • 错误示例:geoadd test 500.8921 31.32751 nanjin
    • 经纬度其中一个或者两个超过界限值,报错,信息如下:
      无效的经度,纬度(error) ERR invalid longitude,latitude .......
geopos(查看)
  • 语法:geopos key name
  • 示例:
# 执行命令 单个查询
127.0.0.1:6379> GEOPOS city nanjing
# 返回结果:
1) 1) "118.89209836721420288"
   2) "31.32750976275760735"

# 执行命令 多个查询(按name顺序返回经纬度)
127.0.0.1:6379> GEOPOS city hefei nanjing
1) 1) "117.30793744325637817"
   2) "31.79321915080526395"
2) 1) "118.89209836721420288"
   2) "31.32750976275760735"
geodist(计算距离)
  • 语法:geodist key name1 nam2 [m/km/mi/ft]
  • 默认单位是米(m)
    • 如需要其他单位 则在末尾处添加·单位·
    • m 为米、km 为千米、mi 为英里、ft 为英尺
  • 示例:
# 执行命令 计算 南京和合肥的距离
127.0.0.1:6379> geodist city hefei nanjing
"158820.7744"
127.0.0.1:6379> geodist city hefei nanjing km #千米
"158.8208"
127.0.0.1:6379> geodist city hefei nanjing mi #英里
"98.6869"
127.0.0.1:6379> geodist city hefei nanjing ft #英尺
"521065.5328"
geohash (返回经纬度的hash值)
  • 语法:geohash key name
    • name 可为多个
  • 示例:
# 返回 nanjing hefei 的hash值
127.0.0.1:6379> geohash city nanjing hefei
1) "wtsd1qyxfx0"
2) "wtekv7v0cj0"
georadius(查询指定位置附近)
  • 语法:georadius key 经度 纬度 距离 单位 withcoord withdist withhash count 查询条数
    • 语句中 withcoord 及之后的参数为可选
    • 显示经纬度:withcoord
    • 显示距离:withdist
    • 经纬度hash值:withhash
      • 两个城市的hash值越相近似,代表两个城市的距离越相近
    • 查询个数:count 数量
  • 示例:
# 执行命令 查询经度120 纬度38 1000km范围内的两个城市信息,并显示距离,`经纬度`的hash值
127.0.0.1:6379> georadius city 120 38 1000 km withcoord withdist withhash count 2
1) 1) "hefei" #城市名称
   2) "732.6371" #距离
   3) (integer) 4052763834193093 #`经纬度`hash值
   4) 1) "117.30793744325637817" #经度
      2) "31.79321915080526395" #纬度
2) 1) "nanjing"
   2) "749.0265"
   3) (integer) 4054278565840695
   4) 1) "118.89209836721420288"
      2) "31.32750976275760735"
127.0.0.1:6379> georadius city 120 38 1000 km withcoord withdist withhash count 1
1) 1) "hefei"
   2) "732.6371"
   3) (integer) 4052763834193093
   4) 1) "117.30793744325637817"
      2) "31.79321915080526395"
georadiusbymember (查找指定元素指定范围内的元素)
  • 语法:georadiusbymember key name 距离 单位
  • 示例:
# 查询  nanjing 附件 500公里内的城市
127.0.0.1:6379> GEORADIUSBYMEMBER city nanjing 500 km
1) "hefei"
2) "nanjing"

Hyperloglog(基数)

简介

  • 基数在数学层面上可以说是:两个数据集中不重复的元素~
  • 在Redis中,可能会有一定的误差性。 官方给出的误差率是0.81%。
  • Hyperloglog的优点: 占用的内存是固定的,2^64个元素,相当于只需要12kb的内存即可。效率极高!

操作

pfadd(添加数据集)
  • 语法:pfadd key 元素1 元素2 元素3 ··· 元素N
  • 示例:
#执行命令
127.0.0.1:6379> pfadd dataList 1 2 3 4 5 6 7
#返回结果
(integer) 1
pfcount(统计数据集)
  • 语法:pfcount key1 key2
    • 统计单个或多个数据集不重复元素的数量
  • 示例:
#dataList: 1 2 3 4 5 6 7
#dataList2: 1 2 3 4 5 6 8

#统计单个
127.0.0.1:6379> pfcount dataList
(integer) 7
#统计多个
127.0.0.1:6379> pfcount dataList dataList2
(integer) 8
pfmegre(合并数据集-自动去重)
  • 语法:pfmegre newkey key1 key2 key3 ··· keyN
  • 示例:
#dataList: 1 2 3 4 5 6 7
#dataList2: 1 2 3 4 5 6 8

#将 dataList dataList2合并为 newdata
127.0.0.1:6379> PFMERGE newdata dataList dataList2
OK
#统计
127.0.0.1:6379> PFCOUNT newdata
(integer) 8

Bitmap 位图

简介

  • 数据结构!
  • 都是操作二进制位来进行记录
  • 只有0 和 1 两个状态!

操作

setbit(添加)
  • 语法:setbit key offset value
  • 示例:
#添加登录记录
127.0.0.1:6379> setbit login 1 1 #记录周一已登录
(integer) 0
127.0.0.1:6379> setbit login 2 0 #记录周二未登录
(integer) 0
127.0.0.1:6379> setbit login 3 1 #记录周一已登录
(integer) 0
getset(获取)
  • 语法:getbit key offset
  • 示例:
#获取登录记录
127.0.0.1:6379> getbit login 1 #获取周一登录记录
(integer) 1
127.0.0.1:6379> getbit login 2 #获取周二登录记录
(integer) 0
bitcount(统计)操作
  • 语法:bitcount key 开始下标 结束下标
    • 下标可选
  • 示例:
#1 1、2 1、3 1、4 1、5 0、6 0、7 1

#获取本周的总登录天数
127.0.0.1:6379> bitcount login
#只统计 值为1 的数量
(integer) 5

#获取本周前五天的登录天数
127.0.0.1:6379> bitcount login 0 5 
(integer) 4

四、Redis事务

  • 原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
  • 一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  • 隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
  • 在Redis事务没有没有隔离级别的概念!
  • 在Redis单条命令式保证原子性的,但是事务不保证原子性!

正常执行事务

#开启事务
127.0.0.1:6379> multi  
OK
#添加数据
127.0.0.1:6379> set name jack 
QUEUED
127.0.0.1:6379> set age 26 
QUEUED
127.0.0.1:6379> set high 172
QUEUED
#执行事务
127.0.0.1:6379> exec  
1) OK
2) OK
3) OK

#获取数据并成功,证明事务执行成功
127.0.0.1:6379> get name  
"jack"
127.0.0.1:6379> get age
"26"

放弃事务

#开启事务
127.0.0.1:6379> multi  
OK
#添加数据
127.0.0.1:6379> set name jack 
QUEUED
127.0.0.1:6379> set age 26  
QUEUED

#放弃事务
127.0.0.1:6379> discard  
OK

#获取数据失败:放弃事务后不会执行事务里面的添加操作
127.0.0.1:6379> get name  
(nil)

异常、代码问题、命令问题导致放弃事务

#开启事务
127.0.0.1:6379> multi
OK
#添加数据
127.0.0.1:6379> set name jack
QUEUED
127.0.0.1:6379> set age 23
QUEUED
#输入一个错误的命令,这时候已经报错了,但是这个还是进入了事务的队列当中
127.0.0.1:6379> getset name  
(error) ERR wrong number of arguments for 'getset' command

#执行事务,报错,并且所有的命令都不会执行
127.0.0.1:6379> exec 
(error) EXECABORT Transaction discarded because of previous errors.
#获取数据为空,证明事务未执行
127.0.0.1:6379> get name  
(nil)

运行时异常

  • 除了语法错误的行不会被执且抛出异常后,其他的正确命令可以正常执行
#开启事务
127.0.0.1:6379> multi  
OK

#添加字符串数据
127.0.0.1:6379> set name jack
QUEUED
#对字符串进行自增操作,此操作会产生运行时异常
127.0.0.1:6379> incr name  
QUEUED
127.0.0.1:6379> set age 23 
QUEUED

#执行事务。对字符串进行自增操作报错,其他的命令正常执行
127.0.0.1:6379> exec  
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
127.0.0.1:6379> get age  #获取数据成功
"23"

五、Redis乐观锁

  • 当程序中可能出现并发的情况时,就需要保证在并发情况下数据的准确性,以此确保当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的。
  • 没有做好并发控制,就可能导致脏读、幻读和不可重复读等问题。
  • Redis可以实现乐观锁!
  • 语法:watch key
#线程1

#添加金钱100
127.0.0.1:6379> set money 100  
OK
#添加花费0
127.0.0.1:6379> set cost 0  
OK
#开启监视 money (乐观锁)
127.0.0.1:6379> watch money  
OK 
127.0.0.1:6379> multi  #开启事务
OK
#金钱-20
127.0.0.1:6379> DECRBY money 20  
QUEUED
#花费+20
127.0.0.1:6379> INCRBY cost 20   
QUEUED
#先不要执行,在另一线程修改被监视的值
#修改后再执行此处报错,因为我们监视了money这个值,在执行事务之前监视器会判断这个值是否正常,如果发生改变,事务执行失败
127.0.0.1:6379> exec  
(nil)

#另一线程进行的操作生效
127.0.0.1:6379> get money
"120"

#线程2 读 写操作对线程1的事务影响不同
# 只有·修改被监视的值·才会导致事务执行失败

#写操作
#在线程1事务执行前操作执行
#金钱+20
127.0.0.1:6379> INCRBY money 20  
(integer) 120

#读操作
#在线程1事务执行前操作执行
#金钱+20
127.0.0.1:6379> get money
(integer) 120

六、SpringBoot整合Redis

  • SpringBoot的底层还是使用Jedis来连接Redis的,但是在2.×版本后,就换成了Lettuce
  • Jedis: 采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用 jedis pool 连接池! 更像 BIO 模式!
  • Lettuce: 采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据了,更像 NIO 模式!

整合

POM依赖引入

        <!--集成redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.1.7.RELEASE</version>
        </dependency>
  • 以下依赖可根据情况导入
 <!--序列化-->
 		<!--fastjson,json 序列化-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.54</version>
            <scope>compile</scope>
        </dependency>

配置YML文件

spring:
  redis:
    host: 127.0.0.1
    port: 6379

注入

  • 常用的方法都可以直接通过redisTemplate操作,比如事务,基本的 CRUD
  • 对象的保存需要序列化才可以操作
 @Autowired(required = false)
 private RedisTemplate redisTemplate;

自定义redisTemplate(配置类)

@Configuration
public class RedisConfig {
    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        // 一般直接使用 <String, Object>
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        // Json序列化配置
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // String 的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

七、Redis持久化

1.Redis持久化之RDB和AOF

RDB(Redis DataBase)

  • 将整个Reids的数据(通过二进制格式),持久化到磁盘里
  • 注意 —— RDB是Redis默认的持久化机制
以下几种情况会进行DB操作
  • 添加
  • 修改
  • 删除
  • 关闭Redis(客户端或服务端都可)
  • 手动执行 flushall 命令
添加配置
  • 1、在redis目录下找到配置文件 redis.conf 并打开
  • 2、找到下面的位置,如果不存在则直接编写save属性即可
  • 以下内容可直接复制
#
#   持久化数据到磁盘之 —— 频率,格式如下:
#   save 900 1  900秒内至少有1个key被改变(那就会在900秒的时候执行rdb同步)
#   save 300 10  300秒内至少有300个key被改变(那就会在900秒的时候执行rdb同步)
#   save 60 10000  60秒内至少有10000个key被改变 (那就会在60秒的时候执行rdb同步)
#   save "" 如果要禁用RDB模式就把下面这三行注释掉,并打开 save "" 的注释
save 900 1
save 300 10
save 60 10000
 
# 存储至本地数据库时(持久化到rdb文件)是否对这个二进制文件进行压缩数据,默认为yes
rdbcompression yes
 
 
# RDB后,本地持久化数据库文件名,默认值为dump.rdb(持久化的数据都会保存在这个文件里然后准备刷盘,可自定义文件名,特别是配置集群的话要改成对应机器的名字,另一个也是好区分)
dbfilename dump.rdb
 
# 工作目录
#
# 数据库镜像备份的文件放置的路径。
# 这里的路径跟文件名要分开配置是因为redis在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成时,
# 再把该该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中。
#
# AOF文件也会存放在这个目录下面
#
# 注意这里必须制定一个目录而不是文件
dir ./
通过rdb文件恢复Redis
  • 将备份的rdb文件放在redis启动目录即可
  • Redis启动的时候会自动检查dump.rdb文件并恢复其中的数据!
  • 查找redis启动目录命令:config get dir
127.0.0.1:6379> config get dir
1) "dir"
2) "D:\\redis-windows-master" #此处为redis启动目录,rdb文件存放此处即可被识别
优点

1、适合大规模的数据恢复!
2、对数据的完整性要求不高!

缺点

1、需要一定的时间间隔进程操作!如果redis意外宕机了,这个最后一次修改数据就没有的了!
2、fork进程的时候,会占用一定的内容空间!

AOF(Append Only File)

  • (通过原操作语句)追加的方式,增量追加到一个日志文件里。
  • 根据配置执行原操作语句追加(每次写入都进行追加/每秒追加一次/永不追加)
  • 如果追加满了(默认64M)则会启动rewrite机制,老的日志会写入磁盘,与此同时新开一个临时日志写新来的语句,等老的写完磁盘后,重新开始到老的写。
添加配置
# AOF开关 —— 设置为yes则开启,如果AOF开启则优先使用AOF 
appendonly no
 
# AOF文件名称 (默认: "appendonly.aof")
# appendfilename appendonly.aof
 
 
# Redis支持三种同步AOF文件的策略:
#
# no: 不进行同步,系统去操作 . Faster.
# always: always表示每次有写操作都进行同步. Slow, Safest.
# everysec: 表示对写操作进行累积,每秒同步一次. Compromise.
#
# 默认是"everysec",按照速度和安全折中这是最好的。
# 如果想让Redis能更高效的运行,你也可以设置为"no",让操作系统决定什么时候去执行
# 或者相反想让数据更安全你也可以设置为"always"
#
# 如果不确定就用 "everysec".
 
# appendfsync always
appendfsync everysec
# appendfsync no
 
# AOF策略设置为always或者everysec时,后台处理进程(后台保存或者AOF日志重写)会执行大量的I/O操作
# 在某些Linux配置中会阻止过长的fsync()请求。注意现在没有任何修复,即使fsync在另外一个线程进行处理
#
# 为了减缓这个问题,可以设置下面这个参数no-appendfsync-on-rewrite
no-appendfsync-on-rewrite no
 
# Automatic rewrite of the append only file.
# AOF 自动重写机制
# 这个机制类似于RDB的二进制压缩机制,是用来缩小文件大小的 —— 比如对相同key的多次操作则只会保存最后一次操作,对多次操作,可以用一条语句完成的则改成一条语句....  具体是会新建一个临时AOF文件,然后读取Redis中的数据(不是老的AOF哦),然后进行重写,写完后替换老的AOF文件
#关于主从部分,AOF机制是这样的,如果从在重写,主进来了新的追加,那么主会写自己AOF的同时,再写一份相同的在缓存区,子重写完后会通知主,那这个时候主会把缓存区的再追加到子AOF文件中

#【重写的触发条件】
#1.无rdb、aof的持久化操作
#2.无BGREWRITEAOF进行(手动进行aof重写操作)
#3.AOF文件大小超过阈值,默认1M
#4.AOF文件增长率超过阈值,默认100%
# 设置 percentage 为0就关闭这个特性
 
 
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

优点
  • 更高的安全性,如果数据被篡改了,还可以根据redis-check-aof工具来帮助数据恢复(这个也是参数设置是否开启的)。
  • 数据更完整
  • 因为是追加语句的形式,所以相对来说宕机风险小
  • 另外如果配置的是每次写入都进行追加使得持久化数据完整
缺点
  • 因为保存的是原始操作语句,在大数据恢复场景下全部要重新执行一遍,所以相对很慢
  • 根据同步策略的不同,开启AOF后的运行效率也会相对慢于RDB(当然尽管这样每秒同步策略还是比较高效的)

Redis实现发布订阅功能

Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接受消息。
Redis客户端可以订阅任意数量的频道!
在这里插入图片描述

实现方式

PSUBSCRIBE命令:

  • 官方文档地址:PSUBSCRIBE
  • 这些命令被广泛用于构建即时通信应用,比如网络聊天室(chatroom)和实时广播、实时提醒等。
  • 示例:
    • 发送端:
      127.0.0.1:6379> ping
      PONG
      127.0.0.1:6379> PUBLISH dingdada "hello world!"  #发送消息到dingdada 频道
      (integer) 1
      127.0.0.1:6379> PUBLISH dingdada "my name is dyj"  #发送消息到dingdada 频道
      (integer) 1
      
    • 订阅端:
      127.0.0.1:6379> ping
      PONG
      127.0.0.1:6379> SUBSCRIBE dingdada  #订阅名字为 dingdada 的频道
      Reading messages... (press Ctrl-C to quit)
      1) "subscribe"
      2) "dingdada"
      3) (integer) 1
      #等待推送的信息
      1) "message"  #消息
      2) "dingdada"  #来自哪个频道的消息
      3) "hello world\xef\xbc\x81"  # 消息的具体内容
      1) "message"
      2) "dingdada"
      3) "my name is dyj\x81"
      

Redis配置文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我好帅啊~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值