Redis的一个客户端,支持多个操作系统
全局命令
查看所有键
- keys命令会遍历所有键,时间复杂度O(n),线上保存了大量的键时,禁止使用
keys *
查看当前数据库中键的总数
- 它时查询Redis内置的变量,的时间复杂度是O(1)
dbsize
查看某个键是否存在
exists key ---------------- > EXISTS key 0 > EXISTS java 1
- 如果存在返回1,不存在返回0
删除键
del key [key...] ----------------- > EXISTS java 1 > del java 1 > EXISTS java 0 ----------------- > set a 1 OK > set b 2 OK > set c 3 OK > set d 4 OK > del a b c d 4
- 无论值是什么数据结构,del都可以删除
- 返回删除成功的个数
键过期
对键添加过期时间,超时自动删除键。
expire key seconds ----------------- > set hello world OK > expire hello 10 1 > ttl hello 3 > ttl hello -2
- 给hello设过期时间为10秒
- ttl key 查看键的过期时间;返回-2,表示键已被删除
键的数据结构
type key --------------- > set a b OK > type a string > rpush mylist a b c d 4 > type mylist list > type not_exist_key none
数据结构与内部编码
Redis的5种数据结构,string,list,hash,set,zset,它们是提供给用户直接使用的数据结构。
每种数据结构内部都有不同的实现方式,也就是内部编码。比如string的内部编码有raw,int,embstr;list的内部编码有quicklist,linkedlist,ziplist。这样设计一方面方便改进内部编码,另一方面可以为不同的场景提供不同的实现。
查看内部编码
object encoding key ------------------- > object encoding mylist quicklist > object encoding a embstr
单线程架构
【专题todo Redis的单线程架构】
【专题todo IO多路复用】
单线程架构+IO多路复用
Redis是单线程的,所以每条命令从客户端到达服务端不会立刻被执行,而是进入一个队列中,然后被逐个执行,不会存在并发的问题。
单线程为什么还这么快?
- 纯内存访问
- 非阻塞IO,Redis使用epoll作为多路复用的实现,加上自身的事件处理模型将epoll的连接,读写,关闭都转换为事件,不在网络IO上浪费时间
- 单线程避免了线程切换和竞争产生的消耗
单线程架构的问题就是如果某个命令执行时间过长,会造成其他命令的阻塞,是要重点关注的。
字符串
字符串是最基本的数据结构,字符串的值实际可以是字符串(简单的字符串,json,xml),数字(整数,浮点数),甚至是二进制(图片,音频,视频),但是值最大不超过512MB
设置值
set key value [ex seconds] [px milliseconds] [nx|xx] ------------------------------------------------------- > set hello world ------------------------------- 选项说明: ex seconds: 为键设置秒级过期时间 px milliseconds 为键设置毫秒级过期时间 nx:键必须不存在,才可以设置成功,用于添加 xx:键必须存在,才可以设置成功,用于更新
set xx的例子:
> exists hello 0 > set hello world xx null > set hello world OK > set hello redis xx OK > get hello redis
与ex和nx类似的还有两个单独的命令:setex 和 setnx
setex key seconds value // 设置过期时间,秒级 setnx key value // 键不存在才能添加
setnx的例子:
> exists hello 0 > setnx hello world 1 > setnx hello world 0
由于Redis是单线程的命令处理机制,如果多个客户端同时执行setnx,那么只有一个客户端可以设置成功,所以setnx可以作为分布式锁的实现方案。
【专题todo 分布式锁】
获取值
get key
如果键不存在,返回空(null)
批量设置值
mset key value [key value ...] ----------------------------------- > mset a 1 b 2 c 3 d 4 OK > get a 1 > get b 2
批量获取值
mget key [key ...] ------------------------- > mget a b c r d 1 2 3 null 4
返回的结果是和传入键的顺序一致的.
批量操作减少IO次数,但是要注意批量操作的数量过多可能会阻塞Redis或网络拥塞
计数
整数自增
incr key ---------------- > incr akey // 自增不存在的key,按照从0自增,返回1 1 > incr akey // value是整数,返回自增后的结果 2 > set hello world OK > incr hello // 值非整数,返回错误 ERR value is not an integer or out of range
整数自减
decr key
自增指定数字
incrby key increment -------------------- > incrby key 2 2
自减指定数字
decrby key decrement ------------------- > decrby key 2 1
自增浮点数
incrbyfloat key increment -------------------------- > incrbyfloat key 1.1 2.1