- 全局命令
- 查看所有键:keys *
- 查看键总数:dbsize,dbsize 是直接读取redis内置的键总数变量,而keys * 则会遍历所有键,当键数量很大时,线上环境keys * 禁止使用
- 查看键是否存在:exists key,存在返回1,不存在返回0
- 删除键:del key [key1…],返回结果为删除的键数目,删除一个不存在的键则返回0,可以同时删除多个键
- 设置键过期时间:expire key seconds,键到期系统会自动将它删除
- 返回键过期剩余时间:ttl key,返回值大于等于0表示剩余键过期时间,-1表示未设置键过期时间,-2表示键不存在
- 键的数据类型:type key,键不存在则返回none
-
redis是单线程架构
-
数据类型
-
字符串
- 字符串的值最大不能超过512M
- 设置值
set key value [ex seconds] [px milliseconds] [nx|xx]
ex seconds:表示秒级过期时间
px milliseconds:表示毫秒级过期时间
nx:表示键必须不存在,才能添加成功,用于添加一个新键,合成简写命令 setnx,
根据setnx的特性只有一个客户端能设置成功,setnx可以作为分布式锁的一种实现方案,Redis官方给出了使用setnx实现分布式锁的方法:http://redis.io/topics/distlock
xx:与nx相反,键必须存在,才能添加成功,用于修改一个键,合成简写命令 setxx
- 获取值
get key,如果键不存在,则返回nil(空)
-
批量设置值:mset
-
批量获取值:mget,不存在的键返回nil,批量操作可以提高效率
-
自增操作:incr key,键不是整数,返回错误,键是整数,返回加1后的结果,键不存在,按照值为0自增,返回结果为1
-
内部编码:
- int:8个字节的长整形
- embstr:小于等于39个字节的短字符串
- raw:大于39个字节的长字符串
-
命名注意事项:redis没有命名空间,合理的键命名有利于防止键冲突和项目的维护,比较推荐的方式是使用“ 业务名:对象名:id:[属性] ” 作为键名(也可以不是:)。如果键名过长可以采用缩写,避免键过长浪费内存
-
使用场景:
-
缓存
-
计数
long incrVideoCounter(long id) { key = "video:playCount:" + id; return redis.incr(key); }
真实的计数系统要考虑的问题很多,如:防作弊,多维度统计,数据持久的底层数据源等
- 限速
发短信限速伪代码如下
phoneNum = "138xxxxxxxx"; key = "shortMsg:limit:" + phoneNum; // SET key value EX 60 NX isExists = redis.set(key,1,"EX 60","NX"); if(isExists != null || redis.incr(key) <=5){ // 通过 }else{ // 限速 }
- 共享session
分布式系统会导致session 分散到不同的服务器上,负载均衡会导致出现用户刷新一次就要重新登录的情况
使用redis统一管理session 即可解决上述问题,如下图所示: