一、 慢查询原因分析
@H_404_2@与MysqL一样:当执行时间超过阀值,会将发生时间耗时的命令记录二、redis-cli详解
@H_404_2@./redis-cli -r 3 -h 192.168.1.111 -a 12345678 ping //返回pong表示127.0.0.1:6379能通,r代表次数./redis-cli -r 100 -i 1 info |grep used_memory_human //每秒输出内存使用量,输100次,i代表执行的时间间隔./redis-cli -p 6379 -h 192.168.1.111 -a 12345678对于我们来说,这些常用指令以上可满足,但如果要了解更多执行./redis-cli --help,可百度三、 redis-server详解
@H_404_2@ ./redis-server ./redis.conf & //指定配置文件启动 ./redis-server --test-memory 1024 //检测操作系统能否提供1G内存给redis,常用于测试,想快速占满机器内存做极端条件的测试,可使用这个指令 redis上线前,做一次测试 @H_404_2@四、redis-benchmark:redis性能
@H_404_2@100个客户端同时请求redis,共执行10000次,会对各类数据结构的命令进行测试: @H_404_2@./redis-benchmark -h 127.0.0.1 -c 100 -n 10000 //100dis性能 @H_404_2@五、Pipeline(管道)
1.背景:
@H_404_2@没有pipeline之前,一般的redis命令的执行过程都是:发送命令-〉命令排队-〉命令执行-〉返回结果。 @H_404_2@多条命令的时候就会产生更多的网络开销 @H_404_2@2. 使用pipeline和未使用pipeline的性能对比:
@H_404_2@使用Pipeline执行速度与逐条执行要快,特别是客户端与服务端的网络延迟越大,性能体能越明显3.原生批命令(mset,mget)与Pipeline对比
@H_404_2@1) 原生批命令是原子性,pipeline是非原子性, (原子性概念:一个事务是一个不可分割的最小工作单位,要么都成功要么都失败。原子操作是指你的一个业务逻辑必须是不可拆分的. 处理一件事情要么都成功要么都失败,其实也引用了生物里概念,分子-〉原子,原子不可拆分)2) 原生批命令一命令多个key,但pipeline支持多命令(存在事务),非原子性3) 原生批命令是服务端实现,而pipeline需要服务端与客户端共同完成4. pipeline正确使用方式:
@H_404_2@ 使用pipeline组装的命令个数不能太多,不然数据量过大,增加客户端的等待时间,还可能造成网络阻塞,可以将大量命令的拆分多个小的pipeline命令完成 @H_404_2@如:有300个命令需要执行,可以拆分成每30个一个pipeline执行六、redis事务
@H_404_2@pipeline是多条命令的组合,为了保证它的原子性,redis提供了简单的事务;redis的事物与MysqL事物的最大区别是redis事物不支持事物回滚 @H_404_2@事务:事务是指一组动作的执行,这一组动作要么都成功,要么都失败。 @H_404_2@1. redis的简单事务,将一组需要一起执行的命令放到multi和exec两个命令之间,其中multi代表事务开始,exec代表事务结束 @H_404_2@bed64b01a3c3769404.png" alt="">
@H_404_2@ 在客户端1设置值使用watch监听key并使用multi开启事物,在客户端2追加完c之后再来客户端1追加redis,然后执行事物,可以看到在客户端1追加的redis没有起效果:
@H_4042@客户端1:
@H404_2@
<img src="/res/2019/02-10/10/1cd2b5fddd27fa227944da4147c98c15.png" alt="">
@H_4042@客户端2:
@H404_2@
<img src="/res/2019/02-10/10/590fa4b6111d79ddddb7263fa51e20d4.png" alt="">
七、LUA语言与Redis配合使用
@H_404_2@1. LUA脚本语言是C开发的,类似存储过程 @H_404_2@1).减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。2).原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。3).复用:客户端发送的脚本会永久存储在Redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑 @H_404_2@语法: @H_404_2@eval+脚本+KEYS[1]+键个数+键——》eval script numkeys key [key ...] @H_404_2@eval "return redis.call('get',KEYS[1])" 1 name @H_404_2@ 语法示例1: int sum =
int i =
i <=
sum = sum+ i = i+
(sum)
@H_404_2@语法示例2:
tables myArray={“james”,”java”,,} // int sum =
(myArray[]) // i = ,
sum = sum+
j = ,#myArray //
myArray[j] ==
(“
(“
@H_404_2@
@H_404_2@频率限制
@H_404_2@JAVA
accessLimit(String ip, dis jedis) {
result =
String key = "rate.limit:" + dis.exists(key)) {
afterValue =dis.incr(key);
(afterValue > result = } Transaction transaction =dis.multi();
}
@H_404_2@以上代码有两点缺陷 :可能会出现竞态条件: 解决方法是用 WATCH 监控 rate.limit:$IP 的变动,但较为麻烦;以上代码在不使用 pipeline 的情况下最多需要向Redis请求5条指令,传输过多.
@H_404_2@b)使用lua脚本来处理,包括了原子性
@H_404_2@lua脚本:
@H_404[email protected]
key = KEYS[ limit = (ARGV[ expire_time = ARGV[
is_exists = redis.call( is_exists ==
redis.call(,key) > limit
redis.call(,key, redis.call(
@H_404_2@使用redis命令获取lua脚本来执行:
@H_404_2@./redis-cli -p 6379 -a 12345678 --eval ipAccessCount.lua ,10 20
@H_404_2@和lua脚本的对应关系为:
@H_404_2@执行逻辑:使用redis-cli --eavl时,客户端把lua脚本字符串发给redis服务端,将结果返回客户端,如下图
@H_404_2@八、发布与订阅
@H_404_2@ redis提供了“发布、订阅”模式的消息机制,其中消息订阅者与发布者不直接通信,发布者向指定的频道(channel)发布消息,订阅该频道的每个客户端都可以接收到消息 @H_404_2@@H_404_2@redis主要提供发布消息、订阅频道、取消订阅以及按照模式订阅和取消订阅
@H_4042@1.发布消息 publish channel:test "hello world"
@H404_2@
<img src="/res/2019/02-10/10/b362618840f902f3e19c2e2dcf1fe666.png" alt="">
@H_404_2@2.订阅消息 subscrible channel:test 此时另一个客户端发布一个消息:publish channel:test "james test" 当前订阅者客户端会收到如下消息:
@H_404_2@
<img src="/res/2019/02-10/10/5c58014def55becb8943cb4a96a38c16.png" alt="">
@H_404_2@和很多专业的消息队列(kafka rabbitmq),redis的发布订阅显得很lower,比如无法实现消息规程和回溯, 但就是简单,如果能满足应用场景,用这个也可以
@H_404_2@3.查看订阅数:pubsub numsub channel:test // 频道channel:test的订阅数
@H_404_2@4.取消订阅 unsubscribe channel:test 客户端可以通过unsubscribe命令取消对指定频道的订阅,取消后,不会再收到该频道的消息
@H_404_2@5.按模式订阅和取消订阅 psubscribe ch //订阅以ch开头的所有频道
@H_404_2@punsubscribe ch //取消以ch开头的所有频道
@H_404_2@6.应用场景: 1、今日头条订阅号、微信订阅公众号、新浪微博关注、邮件订阅系统 2、即时通信系统 3、群聊部落系统(微信群)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。