-
单线程的redis
多快?单线程每秒钟达到万级别的处理能力。归结为三点:
1、纯内存访问,redis 将所有数据放在内存租户,内存响应时长大约100纳秒,这是redis每秒万级别访问的基础。
2、非阻塞IO多路复用模式。使用epoll作为IO多路复用技术的实现,再加上redis自身处理模型将epoll中的链接、读写、关闭都转换为事件,不在网络IO上浪费过多时间。
3、单线程避免了线程上下文间切换及多线程竞争带来的开销。
但是,单线程会有一个问题:对每个执行命令的执行时间都是有要求的,执行时间不能太长,否则会造成其它命令的阻塞,对redis这种高性能的服务来说是致命的,所以redis是面向快速执行场景的数据库。
-
redis 数据结构
-
字符串
字符串是redis基础的数据结构,其它几种数据结构是在字符串类型的基础上构建的。字符串类型的值可以是字符串(json、xml)、数字、二进制但最大不能超过512M。
字符串内部编码有3种:
- int:8个字节的长整型;
- embstr:小于等于39个字节的字符串;
- raw:大于39个字节的字符串。
命令:
> set key value
编码模式:> object encoding key
应用场景:
- 分布式共享session:实现用户登录后的session在分布式环境下共享到不同服务器(域名下),每次用户更新或查询登录信息从redis中集中获取;
- 快速计数、查询缓存:使用 redis.incr(key);
- 缓存功能:典型的场景=> 数据存取于 redis与db之间;
- 限速功能:比如每次用户登录时让用户输入短信验证码,但是获取短信一般限制一分钟内不超过5次。类似可限制ip每秒内访问次数等等。
String key= phoneNum; isExists = redis.setNX(key,1,'EX 60','NX'); if(isExists!=null || redis.incr(key)<=5){ //send sms message }else{ //限速 }
2、hash
哈希类型是指redis key对应的值本身又是一个键值对结构的类型。
value={
{field,value},{field,value},{field,value}
}
命令操作:
>hset key field value
>hget key field
>hdel key field [field ...]
>hlen key
>hmget key field [field ...]
>hmset key field value [filed vlaue ...]
#某一field是否存在
>hexists key field
#获取hash某一key所有的 field
>hkeys key
#获取某一key所有的value
>hvals key
#获取所有的field-value
>hgetall key
哈希内部编码有2种:
- ziplist(压缩列表):元素个数小于hash-max-ziplist-entries配置(默认512)且所有值都小于hash-max-ziplist-value配置(默认64字节)时,会采用压缩列表作为内部实现,相比哈希表结构节省内存。
- hashtable(哈希表):非ziplist 时,采用哈希表内部实现,hashtable 读写复杂度O(1).
hash使用场景:
数据库关系表行信息映射为hash类型。
3、list 列表
list列表类型是用来存储多个有序的字符串。一个列表最多存储2的32次方-1个元素。
- set 集合
- zset 有序集合
- 稍等
附参考:《Redis开发与运维》