1.
dbsize,时间复杂度是o(1),而keys * 则会遍历redis所有键,o(n),保存了大量的键时候,线上环境禁止使用
2.
可以利用redis自带的慢查询日志功能,来找出和检测出执行效率超过预定阈值(时间)的指令。
config set slowlog-log-slower-than 20000 (单位为微妙) -设定阈值为20ms
config set slowlog-max-len 1000 -设定慢查询日志记录列表的长度为1000,超出会自动删除最先记录的指令。
slowlog get [n] - 查询当前redis记录下的慢指令
3.
ttl 查询键过期时间,返回值:>=0,即为键过期的时间(s)
-1 ,没设置过期时间
-2 ,键不存在
4.
type 键名 ,可以查询键的数据结构类型
5.
object encoding 键名 ,查询数据结构内部编码实现类型,如ziplist,skiplist等
6.
setnx 可以实现分布式锁,见http://blog.csdn.net/pzqingchong/article/details/52516602
7.
批量设置,获取,这样可以节省命令往返的RTT, mset,mget
8.
redis 实现限速功能,例如1分钟内只能重新获取验证码5次,或者一些网站限制一个IP不能在一秒内访问超过n次
key="IP"
isExists=redis.set(key,1,"EX 60","NX");
if(isExists!=null||redis.incr(key)<=5){
通过
else{
不通过
}
9.
哈希操作,使用批量设置和获取 field-value : hmset ,hmget
避免使用:
1)获取所有filed的命令,hkeys key(o(n)) 。
2)获取所有values的命令,hvals key 。
3)获取所有 field-value, hgetall key。如果元素比较多,会存在阻塞redis的可能,如果开发人员只需要部分field 可以使用 hmget ,如果一定要获取所有 field-value ,则使用hscan,该命令会渐进式遍历
10.
redis 只能做简单的关系查询,复杂的,还是需要关系型数据库
11.
考虑使用 序列化字符串类型实现缓存,例如:将用户信息序列化(JDK序列化或者protobuf)后用一个键保存。
set user:1 serialize(userInfo)
简化编程,俭省内存,缺点是,序列号与反序列化需要开销,同时每次更新属性都需要把全部数据反序列化提取出来,更新,再序列化存进去。
12.
在使用集合set时,若要计算元素个数,使用scard key ,时间复杂度为o(1),它不会遍历集合所有元素,而是直接用Redis的内部变量
13.
smembers(查询集合set的所有元素),lrange(返回列表list的范围元素),hgetall(返回哈希的所以key-value对)属于比较重的命令,建议还是使用如下:
详见:http://www.redis.cn/commands/scan.html
14.
标签系统,可以使用集合set来实现,例如可以使用交集运算,找出两个用户的共同爱好。
sinter user:1:tags user:2:tags
15.
抽奖功能:
sadd = Tagging (标签)
spop/srandmember=Random item(生成随机数,比如抽奖)
sadd+sinter=Social Graph (社交需求)
16.
查询有序集合zset的元素个数,使用zcard,o(1)复杂度
17.
对当前网络环境的延迟不确定时,可以用redis客户端执行 --lantency 指令查询客户端与redis服务器之间的网络延迟。
redis-cli -h [服务器 ip] --latency
18.
注意redis的pipeline打包指令执行,减少RTT,但是它的执行是非原子的,而原生批量指令,类似hgetall是原子的。
使用Lua脚本可以创造出原子,高效的自定义命令组合
19.
redis提供了设置服务器端的最大客户端连接数,一旦超过maxclients,新的链接将被拒绝,默认是10000
config set maxclients 50
redis还提供了设置连接idle时间
config set timeout 30 (秒),防止客户端没有及时释放连接,造成大量的idle连接占据着很多连接资源,一旦查过maxclients 后果不堪设想,所以实际开发中,需要将timeout设置成大于0。
20.
多用info clients ,client list监控查看redis连接客户端的信息,及时修改调整,防止输入缓冲区与输出缓冲区溢出,导致OOM,键值对丢失等问题
21.
运维层面禁止使用monitor指令,防止出现redis输出缓冲区溢出,导致OOM,因此要限制输出缓冲区的大小。