subscribe error不执行_你不知道的redis:第三方jar无封装命令我们该怎么执行?
redis的基本操作指令就不多说了,今天对redis的进阶操作给大家介绍一下,以及对于jedis和redisTemplate等工具包没有封装的命令我们该如何使用?相信大家读了本篇对redis的整体会有更深的认知。
一、Pipelin模式介绍
1、redis的通常使用方式
大多数情况下,我们都会通过请求-相应机制去操作redis。使用这种模式的步骤为
整个交互流程如下
2、Pipeline模式
然而使用Pipeline 模式,客户端可以一次性的发送多个命令,无需等待服务端返回。这样就大大的减少了网络往返时间,提高了系统性能。
pipeline是多条命令的组合,使用PIPELINE 可以解决网络开销的问题,原理也非常简单,流程如下, 将多个指令打包后,一次性提交到Redis, 网络通信只有一次
3、性能对比
可以看到,redis的延迟主要出现在网络请求的IO次数上,因此我们在使用redis的时候,尽量减少网络IO次数,通过pipeline的方式将多个指令封装在一个命令里执行。
二、Redis事物
redis的简单事务是将一组需要一起执行的命令放到multi和exec两个命令之间,其中multi代表事务开始,exec代表事务结束
1、事务命令
multi:事务开始
exec:提交事务
watch:事务监控
WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。监控一直持续到
discard:停止事务
在执行exec之前执行该命令,提交事务会失败,执行的命令会进行回滚
127.0.0.1:6379> multi //开始事务OK127.0.0.1:6379> sadd tt 1 //业务操作QUEUED127.0.0.1:6379> DISCARD //停止事务OK127.0.0.1:6379> exec //提交事务(error) ERR EXEC without MULTI //报不存在事务异常127.0.0.1:6379> get tt //获取不到对象(nil)127.0.0.1:6379>2、事务异常
redis支持事务,但他属于弱事务,中间的一些异常可能会导致事务失效。
1、命令错误,语法不正确,导致事务不能正常结束
127.0.0.1:6379> multi //开始事务OK127.0.0.1:6379> set aa 123 //业务操作QUEUED127.0.0.1:6379> sett bb 124 //命令错误(error) ERR unknown command 'sett'127.0.0.1:6379> exec (error) EXECABORT Transaction discarded because of previous errors. //提交事务异常127.0.0.1:6379> get aa //查询不到数据(nil)127.0.0.1:6379>2、运行错误,语法正确,但类型错误,事务可以正常结束
127.0.0.1:6379> multiOK127.0.0.1:6379> set t 1 //业务操作1QUEUED127.0.0.1:6379> sadd t 1 //业务操作2QUEUED127.0.0.1:6379> set t 2 //业务操作3QUEUED127.0.0.1:6379> exec1) OK2) (error) WRONGTYPE Operation against a key holding the wrong kind of value //类型异常3) OK127.0.0.1:6379> get t //可以获取到t"2"127.0.0.1:6379>三、redis发布与订阅
redis提供了“发布、订阅”模式的消息机制,其中消息订阅者与发布者不直接通信,发布者向指定的频道(channel)发布消息,订阅该频道的每个客户端都可以接收到消息
1、Redis发布订阅常用命令
| 命令 | 含义 |
| publish channel | 发布消息 |
| subscribe channel | 订阅消息 |
| pubsub numsub channel | 查看订阅数 |
| unsubscribe channel | 取消订阅 |
| psubscribe ch* | 按模式订阅和取消订阅 |
2、性能测试
3、应用场景
redis主要提供发布消息、订阅频道、取消订阅以及按照模式订阅和取消订阅,和很多专业的消息队列(kafka rabbitmq),redis的发布订阅显得很lower, 比如无法实现消息规程和回溯, 但就是简单,如果能满足应用场景,用这个也可以
四、键的迁移
键迁移大家可能用的不是很多,因为一般都是使用redis主从同步。不过对于我们做数据统计分析使用的时候,可能会使用到,比如用户标签。为了避免key批量删除导致的redis雪崩,一般都是通过一个计算使用的redis和一个最终业务使用的redis,通过将计算时用的redis里的键值通过迁移的方式一个一个的更新到业务redis中,使其对业务冲击最小化。
1、move
move指令将redis一个库中的数据迁移到另外一个库中。
move key db //reids有16个库, 编号为0-15 set name DK; move name 5 //迁移到第6个库 elect 5 ;//数据库切换到第6个库, get name 可以取到james1如果key在目标数据库中已存在,那么什么也不会发生。这种模式不建议在生产环境使用,在同一个reids里可以玩
2、dump
Redis DUMP 命令用于将key给序列化 ,并返回被序列化的值。用于导入到其他服务中
一般通过dump命令导出,使用restore命令导入。
1,在A服务器上
set name james; dump name; // 得到"x00x05jamesbx001x82;f"DhJ"2,在B服务器上
restore name 0 "x00x05jamesbx001x82;f"DhJ" //0代表没有过期时间 get name //返回james3、migrate
migrate用于在Redis实例间进行数据迁移,实际上migrate命令是将dump、restore、del三个命令进行组合,从而简化了操作流程。
migrate命令具有原子性,从Redis 3.0.6版本后已经支持迁移多个键的功能。migrate命令的数据传输直接在源Redis和目标Redis上完成,目标Redis完成restore后会发送OK给源Redis。
| migrate | 192.168.42.112 | 6379 | name | 0 | 1000 | copy | replace |
| 指令 | 要迁移的目标IP | 端口 | 迁移键值 | 目标库 | 超时时间 | 迁移后不删除原键 | 不管目标库是不存在test键都迁移成功 |
比如:把111上的name键值迁移到112上的redis
192.168.42.111:6379> migrate 192.168.42.112 6379 name 0 1000 copy五、自定义命令封装
当我们使用jedis或者jdbctemplate时,想执行键迁移的指令的时候,发现根本没有给我们封装相关指令,这个时候我们该怎么办呢?除了框架帮我们封装的方法外,我们自己也可以通过反射的方式进行命令的封装,主要步骤如下
六、键全量遍历
1、keys
| 指令 | 含义 |
| keys * | 返回所有的键, *匹配任意字符多个字符 |
| keys *y | 以结尾的键 |
| keys n*e | 以n开头以e结尾,返回name |
| keys n?me | ?问号代表只匹配一个字符 返回name,全局匹配 |
| keys n?m* | 返回name |
| keys [j,l]* | 返回以j l开头的所有键 keys [j]ames 全量匹配james |
考虑到是单线程,使用改命令会阻塞线程, 在生产环境不建议使用,键多可能会阻塞。
2、渐进式遍历 scan
1,初始化数据
mset n1 1 n2 2 n3 3 n4 4 n5 5 n6 6 n7 7 n8 8 n9 9 n10 10 n11 11 n12 12 n13 132,遍历匹配
scan 0 match n* count 5 匹配以n开头的键,最大是取5条,第一次scan 0开始第二次从游标4096开始取20个以n开头的键,相当于一页一页的取当最后返回0时,键被取完。
3、scan 和keys对比
4、其他遍历命令
SCAN 命令用于迭代当前数据库中的数据库键。
SSCAN 命令用于迭代集合键中的元素。
HSCAN 命令用于迭代哈希键中的键值对。
ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
用法和scan一样
作者:ark_King_原文链接:https://blog.csdn.net/b379685397/article/details/109015852
总结
以上是生活随笔为你收集整理的subscribe error不执行_你不知道的redis:第三方jar无封装命令我们该怎么执行?的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: vue和java实现页面增删改_Spri
- 下一篇: 如何在vb.net中取得两时间的毫秒差_