天天看点

Redis系统梳理——Redis的高级功能

1、慢查询

Slowlog 命令

用来记录查询执行时间的日志系统。 查询执行时间指的是不包括像客户端响应、发送回复等IO操作,而单单是执行一个查询命令所深消耗的时间。

solw log 保存在内存里面,读写速度非常快,因此你可以放心的使用它,不必担心因为开启 slow log 损害 Redis的速度

SLOWLOG subcommand [argument]

// 查看日志信息
redis :> slowlog get 
) ) (integer)       // 日志的唯一标识符(uid)
   ) (integer)       // 命令执行时的 UNIX时间戳
   ) (integer)       // 命令执行的时长
   ) ) "ping"     // 命令以及命令参数
) ) (integer) 
   ) (integer) 
   ) (integer) 
   ) ) "slowlog"
      ) "get"
      ) "100"

// 查看当前日志数量
redis :> SLOWLOG LEN
(integer) 

// 清空 slow log
redis :> SLOWLOG LEN
(integer) 

redis :> SLOWLOG RESET
OK

redis :> SLOWLOG LEN
(integer) 
           

与慢查询有关的配置

slowlog-log-slower-than 单位毫秒,指Redis命令执行的最大时间,如果超过该时间,这条命令将进入慢查询日志。不接受负值,如果设置为0,则每条命令都会被记录到慢查询日志。

slowlog-max-len 单位毫秒,指慢查询日志的数量的最大值,当达到最大值以后,如果有新的新的慢查询日志记录进来,则最老的那条会被删除。

2、PipeLine流水线

简单讲,就是一次网络请求,N条命令执行。

Redis客户端与Redis服务器之间使用TCP协议进行连接。当客户端通过一个socket连接发起多个请求命令,每个命令需要等待上一个命令结束有结果返回后,才会去执行。网络通讯是有开销的。

Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。

这里给出菜鸟教程里面的例子,直观的展示下(http://www.runoob.com/redis/redis-pipelining.html)

require 'rubygems' 
require 'redis'
def bench(descr) 
start = Time.now 
yield 
puts "#{descr} #{Time.now-start} seconds" 
end
def without_pipelining 
r = Redis.new 
.times { 
    r.ping 
} 
end
def with_pipelining 
r = Redis.new 
r.pipelined { 
    .times { 
        r.ping 
    } 
} 
end
bench("without pipelining") { 
    without_pipelining 
} 
bench("with pipelining") { 
    with_pipelining 
}
           

3 HyperLogLog

HyperLogLog是用来做基数统计的,它是优点是当输入元素数量非常大非常大的时候,计算基数所需要的空间是固定的,并且是很小(简单说就是占用内存很小)。它统计值会有一定的误差(1%以内),只是统计数量,并不知道具体内容是什么。

PFADD key element [element ...]   // 添加指定元素到HyperLogLog中

PFCOUNT key [key ...]  // 返回给定HyperLogLog的基数估算值

PFMERGE destkey sourcekey [sourcekey ...] // 将多个HyperLogLog合并为一个
           

4 GEO 地理位置存储

Redis 3.2以后出现了GEO功能。比如查看附近的商家,再比如摇一摇等都可以用它来实现

GEOADD key longitude latitude member  // 将指定的地理空间位置(经度 纬度 名称)添加到指定的key中

GEOPOS key member // 从key中返回所有给定位置元素的位置(经度和纬度)

GEODIST key member1 member2 [unit] //返回两个给定位置之间的距离,其中参数unit指单位,如m km等待

GEORADIUS key longtitude latitude radium m|km|mi|ft // 返回指定位置范围内所有坐标(中心是经纬度)

GEORADIUS key member radium m|km|mi|ft  // 返回指定位置范围内所有的坐标(中心是地点名称)