前言

最近学习Redis6.x,特做笔记以备忘,与大家共学。课程是从私塾在线下载的,他们把架构师课程都放进去了,大家能够去下载学习,不要钱的,地址是http://sishuok.com/freecourses.html?frombwr1,课程很不错,值得学习!要害是不要钱,嘻嘻!

Redis简介

Redis(REmote DIctionary Server 近程字典服务器)

Redis是一个应用C编写的、开源的、Key-Value型、基于内存运行并反对长久化的NoSQL数据库,是以后最热门的NoSql数据库之一

Redis的两种根本应用形式

一种就是当作数据库缓存来应用另外一种就是间接当作数据库来应用

Redis装置

1:去官网下载最新的版本:http://redis.io/download ,这里用的是6.0.8

2:解压后,进入解压好的文件夹

3:redis的装置非常简单,因为曾经有现成的Makefile文件,所以间接先make,而后make install就能够了

留神:编译装置须要gcc5.3以上

4:装置的地位默认在/usr/local/bin ,有:

(1)redis-benchmark:性能测试工具,测试Redis在你的零碎及配置下的读写性能 (2)redis-check-aof:用于修复出问题的AOF(3)redis-check-rdb:用于修复出问题的rdb文件 (4)redis-cli:Redis命令行操作工具(5)redis-sentinel:Redis集群的管理工具 (6)redis-server:Redis服务器启动程序 

5:启动Redis的时候,只有一个参数,就是指定配置文件redis.conf的门路。redis.conf在解压的文件夹外面有,复制一个进去,按需批改即可,也可--port来指定端口

根本的批改如下几个参数:#daemonize no 改为yes,开启后盾运行,默认是前台运行daemonize yes#把这一行正文,监听所有IP#bind 127.0.0.1 #protected-mode yes 如果改为no,则是敞开保护模式,这种模式下不能配置零碎服务,倡议还是开启protected-mode yes#批改本参数,指定数据目录dir /mydata/redis6/data#批改本参数,指定日志目录logfile /mydata/redis6/redis_6379.log

6:连贯Redis并操作,应用redis-cli,如果有多个实例,能够redis-cli -h 服务器ip -p 端口 -u 用户 -a明码

7:敞开Redis,redis-cli shutdown,如果有多个实例,能够指定端口来敞开:redis-cli -p 6379 shutdown

Redis基础知识

单线程模型

Redis的服务器程序采纳的是单线程模型来解决客户端的申请。对读写等事件的响应是通过对epoll函数的包装来做到的。

Redis的理论处理速度齐全依附主过程的执行效率,如果同时有多个客户端并发拜访服务器,则服务器解决能力在肯定状况下将会降落。如果你要晋升服务器的并发能力,那么能够采纳在单台机器部署多个redis过程的形式。

I/O多线程

Redis6开始反对I/O多线程。

目前Redis次要的性能瓶颈之一,就在于I/O数据的读写性能。 Redis6引入的“多线程”机制就是对于该瓶颈的优化。

外围思路是,将主线程的 I/O 读写工作拆分进去给一组独立的线程执行,使得多个 socket 的读写能够并行化。

多数据库

1:Redis每个数据库对外都是以从0开始递增的数字来命名,默认16个数据库,默认应用0号数据库,能够应用Select 数字 来抉择要应用的数据库

2:应用Dbsize能够查看以后数据库的key的数量

3:能够在多个数据库间挪动数据,应用move key 目标数据库编号 就能够了

4:应用flushdb能够革除某个数据库的数据

5:Redis不反对自定义数据库名字

6:Redis不反对为每个数据库设置不同的拜访明码

7:多个数据库之间并不是齐全独立的,FlushAll能够清空全副的数据

8:Redis的数据库更像是一个命名空间

Redis的key

Redis的key是字符串类型,如果两头有空格或者转义字符等,要用“”。

1:命名倡议:对象类型:对象ID:对象属性 2:多个单词之间以“.”来分隔3:Key的命名,应该在可读的状况下,尽量简短

Redis的Value反对五种类型

1:String:字符串,能够存储String、Integer、Float型的数据,甚至是二进制数据,一个字符串最大容量是512M

2:List:字符串List,底层实现上不是数组,而是链表,也就是说在头部和尾部插入一个新元素,其工夫复杂度是常数级别的;其弊病是:元素定位比数组慢

3:Set:字符串Set,无序不可反复,是通过HashTable实现的

4:Hash:按Hash形式来寄存字符串

5:ZSet:字符串Set,有序且不可反复,依据Score来排序。底层应用散列表和跳跃表来实现,所以读取两头局部数据也很快

对Key的操作命令

1:Keys:取得合乎规定的键名列表格局是keys pattern,pattern反对glob格调通配符格局:(1)? 匹配一个字符(2)*  匹配任意个字符(3)[] 匹配中括号内的任一字符,能够用-来示意一个范畴(4)\x 匹配字符x,用于本义符号2:exists:判断键值是否存在,格局是exists key3:del:删除key,格局是del key。    小技巧:Del命令不反对通配符,能够联合linux管道和xargs命令来自定义删除,示例如下:redis-cli  keys k* | xargs redis-cli del4:type:取得键值的数据类型,格局是type key5:rename:改名,格局是rename oldKey newKey6:renamenx:如果不存在则创立,格局是rename oldKey newKey7:randomkey:随机返回一个key

String类型的操作

Redis的String类型能够是字符串、数字、或者是二进制数据(图片、音频、视频)等,然而值最大不能超过512MB

对String类型的操作命令

1:get、set、del:获取key的值、设置key和值、删除key相似的set命令还有:setex,psetex,setnx2:incr、decr:递增和递加整数值,格局是incr key值3:incrby、decrby:递增和递加整数值,可指定增减的数值,格局是incrby key值 正负数值4:incrbyfloat:递增和递加浮点数值,格局是incrbyfloat key值 正负数值5:append:在尾部追加值,格局是append key值 追加的值6:getrange:获取指定索引范畴内的值,格局是getrange key值 起始索引 完结索引7:setrange:从索引地位开始设置前面的值,格局是setrange key值 offset索引 值8:strlen:返回键值的长度,格局是strlen key值9:mget:同时取得多个键的值,格局是mget  多个key值10:mset:同时设置多个键值对,格局是mset  key值 value , key和value能够多对11:bitcount:获取范畴内为1的二进制位数,格局是bitcount key值 [start end]12:getbit:获取指定地位的二进制位的值,格局是getbit key值 offset索引13:setbit:设置指定地位的二进制位的值,格局是setbit key值 offset索引 值14:bitop:对多个二进制值进行位操作,格局是bitop 操作 目标key key值1 key值2,操作有and、or、xor、not,key值能够是多个15:getset:原子的设置key的值,并返回key的旧值 ,格局是getset key value

对List类型的操作命令

1:lpush/rpush:增加值,格局是 rpush list的key item项的值,值能够是多个2:lpushx/rpushx:只有当list存在时才会从左/左边顺次追加元素3:linsert:插入元素,格局是linsert list的key before|after 定位查找的值 增加的值4:lrange:按索引范畴获取值,格局是 lrange list的key 起始索引 终止索引,-1示意最初一个索引5:lindex:获取指定索引的值,格局是 lindex list的key 索引号6:lpop/rpop:弹出值,格局是 lpop list的key7:llen:获取元素个数,格局是llen list的key8:lrem:删除元素,格局是lrem list的key 数量 item项的值,数量可正负,示意从左或右删除,如果数量为0,示意删除全副与给定值相等的项9:ltrim:保留指定索引区间的元素,格局是ltrim list的key 起始索引 完结索引10:blpop/brpop:弹出值,格局是blpop list的key值 过期工夫,key能够是多个,如果没有值,会一值期待有值,直到过期11:rpoplpush:将元素从一个列表转移到另外一个列表,格局是rpoplpush 源list的key值 目标list的key值12:brpoplpush:将元素从一个列表转移到另外一个列表,格局是brpoplpush 源list的key值 目标list的key值 过期工夫13:lset:设置指定索引的值,格局是lset list的key 索引 新的值

对Set类型的操作命令

1:sadd:增加元素,格局是 sadd set的key item项的值,item项能够多个2:smembers:获取汇合中所有元素,格局是 smembers set的key3:sismember:判断元素是否在汇合中,格局是 sismember set的key item项的值4:srem:删除元素,格局是 srem set的key item项的值5:scard:获取汇合中元素个数,格局是scard set的key6:srandmember:随机获取汇合中的元素,格局是srandmember set的key [数量],数量为正的时候,会随机获取这么多个不反复的元素;如果数量大于汇合元素个数,返回全副;如果数量为负,会随机取得这么多个元素,可能有反复7:spop:弹出元素,格局是spop set的key8:smove:挪动元素,格局是smove 源set的key 目标set的key item项的值9:sdiff:差集,返回在第一个set外面而不在前面任何一个set外面的项,格局是sdiff set的key 用来比拟的多个set的key10:sdiffstore:差集并保留后果,格局是命令 寄存后果的set的key set的key 用来比拟的多个set的key11:sinter:交加,返回多个set外面都有的项,格局是sinter 多个set的key12:sinterstore:交加并保留后果,格局是sinter 寄存后果的set的key 多个set的key13:sunion:并集,格局是sunion 多个set的key14:sunionstore:并集并保留后果,格局是sunionstore 寄存后果的set的key 多个set的key

对Hash类型的操作命令

1:hset:设置值,格局是hset Hash的Key 项的key 项的值2:hmset:同时设置多对值,格局是hmset Hash的Key 项的key 项的值,项的key和值可多对3:hgetall:获取该Key下所有的值,格局是hgetall Hash的Key4:hget:获取值,格局是hget Hash的Key 项的key 5:hmget:同时获取多个值,格局是hmget Hash的Key 项的key,项的key能够是多个 6:hdel:删除某个项,格局是hdel Hash的Key 项的key7:hlen:获取Key外面的键值对数量,格局是hlen Hash的Key8:hstrlen:返回指定filed对应的value的字符长度9:hexists:判断键值是否存在,格局是hexists Hash的Key 项的key10:hkeys:获取所有Item的key,格局是hkeys Hash的Key11:hvals:获取所有Item的值,格局是hvals Hash的Key12:hincrby:增减整数数字,格局是hincrby Hash的Key 项的key 正负整数13:hincrbyfloat:增减Float数值,格局是hincrbyfloat Hash的Key 项的key 正负float14:hsetnx:如果项不存在则赋值,存在时什么都不做,格局是hsetnx Hash的Key 项的key 项的值

ZSet类型的操作

ZSet和Set一样是string类型元素的汇合,且不容许反复。不同的是,ZSet中每个元素都会关联一个double类型的分数,并依照分数来为汇合中的成员进行从小到大的排序

对ZSet类型的操作命令

1:zadd:增加元素,格局是zadd zset的key score值 项的值,Score和项能够是多对,score能够是整数,也能够是浮点数,还能够是+inf示意正无穷大,-inf示意负无穷大2:zrange:获取索引区间内的元素,格局是zrange zset的key 起始索引 终止索引 (withscores)3:zrangebyscore:获取分数区间内的元素,格局是zrangebyscore zset的key 起始score 终止score (withscores),默认是蕴含端点值的,如果加上“(”示意不蕴含;前面还能够加上limit来限度4:zrem:删除元素,格局是zrem zset的key 项的值,项的值能够是多个5:zcard:获取汇合中元素个数,格局是zcard zset的key6:zincrby:增减元素的Score,格局是zincrby zset的key  正负数字 项的值7:zcount:获取分数区间内元素个数,格局是zcount zset的key 起始score 终止score8:zrank:获取项在zset中的索引,格局是zrank zset的key 项的值9:zscore:获取元素的分数,格局是zscore zset的key 项的值,返回项在zset中的score10:zrevrank:获取项在zset中倒序的索引,格局是zrevrank zset的key 项的值11:zrevrange:获取索引区间内的元素,格局是zrevrange zset的key 起始索引 终止索引 (withscores)12:zrevrangebyscore:获取分数区间内的元素,格局是zrevrangebyscore zset的key 终止score 起始score (withscores)13:zpopmax:从汇合中弹出分数最高的成员,返回该成员和分值,而后从汇合中将其移出14:zpopmin:从汇合中弹出分数最低的成员,返回该成员和分值,而后从汇合中将其移出15:bzpopmax:在参数中的所有汇合均为空的状况下,阻塞连贯。参数中蕴含多个有序汇合时,依照参数中key的程序,返回第一个非空key中分数最大的成员和对应的分数。参数 timeout 能够了解为客户端被阻塞的最大秒数值,0 示意永恒阻塞。16:bzpopmin:在参数中的所有汇合均为空的状况下,阻塞连贯。参数中蕴含多个有序汇合时,依照参数中key的程序,返回第一个非空key中分数最小的成员和对应的分数。参数 timeout 能够了解为客户端被阻塞的最大秒数值,0 示意永恒阻塞。17:zremrangebyrank:删除索引区间内的元素,格局是zremrangebyrank  zset的key 起始索引 终止索引18:zremrangebyscore:删除分数区间内的元素,格局是命令  zset的key 起始score 终止score19:zinterstore:交加,格局是ZINTERSTORE dest-key key-count key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]20:zunionstore:并集,格局是ZUNIONSTORE dest-key key-count key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

排序的操作

1:sort:能够对List、Set、ZSet外面的值进行排序。格局是SORT source-key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE dest-key]

2:by:设置排序的参考键,能够是字符串类型或者是Hash类型外面的某个Item键,格局是 Hash键名:->Item键。设置了by参考键,sort将不再根据元素的值来排序,而是对每个元素,应用元素的值替换参考键中的第一个””,而后获取相应的值,再对取得的值进行排序。如果参考键不存在,默认为0。

如果参考键值一样,再以元素自身的值进行排序。

3:get:指定sort命令返回后果蕴含的键的值,形如: Hash键名:*->Item键,能够指定多个get,返回的时候,一行一个。如果要返回元素的值,用get #。

4:对较大数据量进行排序会重大影响性能,应用倡议:

(1)尽量减少待排序汇合中的数据

(2)应用limit来限度获取的数据量

(3)如果要排序的数据量较大,能够思考应用Store参数来缓存后果

解决过期keys的机制

1:定期删除:Redis会在后盾,默认每秒10次的执行如下操作: 随机选取100个key校验是否过期,如果有25个以上的key过期了,立即额定随机选取下100个key(不计算在10次之内)。也就是说,如果过期的key不多,Redis最多每秒回收200条左右,如果有超过25%的key过期了,它就会做得更多,这样即便从不被拜访的数据,过期了也会被删除掉

2:惰性删除:当client被动拜访key时,会先对key进行超时判断,过期的key会立即删除

解决过期keys的命令

1:expire:设置过期工夫,格局是expire key值 秒数2:expireat:设置过期工夫,格局是expireat key值 到秒的工夫戳3:ttl:查看还有多少秒过期,格局是ttl key值,-1示意永不过期,-2示意已过期4:persist:设置成永不过期,格局是persist key值,删除key的过期设置;另外应用set或者getset命令为键赋值的时候,也会革除键的过期工夫5:pttl:查看还有多少毫秒过期,格局是pttl key值6:pexpire:设置过期工夫,格局是pexpire key值 毫秒数7:pexpireat:设置过期工夫,格局是pexpireat key值 到毫秒的工夫戳

后记

我会继续的把我学习Redis6.x过程的笔记记录下来,跟大家一起学习。