redis是单线程:对于命令的处理是单线程的,也就是说,多个命令到来,会排成队列,逐条处理。单线程省去了很多上下文切换线程的时间,并且排除了并发操作的锁操作,所以号称速度快,redis的瓶颈一般不是cpu而是网络和内存。
多路 I/O 复用模型:“多路”指的是多个网络连接,“复用”指的是复用同一个线程。多路复用主要有三种技术:select,poll,epoll。redis采用的epoll是目前最新最好的多路复用技术。
redis是内存型数据库,存储的全都是key-value键值对,其中key一定为string字符串类型,value则有五种类型。
redis对外一共提供5种数据类型
redis实现上述数据结构实际上还有一套内部编码,比如字符串的内部编码embstr,列表的内部编码ziplist.
keys *
dbsize
dbsize直接获取键总数这个变量,时间复杂度O(1),keys是遍历一遍所有键,时间复杂度O(n),所以redis保存大量键时尽量不要使用keys
exists <keyName>
del <key> [key]
可以删除一个也可以空格分隔键批量删除
expire <keyName> <seconds>
参数是键名和秒数,如下方设置为10秒
过了10秒之后
ttl <keyName>
返回值有三种情况:
type <keyName>
返回值的数据类型,键不存在则返回none
以下记录常用的命令,官方有所有指令的中文介绍,更全更详细,推荐查阅redis命令中文文档http://www.redis.cn/commands.html#
set <keyName> <value> [EX seconds] [PX milliseconds] [nx|xx] [get]
设置键,不存在则新增,存在则修改get <keyName>
查看键set命令有几个选项: * ex ---秒级过期时间 * px ---毫秒级过期时间 * nx|xx: * nx ---键必须不存在才可以设置成功(新增,等价于setex) * xx ---键必须存在才可以设置成功(更新,等价于setnx) * get ---回显修改前的值(等价于getset)
mset key value [key value ...]
—批量设置mget key [key ...]
—批量获取批量操作和批量单独操作对于redis处理的影响不大,但是网络请求是异步的,所以批量单独操作请求不如批量操作请求效率高,当然如果一次批量操作过大也会造成网络阻塞甚至redis阻塞
1. incr key ---对值自增,返回自增后结果,若键不存在按0自增。类似的还有decr自减、incrby指定数字自增、decrby指定数字自减、incrbyfloat指定浮点数自增 2. append key value ---向字符串末尾追加值 3. strlen key ---返回字符串长度 4. setrange key offeset value ---将offeset位置的字符替换成value的值
哈希类型和redis的key-value结构一样,为区分在使用hash类型的时候用field-value来表示哈希数据的一个键值对:
{ field1:value1 , field2:value2 , ... ,fieldN:valueN}
hset key field value
—设置值hmset key field value [ field value ... ]
—批量设置值hget key field
—获取值的某字段值hmget key field [field ...]
—批量获取值的某字段值hdel key field [field ...]
删除值的某字段hlen key
—获取键值的对数hexists key field
—判断field是否存在hkeys key
—虽然指令叫hkeys,实际获取的是所有fieldhvals key
—获取所有valueredis列表模型是一个横置的列表,从左到右的下标是0到N-1,从右到左的下标是-1到-N
rpush key value [value ...]
/ lpush key value [value ...]
从右/左插入(压栈)linsert key BEFORE|AFTER pivot element
在pivot位置的前/后插入元素elementlrange key start end
查找start到end区间的元素,注意这里是左闭右闭!lindex key index
获取指定下标元素llen key
获取长度lpop key
/ rpop key
删除左/右端的第一个元素(从左/右出栈)lrem key count value
:lterm key start end
只保留start到end区间的元素,左闭右闭lset key index newValue
修改指定下标元素集合是无序不重复的列表 ,在普通增删改查的基础上,还有并交差补的操作,很方便
sadd key element [element ...]
添加srem key element [element ...]
删除scard key
获取集合长度sismember key element
是否存在元素smembers key
无序获取所有元素sinter key [key ...]
返回多个集合交集suion key [key ...]
返回多个集合并集sdiff key [key ...]
返回多个集合差集sinterstore destinationKey [key ...]
将多个集合交集保存在destinationKeysuionstore destinationKey [key ...]
将多个集合并集保存在destinationKeysdiffstore destinationKey [key ...]
将多个集合差集保存在destinationKey有序不重复的列表,排序方式是维护了一个 score分数表,为每一个元素保存一个score,作为排序的依据。
zadd key score element [score element...]
添加element ,score是该元素的分数zadd 命令有几个选项: * nx|xx: * nx ---member必须不存在才可以设置成功(新增) * xx --member必须存在才可以设置成功(更新) * ch ---changed ,元素和分数变化的个数 * incr ---对score增加,相当于zincrby
zrem key element [element ...]
删除zcard key
获取集合长度zscore key member
获取某成员的排序分数zrank key member
返回某成员排名(按score从低到高)zrevrank key member
返回某成员排名(按score从高到低)zincrby key increment member
为某member增加increment排序分数zrange key start end [withscores]
返回排名start到end之间的成员(按score从低到高,左闭右闭)zrevrange key start end [withscores]
返回排名start到end之间的成员(按score从高到低,左闭右闭)