共计 7752 个字符,预计需要花费 20 分钟才能阅读完成。
前言
最近学习 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 key
3:del:删除 key,格局是 del key。小技巧:Del 命令不反对通配符,能够联合 linux 管道和 xargs 命令来自定义删除,示例如下:redis-cli keys k* | xargs redis-cli del
4:type:取得键值的数据类型,格局是 type key
5:rename:改名,格局是 rename oldKey newKey
6:renamenx:如果不存在则创立,格局是 rename oldKey newKey
7:randomkey:随机返回一个 key
String 类型的操作
Redis 的 String 类型能够是字符串、数字、或者是二进制数据(图片、音频、视频)等,然而值最大不能超过 512MB
对 String 类型的操作命令
1:get、set、del:获取 key 的值、设置 key 和值、删除 key
相似的 set 命令还有:setex,psetex,setnx
2: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 的 key
7:llen:获取元素个数,格局是 llen list 的 key
8: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 的 key
3:sismember:判断元素是否在汇合中,格局是 sismember set 的 key item 项的值
4:srem:删除元素,格局是 srem set 的 key item 项的值
5:scard:获取汇合中元素个数,格局是 scard set 的 key
6:srandmember:随机获取汇合中的元素,格局是 srandmember set 的 key [数量],数量为正的时候,会随机获取这么多个不反复的元素;如果数量大于汇合元素个数,返回全副;如果数量为负,会随机取得这么多个元素,可能有反复
7:spop:弹出元素,格局是 spop set 的 key
8:smove:挪动元素,格局是 smove 源 set 的 key 目标 set 的 key item 项的值
9:sdiff:差集,返回在第一个 set 外面而不在前面任何一个 set 外面的项,格局是 sdiff set 的 key 用来比拟的多个 set 的 key
10:sdiffstore:差集并保留后果,格局是命令 寄存后果的 set 的 key set 的 key 用来比拟的多个 set 的 key
11:sinter:交加,返回多个 set 外面都有的项,格局是 sinter 多个 set 的 key
12:sinterstore:交加并保留后果,格局是 sinter 寄存后果的 set 的 key 多个 set 的 key
13:sunion:并集,格局是 sunion 多个 set 的 key
14: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 的 Key
4:hget:获取值,格局是 hget Hash 的 Key 项的 key
5:hmget:同时获取多个值,格局是 hmget Hash 的 Key 项的 key,项的 key 能够是多个
6:hdel:删除某个项,格局是 hdel Hash 的 Key 项的 key
7:hlen:获取 Key 外面的键值对数量,格局是 hlen Hash 的 Key
8:hstrlen:返回指定 filed 对应的 value 的字符长度
9:hexists:判断键值是否存在,格局是 hexists Hash 的 Key 项的 key
10:hkeys:获取所有 Item 的 key,格局是 hkeys Hash 的 Key
11:hvals:获取所有 Item 的值,格局是 hvals Hash 的 Key
12:hincrby:增减整数数字,格局是 hincrby Hash 的 Key 项的 key 正负整数
13:hincrbyfloat:增减 Float 数值,格局是 hincrbyfloat Hash 的 Key 项的 key 正负 float
14: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 的 key
6:zincrby:增减元素的 Score,格局是 zincrby zset 的 key 正负数字 项的值
7:zcount:获取分数区间内元素个数,格局是 zcount zset 的 key 起始 score 终止 score
8:zrank:获取项在 zset 中的索引,格局是 zrank zset 的 key 项的值
9:zscore:获取元素的分数,格局是 zscore zset 的 key 项的值,返回项在 zset 中的 score
10: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 终止 score
19: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 过程的笔记记录下来,跟大家一起学习。