欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-11 12:21:52
...

1、慢查询

Slowlog 命令
用来记录查询执行时间的日志系统。 查询执行时间指的是不包括像客户端响应、发送回复等IO操作,而单单是执行一个查询命令所深消耗的时间。
solw log 保存在内存里面,读写速度非常快,因此你可以放心的使用它,不必担心因为开启 slow log 损害 Redis的速度

SLOWLOG subcommand [argument]

// 查看日志信息
redis 127.0.0.1:6379> slowlog get 2
1) 1) (integer) 14      // 日志的唯一标识符(uid)
   2) (integer) 1309448221      // 命令执行时的 UNIX时间戳
   3) (integer) 15      // 命令执行的时长
   4) 1) "ping"     // 命令以及命令参数
2) 1) (integer) 13
   2) (integer) 1309448128
   3) (integer) 30
   4) 1) "slowlog"
      2) "get"
      3) "100"

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

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

redis 127.0.0.1:6379> SLOWLOG RESET
OK

redis 127.0.0.1:6379> SLOWLOG LEN
(integer) 0

与慢查询有关的配置

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 
10000.times { 
    r.ping 
} 
end
def with_pipelining 
r = Redis.new 
r.pipelined { 
    10000.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  // 返回指定位置范围内所有的坐标(中心是地点名称)