redis慢查询的简单认识和事务、订阅的认识
有学习的小伙伴可以一起讨论有问题可以问我,微信 15321502296
慢查询
阀值:规定的一个值
阈值:规定的一个范围
就是系统在执行命令前后计算每条命令的执行时间,当超过预设的阀值时,就见这条命令记录下来
slowlog-log-slower-than 微秒
1秒=1000毫秒=1000000微秒
0 记录所有命令
<0不进行记录
slowlog-max-len
max-len : 代表最多存储多少条
若慢查询日志存满时,再有日志记录时,则删除最早的一条,依次按此执行
慢查询日志 只记录第三步 执行命令的时间
config setslowlog-log-slower-than 10000 //一次性设置
config set slowlog-max-len 1000
config rewrite
vim redis.conf //永久设置
在企业中根据自己的业务情况设置,不能太小,不能太大
slowlog get 【n】
查看慢查询日志
获取当前慢查询日志列表当前的长度
slowlog len
慢查询日志重置
slowlog reset
redis shell
redis-cil
-r 将命令执行多次
-i 每隔几秒执行一次
-x:从标准输入读取数据
[root@www redis-4.0.2]# echo 'word' | redis-cli -x set hellow
OK
-c :连接集群节点的时候开始使用,
-a : 不需要输出auth命令
--scan 相当于scan,用于扫描指定的键
--slave:把客户端模拟成从节点,来获取redis的更新
--rdb:请求redis生成并发送RDB持久化文件,保存到本地
--pipeline:将命令封装成redis通心协议定义的数据格式,批量发送给redis执行
--eval : 执行指定的lua脚本
--latency
--latency-history--
latency-dist
监测网络的延迟
redis-cli -h 192.168.4.30 --latency-dist
--stat 可以实时获取redis统计信息
redis-cli --raw get hel
--raw:反之
info
[root@www redis-4.0.2]# redis-cli -h 192.168.4.30
192.168.4.30:6379> info
# Server
--no--raw :命令返回的结果是原始格式
redis-server
--test-memory +大小 检测当前操作系统能否稳定的指定的内存给redis
(memory:内存)
redis-benchmark 可以为redis做基础准性能测试,为开发和运维提供方便,做测试使用
基准测试1
redis-benchmark -c 100 -n 200
-c代表客户端的并发数量(默认50)
-n表示客户端的请求的总量(默认是100000)
-q 仅显示redis-bechmark的 requestsper seconf 请求数量,秒等信息
信息
-k 客户端是否使用keepalived 1 为使用 0为不使用 默认值为1
-r 在一个空的redis上执行redis-benchmark,并向redis里面插入更多随机键
-t 可以对指定命令进行基准测试(默认为 1)
-p : 每个请求pipe流水线的数据量
-t get, set -q
-csv 按照csv的格式输出
pipeline
redis提供了批量操作,命令
往返时间
RTT round trip time
echo -en '*3\r\n$3\r\nSET\r\n$5\r\nhellw\r\n$5\r\nworld\r\n*2\r\n$4\r\nincr\r\n$7\r\ncounter\r\n' | redis-cli --pipe
原生的批量命令与pipeline的比较
1、原生批量命令是原子的,
mset a b c d pipeline ? 非原子性
2、原生命令是一个命令对应多个key,pipeline
流水线支持多个命令
3、原生批量命令是redis服务端支持实现的,而pipenel需要服务端和客户端的共同实现。
事务:
一组命令的集合
multi :事务的开始
exec :事务的结束w
discard 停止事务的执行
在事务当中 只要有一个失败,就全都失败
如果在事务之外对键进行操作完成,则操作之前的事务不起作用
bitmaps
数据结构模型
现代计算机用二进制(位)作为信息的基础单位,1字节等于8位例如“big”字符串是由3个字节组成,但实际在计算机存储时将其用二进制表示,“big”分别对应ASCLL吗分别是98、105、103.
1个字节=8比特=8位
big 3 个字节
b:98
i:105
g:103
set' bit
get' bit
获取 bitmaps指定范围值为1的个数
bitcount
bitmaps 间的运算
计算bitmaps中第一个值为targetbit的偏移量
bitop 是一个复合操作,他可以做多个 交、并、非、异或
求俩个集合之间的交集取名为user:02-27_28 unique
bitop and unique:user:02-27_28 unique:user:02-27 user:02-28
setbit 2019-05-07 7 1
getbit 2019-05-07 1
发布订阅
1、发布需i奥西
publish channel message
例如
publish moto "ljx"
2、订阅消息
subscribe + 频道名
unsubscribe
按照模式订阅或者取消订阅
psubscribe pattern
punsubscribe
5、查询订阅
pubsub channels
查看频道订阅数
pubsub numsub
查看模式订阅数
pubsub numsub
GEO
1、增加地理位置的信息
geoadd key longitude latitude member
例 geoadd city:location 115.29 38.51 baoding 可以添加多个城市
2、获取地理位置的信息
geopos key member1 member2
3、获取2个地理位置的距离
geodist key member1 member2 [unit] //unit 取值范围的单位 m,km 、mi 英里 ft尺
4、
georadiusbymember city:location beijing 200 km 获取指定范围内的地区
geohash city:location beijing //获取hash 值
Redis 事务
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务。
- 命令入队。
- 执行事务。
有学习的小伙伴可以一起讨论有问题可以问我,微信 15321502296
实例
以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC1) OK2) "Mastering C++ in 21 days"3) (integer) 34) 1) "Mastering Series"
2) "C++"
3) "Programming"
Redis 事务命令
下表列出了 redis 事务的相关命令:
序号 |
命令及描述 |
1 |
DISCARD |
2 |
EXEC |
3 |
MULTI |
4 |
UNWATCH |
5 |
WATCH key [key ...] |
Redis 发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
实例
以下实例演示了发布订阅是如何工作的。在我们实例中我们创建了订阅频道名为 redisChat:
发布频道
redis 127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)1) "subscribe"2) "redisChat"3) (integer) 1
现在,我们先重新开启俩个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息。
在频道接受信息
redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"
(integer) 1
redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by runoob.com"
(integer) 1
# 订阅者的客户端会显示如下消息1) "message"2) "redisChat"3) "Redis is a great caching technique"1) "message"2) "redisChat"3) "Learn redis by runoob.com"
Redis 发布订阅命令
下表列出了 redis 发布订阅常用命令:
序号 |
命令及描述 |
1 |
PSUBSCRIBE pattern [pattern ...] |
2 |
PUBSUB subcommand [argument [argument ...]] |
3 |
PUBLISH channel message |
4 |
PUNSUBSCRIBE [pattern [pattern ...]] |
5 |
SUBSCRIBE channel [channel ...] |
6 |
UNSUBSCRIBE [channel [channel ...]] |
Redis HyperLogLog
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
实例
以下实例演示了 HyperLogLog 的工作过程
redis 127.0.0.1:6379> PFADD runoobkey "redis"
1) (integer) 1
redis 127.0.0.1:6379> PFADD runoobkey "mongodb"
1) (integer) 1
redis 127.0.0.1:6379> PFADD runoobkey "mysql"
1) (integer) 1
redis 127.0.0.1:6379> PFCOUNT runoobkey
(integer) 3
Redis HyperLogLog 命令 总共有三个
下表列出了 redis HyperLogLog 的基本命令:
序号 |
命令及描述 |
1 |
PFADD key element [element ...] |
2 |
PFCOUNT key [key ...] |
3 |
PFMERGE destkey sourcekey [sourcekey ...] |
GEO 地理信息定位
1、增加地理位置的城市信息(可以添加多个)
geoadd city:location 118 40 beijing
经度 纬度
2、获取
geopos city:location beijing
3、获取地理位置之间的距离
geodist key membert1 memert2 【unit】 unit :取值范围 : m 米 |km 公里
geodist city:location beijing tianjin km
4、获取范围内的地理信息
(1)georadius key logitude rediusm | ft | mi 【withcoord】 【withdist】 【wothhash】 【count count】 【asc|desc】【store key】【storedist key】
获取北京200km以内的城市
georadiusbymember city:location beijing 200 km
5、获取geo 哈希
把北京转化为哈希值
geohash city:location beijing