1 通用命令
keys *,和dbsize
dbsize不会遍历所有键,时间复杂度是O(1) ,只是查询了redis内置key长度计算器
keys *会去遍历所有键,时间复杂度是O(n),线上禁止使用这个命令
exists key(检查键是否存在),
del key...(删除键),
expire key seconds(键过期),ttl 命令可以查看剩余时间,返回 大于 0的整数代表剩余的时间,-1 键未设置过期时间,-2键不存在
type key 获取键的类型 返回5种对外的键类型,其实内部是有自己的编码的,
2 单线程架构
redis是单线程的,假设我们三个客户端向redis服务端发送命令,服务端是将这三个命令加入到一个队列里面,然后挨个执行,是串行执行的,所以不会有并发问题。redis高速的原因主要是纯内存访问,内存反应速度快,另外避免了多线程切换所带来的消耗,其次是非阻塞IO,epoll多路复用IO模型的实现。
![](/qrcode.jpg)
3 字符串类型 String
首先,所有的键都是字符串类型的,字符串作为值时,既可以是简单字符串,也可以是JSON字符串,XML字符串,数字(以字符串存储,但是可以做算术运算如:incr命令),
set, setnx, setxx
set 命令很简单,就是设置一个值,设置之前key存在就更新,不存在就添加,
setnx 键不存在才可以设置,用于添加场景,可实现分布式锁,具体查看 http://redis.io/topics/dislocak
setxx 键存在才可以设置,用于更新场景,
mset:mset a 1 b 2 c 3
mget:mget a b c 如果不存在,会在相应位置返回空
普通get时间 = n次网络时间+n次命令时间
批量get = 1 次网络时间+n次命令时间
批量get ,有助于提高效率
append:追加命令,用于在字符串尾部追加值.
getset:设置并返回原来的值
字符串类型典型使用场景
1 缓存
用户请求先从redis缓存中查找。如果找到则直接返回,如果未找到,则从数据库找, 并且将结果设置到redis中
2 计数
使用incr自增计数,可以实现高效计数
3 session共享
将用户登录信息存入redis,集中管理,保证redis高可用即可,解决了服务器集群session不共享的问题
4 限速
比如实现对手机号码进行 一分钟之内只能发5次验证码的限制。
setex 135********:limit 60 1 设置手机号一分钟内发送的次数,
setex 135***06557 60*5 123456 设置手机号(5分钟内有效)
这样就对手机号设置了一分钟内访问5次的限制
4 哈希 hash
注意一下hash和字符串的结构区别,
hset key1 name '张三' hset key1 name '张三' age 18
hget key1 name hget key1 name age
命令和String 很相似,其他不再赘述。
hash的使用场景
我去