1.redis的入门及介绍
1.1 单节点安装
$ cd /usr/james
$ wget http://download.redis.io/releases/redis-4.0.6.tar.gz
$ tar xzf redis-4.0.6.tar.gz
$ cd redis-4.0.6
$ make
------> redis-4.0.6. 除了redis.conf在/redis-4.0.6下,其余都在/redis-4.0.6/src下
mkdir /usr/james/redis
cp redis-server /usr/james/redis
cp redis-benchmark /usr/james/redis
cp redis-check-rdb /usr/james/redis
cp redis-sentinel /usr/james/redis
cp redis-cli /usr/james/redis
cp redis.conf /usr/james/redis
------>可以在redis.conf中设置密码 requirepass shiquan1234
------>启动redis服务 在/usr/james/redis目录下 ./redis-server /usr/james/redis/redis.conf
------>连接redis 在/usr/james/redis目录下 ./redis-cli -h 127.0.0.1 -p 6379 -a shiquan1234
------>停止redis 在/usr/james/redis目录下 ./redis-cli -h 127.0.0.1 -p 6379 -a shiquan1234 shutdown
kill -9 不能持久化
1.2 redis简要介绍?
1.2.1 redis是什么?
redis安装在磁盘上,数据存储在内存中。
redis是一种基于键值对数据库,其中value可以为string,hash,list,set,zset等多种数据结构,
还提供了键过期,事务,发布订阅,流水线等功能。
1.2.2 redis有哪些特性?
速度快:1.数据存在内存中 2.c语言编写 3.单线程
持久化:数据可持久化到磁盘
主从复制:实现多个相同数据的redis副本
高可用和分布式:哨兵机制实现高可用,保证redis节点故障发现和自动转移
客户端语言多:java php python c c++
1.2.3 使用场景?
1.缓存:合理使用缓存加快数据访问速度,降低后端数据源压力
2.排行榜:按照热度排名,按照发布时间排行,主要用到列表和有序集合
3.计数器应用:视频网站播放数,网站浏览数,使用redis计数
4.社交网络:赞、踩、粉丝、下拉刷新
5.消息队列:发布和订阅
2.redis的api应用
2.1 redis的通讯模型?
执行命令:单线程执行,所有命令进入队列,按顺序执行,使用I/O多路复用解决I/O问题,后面有介绍(通过select/poll/epoll/kqueue这些I/O多路复用函数库,我们解决了一个线程处理多个连接的问题),如果某个命令执行慢会,会造成其它命令的阻塞。
2.2 string类型的value
1.字符串类型:实际上可以是字符串(包括XML JSON),还有数字(整形 浮点数),二进制(图片 音频 视频),最大不能超过512MB
2.设值指令
set age 23 ex 10 //10秒后过期
mset country china city beijing //批量设值
setnx name test //不存在name时,返回1设置成功;存在的话失败返回0
场景:如果有多客户同时执行setnx,只有一个能设置成功,可做分布式锁
3.获取命令
get age //存在返回value,不存在返回nil
mget country city address //返回china beigjin, address为nil //批量获取
4.计数
incr age
decr age
5.append追加指令:set name hello; append name world //追加后成helloworld
6.字符串长度:set hello “世界”;strlen hello//结果6,每个中文占3个字节
7.截取字符串:set name helloworld ; getrange name 2 4//返回 llo
2.3 hash
1.是一个string类型的field和value的映射表,hash特适合用于存储对象。
2.命令
设值:hset user:1 name james //成功返回1,失败返回0
取值:hget user:1 name //返回james
删值:hdel user:1 age //返回删除的个数
计算个数:hset user:1 name james; hset user:1 age 23;
hlen user:1 //返回2,user:1有两个属性值
批量设值:hmset user:2 name james age 23 sex boy //返回OK
批量取值:hmget user:2 name age sex //返回三行:james 23 boy
判断field是否存在:hexists user:2 name //若存在返回1,不存在返回0
获取所有field: hkeys user:2 // 返回name age sex三个field
获取user:2所有value:hvals user:2 // 返回james 23 boy
获取user:2所有field与value:hgetall user:2 //name age sex james 23 boy值
增加1:hincrby user:2 age 1 //age+1
hincrbyfloat user:2 age 2 //浮点型加2
2.4 list
1.命令列表
2.5 set
2.6 zset
2.7 全局命令
1.查看所有键:keys * set school enjoy set hello world
2.键总数 dbsize //2个键,如果存在大量键,线上禁止使用此指令
3.检查键是否存在:exists key //存在返回1,不存在返回0
4.删除键:del key //del hello school, 返回删除键个数,删除不存在键返回0
5.键过期:expire key seconds //set name test expire name 10 //10秒过期
ttl 查看剩余的过期时间
6.键的数据结构类型:type key //type hello //返回string,键不存在返回none
7.flushdb 清空redis数据库
3.redis实战(看视频教程)
4.redis的性能测试以及工具实战
4.1慢查询与原因分析
1.redis的命令生命周期:发送,排队,执行,返回
2.原因:当执行命令的时间超过阀值,会将发生时间、耗时、命令记录。
3. 慢查询阀值设置(两种方式):
动态设置:127.0.0.1:6379> config set slowlog-log-slower-than 10000 //10毫秒10000微秒
使用config set完后,若想将配置持久化保存到redis.conf,要执行config rewrite
redis.conf修改:找到slowlog-log-slower-than 10000 ,修改保存即可
注意:slowlog-log-slower-than =0记录所有命令 -1命令都不记录
对于线上slow-max-len配置的建议:线上可加大slow-max-len的值,记录慢查询存长命令时redis会做截断,不会占用大量内存,线上可设置1000以上
对于线上slowlog-log-slower-than配置的建议:默认为10毫秒,根据redis并发量来调整,对于高并发比建议为1毫秒
4.原理:慢查询记录也是存在队列里的,slow-max-len 存放的记录最大条数,比如设置的slow-max-len=10,当有第11条慢查询命令插入时,队列的第一条命令就会出列,第11条入列到慢查询队列中, 可以config set动态设置,也可以修改redis.conf完成配置。
5.慢查询命令:
获取队列里慢查询的命令:slowlog get 查询返回的结构如下
获取慢查询列表当前的长度:slowlog len //以上只有1条慢查询,返回1
对慢查询列表清理(重置):slowlog reset //再查slowlog len 此时返回0 清空
注意:1.慢查询只记录命令在redis的执行时间,不包括排队、网络传输时间
2.慢查询是先进先出的队列,访问日志记录出列丢失,需定期执行slow get,将结果存储到其它设备中(如mysql)
4.2 redis-cli详解
./redis-cli -r 3 -h 192.168.42.111 -a 12345678 ping //返回pong表示127.0.0.1:6379能通,r代表次数
./redis-cli -r 100 -i 1 info |grep used_memory_human //每秒输出内存使用量,输100次,i代表执行的时间间隔
4.3 redis-server详解
./redis-server ./redis.conf & //指定配置文件启动
./redis-server --test-memory 1024 //检测操作系统能否提供1G内存给redis, 常用于测试,想快速占满机器内存做极端条件的测试,可使用这个指令
4.4 redis-benchmark:基准性测试(详见视频)
4.5 Pipeline
Pipeline出现的背景:
redis客户端执行一条命令分4个过程:
发送命令-〉命令排队-〉命令执行-〉返回结果
这个过程称为Round trip time(简称RTT, 往返时间),mget mset有效节约了RTT,但大部分命令(如hgetall,并没有mhgetall)不支持批量操作,需要消耗N次RTT ,这个时候需要pipeline来解决这个问题
1.未使用pipeline执行N条命令
2.使用pipeline执行N条命令
3.使用pipeline和未使用pipeline的性能对比
小总结:使用pipeline执行速度比逐条执行要快,客户端与服务端的网络延迟越大,性能体现越明显
4.6 事务
刚大家知道,pipeline是多条命令的组合,为了保证它的原子性,redis提供了简单的事务,什么是事务?事务是指一组动作的执行,这一组动作要么成功,要么失败。
1.redis的简单事务,将一组需要一起执行的命令放到multi和exec两个命令之间,其中multi代表事务开始,exec代表事务结束,
注:在multi前set user:age 4 //初始化值
2.停止事务discard
3.命令错误,语法不正确,导致事务不能正常结束
4.运行错误,语法正确,但类型错误,事务可以正常结束
注意:可以看到redis不支持回滚功能