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



