一、redis功能介绍
1、慢查询分析:只记录命令执行时间,并不记录命令排队与网络传输时间。
1、redis.conf文件配置
slowlog-log-slower-than 10000 单位是微秒
slowlog-max-len 128 指定列表中最大保存慢查询条数。
2、pipeLine流水线概念
redis获取数据步骤:1发送命令 2命令排队 3命令执行 4返回结果。当机房与用户端距离太远,真正耗时则为数据往返时间PTT。
pipeLine机制将一组redis命令组装,通过一次RTT传输给redis服务,并顺序返回数据,节约n-1次RTT时间。
pipeLine组装redis是非原子性操作,而redis原生的mget mset等批量操作指令为原子性。
3、redis支持简单事物
mulit开启事物,exec事物提交,discard事物不提交,但是无法支持事物回滚。
但是lua脚本可以完美的支持redis事物,lua脚本为c语言。
4、redis对lua脚本支持
redis执行lua脚本的两种方式:eval与evalsha,如果lua脚本过大,可以执行redis-cli --eval。
lua脚本原子性,多个redis命令封装传送,减少网络传输耗时。
5、GEO对经纬度支持:GEO数据结构底层为zset
添加:geoadd key 经度 维度 成员 geoadd city:location 116 39 beijing
查询:geopos key 成员
用途:查询两个地里位置间距离,获取某经纬度范围内的城市列表。
二、redis客户端
1、协议
几乎所有主流编程语言java、Python、php等都是redis服务的客户端。
客户端与redis通讯协议TCP、redis制定了RESP协议(redis序列化协议)实现数据交互,这种协议简单高效。
2、java客户端
1、首先引入redis依赖,直连获取Jedis对象。
缺点:每次操作客户端都要通过TCP建立与redis服务连接。
2、使用优秀的redis连接池操作Jedis对象
3、java对Pipeline对象整合
4、java对lua脚本支持
注:script:lua脚本内容 keyCount:键个数 params:相关参数keys和argv
3、客户端管理
client list:列出与redis服务相连的所有客户端连接信息
info clients :获取最大输入、输出缓冲区。
client setname getname :设置、获取当前客户端名称
client kill ip:port 关闭客户端进程
monitor:监控操作该redis服务的client
4、java客户端常见异常
1、无法从连接池获取连接
原因:连接池最大连接数不够、连接没有正常释放、存在慢查询导致连接占满、在redis服务端导致命令阻塞。
2、客户端读写超时
原因:读写超时时间设置过段、命令执行过慢、客户端与服务端网络异常、redis自身阻塞
3、客户端连接超时
原因:连接超时时间设置过段、客户端与服务端网络异常、redis自身阻塞
4、客户端缓冲区异常
原因:输出缓冲区满普通客户端输出缓冲区设置1G、不正常并发读写Jedis对象被多个线程并发操作
5、lua脚本正在执行,超过lua-time-limit
6、redis正在加载持久化文件
7、redis使用内存超过maxmemory
8、客户端连接数过大超过maxclients