1. 单进程
- 单进程模型来处理客户端的请求。对读写等事件的响应是通过对epoll函数的包装来做到的。Redis的实际处理速度完全依靠主进程的执行效率;
- epoll是Linux内核为处理大批量文件描述符而作了改进的epoll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率;
2. redis数据库的一些概念及操作
- 默认16个数据库,类似数组下表从零开始,初始默认使用零号库;
- 统一密码管理,16个库都是同样密码,要么都OK要么一个也连接不上,redis默认端口是
6379
;- select命令切换数据库:
select 0-15
;dbsize
:查看当前数据库的key的数量;flushdb
:清空当前库;flushall
;通杀全部库;
Redis数据类型
-
redis的五大数据类型
1. string(字符串)
- string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value;
- string类型是二进制安全的。意思是redis的string可以包含任何数据。如jpg图片或者序列化的对象 ;
- string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M;
2. list(列表)
redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。它的底层实际是个链表。
3. set(集合)
redis的set是string类型的无序集合。它是通过HashTable实现的。
4. hash(哈希,类似java里的Map)
- redis的hash 是一个键值对集合;
- redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象;
- 类似Java里面的Map<String,Object>;
5. zset(sorted set:有序集合)
- redis的zset 和 set 一样也是string类型元素的集合,且不允许重复的成员;
- 不同的是每个元素都会关联一个double类型的分数;
- redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复;
常见数据类型操作命令参考网址
(大)Redis 命令参考 — Redis 命令参考
redis常用命令
keys *
:查看所有key;exists key 的名字
:判断某个key是否存在;move key dbID(0-15)
: 当前库就没有了,被移除了;expire key 秒钟
: 为给定的key设置过期时间;ttl key
: 查看还有多少秒过期,-1表示永不过期,-2表示已过期;type key
: 查看你的key是什么类型;config get maxmemory: 获取redis的内存配置情况
confog set maxmemory 1: 设置redis的内存 单位是字节
redis 字符串(String) --(常用命令介绍)
set
/get
/del
/append
/strlen
;Incr
/decr
/incrby
/decrby
:一定要是数字才能进行加减;(对数字进行加减,直接跟上key就好,默认加1)getrange
/setrange
:
getrange
:获取指定区间范围内的值,类似between and的关系从零到负一表示全部;setrange
:设置指定区间范围内的值,格式是setrange key 位置值 具体值
;
setex(set with expire) 键 秒值 值
/setnx(set if not exist) 键
- setex:设置带过期时间的key,动态设置 :
setex 键 秒值 真实值
- setnx:只有在 key 不存在时设置 key 的值:
setnx 键 值
mset/mget/msetnx
- mset:同时设置一个或多个 key-value 对。
- mget:获取所有(一个或多个)给定 key 的值。
- msetnx:同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在(如果存在key,则都不会操作,因为msetnx是原子性型操作)。
getset
:将给定 key 的值设为 value ,并返回 key 的旧值(old value)。简单一句话,先get然后立即set。(先获取原来存在key的值,再将这个新的值设置到这个key中)
redis 列表(List) --(常用命令介绍)
lpush
/rpush
/lrange
;lpop
/rpop
,移除列表key的头/尾元素;lindex
,按照索引下标获得元素(从上到下)(格式:lindex key index
);llen
:返回列表 key 的长度(格式:llen key
);lerm
:根据参数 count 的值,移除列表中与参数 value 相等的元素(格式:lerm key count value
);
- count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
- count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
- count = 0 : 移除表中所有与 value 相等的值。
ltrim
,截取指定范围的值后再赋值给key(格式:ltrim key start stop
);rpoplpush
,移除列表的最后一个元素,并将该元素添加到另一个列表头部并返回(格式:rpoplpush source—key destination—key
);lset
,将列表 key 下标为 index 的元素的值设置为 value(格式:lset key index value
);linsert
,(格式:linsert key before|after pivot value)将值 value 插入到列表 key 当中,位于值 pivot 之前或之后;
- 当 pivot 不存在于列表 key 时,不执行任何操作。
- 当 key 不存在时, key 被视为空列表,不执行任何操作。
- 如果 key 不是列表类型,返回一个错误。
性能总结
它是一个字符串链表,left、right都可以插入添加;
- 如果键不存在,创建新的链表;
- 如果键已存在,新增内容;
- 如果值全移除,对应的键也就消失了。
- 链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。
redis 集合(Set) --(常用命令介绍)
sadd
/smembers
/sismember
,格式:
sadd key member [member ...]
smembers key
sismember key member
scard
:获取集合里面的元素个数(格式:scard key
);srem
:删除集合中元素(格式:srem key member [member ...]
);srandmember
,(格式:srandmember key [count]
)(不会修改set集合)
- 如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素;
- 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合;
- 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值;
spop
,移除并返回集合中的一个随机元素(格式:spop key
);smove
,(格式:smove source destination member
)将 member 元素从 source 集合移动到 destination 集合;(这个新的集合不存在就会新创建)
数学集合类
- 差集:
sdiff
(格式:sdiff key [key ...]
)(这里的数值只能一个一个的添加,要不然不会出现效果)- 交集:
sinter
(格式:sinter key [key ...]
)- 并集:
sunion
(格式:sunion key [key ...]
)
redis 哈希(Hash) --(常用命令介绍)
hset
/hget
/hmset
/hmget
/hgetall
/hdel
,格式:
hset key field value
:将哈希表 key 中的域 field 的值设为 value ;hget key field
:返回哈希表 key 中给定域 field 的值;hmset key field value [field value ...]
:同时将多个 field-value (域-值)对设置到哈希表 key 中;hmget key field [field ...]
:返回哈希表 key 中,一个或多个给定域的值;hgetall key
:返回哈希表 key 中,所有的域和值;hdel key field [field ...]
:删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略;
hlen
,返回哈希表 key 中域的数量(格式:hlen key
);hexists
,查看哈希表 key 中,给定域 field 是否存在(格式:hexists key field
);hkeys
/hvals
,格式:
hkeys key
:返回哈希表 key 中的所有域;hvals key
:返回哈希表 key 中所有域的值;
hincrby
/hincrbyfloat
,格式:
hincrby key field increment
:为哈希表 key 中的域 field 的值加上增量 increment;hincrbyfloat key field increment
:为哈希表 key 中的域 field 加上浮点数增量 increment ;
hsetnx
,将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在(格式:hsetnx key field value
)
redis 有序集合Zset(sorted set) --(常用命令介绍)
zadd
/zrange
,格式:
zadd key score member [[score member] [score member] ...]
:将一个或多个 member 元素及其 score 值加入到有序集 key 当中;zrange key start stop [WITHSCORES]
:返回有序集 key 中,指定区间内的成员,其中成员的位置按 score 值递增(从小到大)来排列;
zrangebyscore
:(格式:zrangebuscore key min max [WITHSCORES] [LIMIT offset count]
),返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员;zrem
:移除有序集 key 中的一个或多个成员,不存在的成员将被忽略(格式:zrem key member [member ...]
);zcard
/zcount
/zrank
/zscore
,格式:
zcard key
:返回有序集 key 的基数;zcount key min max
:返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量;zrank key member
:返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列,排名以 0 为底,也就是说, score 值最小的成员排名为 0 ;zscore key member
:返回有序集 key 中,成员 member 的 score 值;
zrevrank
:返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序,排名以 0 为底,也就是说, score 值最大的成员排名为 0 (格式:zrevrank key member
);zrevrange
:返回有序集 key 中,指定区间内的成员,其中成员的位置按 score 值递减(从大到小)来排列(格式:zrevrange key start stop [WITHSCORES]
);zrevrangebyscore
:返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列(格式:zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]
);
总结:
- redis是一个当进程的非关系型数据库,但是底层是用的是多路复用的io操作
- redis是有5种数据结构分别为:string、list、hash、set、zset、BigMap、HyperLogLog、ego
- 以上是redis5种数据结构常用的命令,多用就会才能记住。