Redis(上)
前言
Redis是基于内存的开源的key-value存储系统,本文主要介绍有关Redis的基本概念以及数据类型,在大数据之Redis(下)中介绍Redis事务、持久化、主从复制、哨兵机制以及集群的概念。
一、Redis为什么快
(1)Redis是单线程的;
(2)Redis是基于内存的;
(3)Redis采用多路IO复用技术
BIO:一个连接对应一个线程,一个线程会连接一个IO请求,如果请求数>线程数,那么多余的请求进行等待;
多路IO复用是只有一个线程负责IO调度,来了一个请求,线程连接一个IO请求,处理完了返回结果。但是因为只有一个线程,线程返回的时候不知道是谁发的请求,所以加了一个Mapping(映射关系),这里记录着请求的来源信息。一旦一个请求没有处理完,又来了新的请求,新来的等待。所以多路IO复用只适合数据请求少,数据写入不频繁的场景。
与此同时,消息完成返回的时候,通过Mapping向一开始的socket进行轮询来找到谁是刚刚消息的发送者。但是如果有100个socket就会轮询100遍,但是真正发数据的可能只有1,2个,浪费性能。所以出现了新的函数epoll方法,不是轮询所有的,只记录有几个发数据的,轮询发送数据的就可以;
二、BIO、NIO、AIO
BIO:一次连接一个线程,但是可能不发数据,这样就会占用线程资源
NIO:一次请求一个线程(数据请求)
AIO:一次有效请求一个线程,即发送了大量的数据,但是都不是我想要的,也不会给线程资源。
三、Redis数据类型
Redis有5中常用的数据类型:String、List、Set、Hash、Zset。
3.1 key
(1)查询当前库的所有键 keys *
(2)判断某一个键是否存在 exists <key>
(3)删除某一个键 del <key>
(4)查看键的类型 type <key>
(5)设置键过期时间 expire <key> <seconds>
(6)查看还有多少秒过期 TTL <key> ,-1表示永不过期,-2表示已过期
(7)查看当前数据库key的数量 dbsize
(8)清空当前库 flushdb
(9)通杀所有库 flushall
3.2 String
(1)数据库中放入数据 set <key> <value> 添加键值对
(2)查询对应键值 get <key>
(3)在指定键值后面追加指定的值 append <key> <value>
(4)获得值的长度 strlen <key>
(5)在key不存在时设置key的值(类似于set),如果key存在什么都不做,而set会覆盖掉原来的值;
(6)将key对应的值+1 或者 -1 ;incr / decr <key> ,如果为空(key不存在),新增值为1/-1;注意只能对数字值操作。
(7)将 key 中储存的数字值增减。自定义步长;
incrby / decrby <key> <步长>
(8)同时设置一个或多个 key-value对;
mset <key1> <value1> <key2> <value2> …
(9)同时获取一个或多个 value
mget <key1> <key2> <key3> …
(10)同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
msetnx <key1> <value1> <key2> <value2> …
(11)获得值的范围,类似java中的substring
getrange <key> <起始位置> <结束位置>
getrange k1 0 , -1表示取出所有的字符串,换成-2就是取到倒数第二个字符串;
(12)用 <value> 覆写<key> 所储存的字符串值,从<起始位置>开始。
setrange <key> <起始位置> <value>
(13)设置键值的同时,设置过期时间,单位秒。
setex <key> <过期时间> <value>
(14)以新换旧,设置了新值同时获得旧值
getset <key> <value>
3.3 List
3.3.1 Redis List的特点
(1)单键多值
(2)Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
(3)它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
3.3.2 相关操作
(1)从左边/右边插入一个或多个值。
lpush/rpush <key> <value1> <value2> <value3> …
例如:lpush k1 v1 v2 v3 v4
列表的顺序:v4 v3 v2 v1因为是左侧插入
Rpush v5 v6 v7
列表的顺序:v4 v3 v2 v1 v5 v6 v7
(2)从左边/右边吐出一个值。值在键在,值亡键亡。
lpop/rpop <key>
(3)从<key1>列表右边吐出一个值,插到<key2>列表左边。
rpoplpush <key1> <key2>
(4)按照索引下标获得元素(从左到右)
lrange <key> <start> <stop>
lindex <key> <index>
(5)获得列表长度
llen <key>
(6)在<value>的前面插入<newvalue>
linsert <key> before <value> <newvalue>
(7)从左边删除n个value(从左到右)
lrem <key> <n> <value>
3.4 Set
set可以自动去重,是无序的,并且还提供了判断某一个元素在不在一个set集合内的接口;
(1)将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
sadd <key> <value1> <value2> …
(2)取出该集合的所有值。
smembers <key>
(3)判断集合<key>是否为含有该<value>值,有返回1,没有返回0。如果输入的key不存在也返回0.
sismember <key> <value>
3.5 Hash
3.5.1 数据结构
仍然存储的是key-value的形式,但是value里面类似于一个map,即还是一个key-value的形式。
3.5.2 相关操作
(1)给<key>集合中的 <field>键赋值<value>
hset <key> <field> <value>
(2)从<key1>集合<field> 取出 value
hget <key1> <field>
(3)批量设置hash的值
hmset <key1> <field1> <value1> <field2> <value2>…
(4)查看哈希表 key 中,给定域 field 是否存在。
hexists key <field>
(5)列出该hash集合的所有field
hkeys <key>
(6)将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .
hsetnx <key> <field> <value>
(7)为哈希表 key 中的域 field(只能是数值)的值加上增量 increment
hincrby <key> <field> <increment>
3.6 Zset
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。与此同时zset是有序的。但是他这个有序不是排序,而是在输入数据的时候对每一个数据增加一个评分,根据评分来排序。
总结
本文主要介绍了有关Redis的基本概念以及数据类型,在大数据之Redis(下)中主要介绍Redis事务、持久化、主从复制、哨兵机制以及集群的概念,如果有不足之处或者表述不当的地方欢迎大家指正。