redis使用需要留意的命令与地方
来源:互联网 发布:ca沃通根证书 mac 信任 编辑:程序博客网 时间:2024/05/29 02:42
最近温习了一下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 (单位为微妙) -设定阈值为20msconfig 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
- redis使用需要留意的命令与地方
- 移植C/C++程序到不同平台时需要留意的地方
- delete与delete[]需要注意的地方
- delete与delete[]需要注意的地方
- delete与delete[]需要注意的地方
- delete与delete[]需要注意的地方
- 字符与字符串需要注意的地方
- CMD下使用javac和java命令需要注意的地方
- redis中pipeline用法需要注意的地方
- 使用Win2003需要注意的地方
- 使用Win2003需要注意的地方
- Spring使用中需要注意的地方
- HttpURLConnection使用中需要注意的地方
- string使用需要注意的地方。
- 使用lib需要注意的地方
- 使用 Calendar 需要注意到的一点地方
- string使用需要注意的地方。
- string使用需要注意的地方。
- cocos2dx ListView 动态加载(代码)
- [Tarjan]LCA算法
- Mysql 远程登录及常用命令
- centos7安装mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz
- 一个开发团队de工作组成
- redis使用需要留意的命令与地方
- sql语句的应该考虑哪些安全性呢
- org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.zzq.springboot.
- 【LeetCode】Swap Nodes in Pairs 解题报告
- Maven私有库和本地库的安装与配置 Sonatype Nexus + Maven
- SpringMVC学习笔记(十二)
- SQL存储过程
- IAR Warning[25]: Label 'Reset_Handler' is defined pubweak in a section implicitly declared root
- 每日工作记录——任意小数分频研究