redis使用需要留意的命令与地方

最近温习了一下redis的知识,总结记录了一些需要注意的地方。使用好redis,还是需要继续多深入了解redis的数据结构,命令的复杂度,主从复制原理,

大家还是需要多去redis的中文官网多加查询与学习

redis学习官网:http://www.redis.cn/

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对)属于比较重的命令,建议还是使用如下:
  • SCAN 命令用于迭代当前数据库中的key集合。
  • SSCAN 命令用于迭代SET集合中的元素。
  • HSCAN 命令用于迭代Hash类型中的键值对。
  • ZSCAN 命令用于迭代SortSet集合中的元素和元素对应的分值

详见: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,因此要限制输出缓冲区的大小。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值