redis使用详解

一.redis简介

redis是开源的BSD许可的高级key/valu存储系统,用于存储String,list,hash,set,zset,常用来提供数据结构服务。

redis与memcached比较
1.redis可以用来做存储storage,memcached只用来做缓存cache,主要redis有持久化功能。
2.数据结构存储:memcached只能存储一种数据结构字符串,redis可以存储字符串,哈希结构,链表,集合,有序集合。

redis bin目录文件
redis-benchmark性能测试工具 
redis-check-aof检查aof日志 
redis-check-dump检查rdb日志
redis-cli连接用客户端
redis-server服务进程

二.redis通用key操作

redis的三个通配符:*通配任意字符,?通配单个字符,[]通配括号内的某个字符

randomkey // 返回随机key。
type key // 返回key存储的值的类型。
exists key // 判断key是否存在。
del key1 key2 ... keyN // 删除一个或者多个key。
rename  key newkey // 重命名key
renamenx key newkey // newkey不存在更新为newKey,newkey存在不做更改。
move key db // db指redis数据库序号,redis默认数据库为16,从0.1...15。
ttl key // 返回key的生命周期(秒数),对于不存在的key,已经过期的key,永久不过期的key都返回-1.redis2.8中,对于不存在的key返回-2。
pttl key  // 以毫秒返回key生命周期。
expire key 整型值 // 设置key的生命周期,以秒为单位。
pexpire key 豪秒数 // 设置以毫秒为生命周期。
persist key // 指定key为永久有效。

三.redis五大数据结构的操作命令不再赘述

位图法统计登录用户
setbit key 100000000 0  // 初始化100000000 位数字(用户数量)为0二进制串
setbit key userId1 1  setbit key userId2 1 ...... setbit key userIdN 1 // 用户登录,置userId位数值为1
bitop and  destKey 周1......周日   // 连续一周登录的用户
bitop or destKey 周1......周日   // 一周内登录过的用户  
bitcount destKey  // 统计destKey 中1的个数

四.redis事务及锁的应用

redis支持简单的事务(不支持回滚)
redis与mysql事务对比
redis使用详解_第1张图片
如果成功执行了前2条sql,第3条失败,rollback后前2条sql执行影响消失,discard只是结束本次事务,未执行exec前可以discard取消,已执行exec,前两条sql造成的影响还在,discard无效。

Multi后面的语句中,语句出错可能有两种情况:
1.语法错误,exec是报错,所有语句得不到执行。
2.语法本身没错,适用对象有问题,zadd操作list对象,exec之后会执行正确的语句跳过不正确的语句。

使用redis乐观锁机制订票下单
Watch指令监控key值(多个也可以)是否发生变化,变化不可操作 / unwatch取消监视key
Set ticket 1
Watch ticket
multi  #开启redis事务
Decr ticket #票数减1
Decrby lisi 100 #扣除金额
Exec     #exec执行前ticket值变动,所有操作失败。

五.redis消息发布与订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
redis使用详解_第2张图片
publish channel message // 发布消息
subscribe channel // 订阅频道(先开启订阅功能,才能接收到消息)
psubscribe  // 订阅一个或多个符合给定模式的频道。以*作为匹配符, it*以it开头的有频道。

当有新消息通过 publish命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:redis使用详解_第3张图片

六.rdb快照持久化

rdb工作原理:每隔N分钟或N次写操作,从内存dump出rdb文件压缩放在备份目录( 其中N,压缩,目录可配)。

Rdb快照相关参数
Save 900 1刷新快照到硬盘,满足900秒之后必须一个关键字发生变化
Save 300 10 300秒之后至少10个关键字发生变化
Save 60 10000 60秒之后10000个关键字发生变化 (上述3项屏蔽,rdb快照被禁用)
stop-writes-on-bgsave-error yes 后台rdb导出出错client停止写操作
rdbcompression yes 对导出文件是否进行压缩
rdbchecksum yes 存储和加载rdb文件时校验
rbfilename dump.rdb 设置rdb文件名
dir ./设置工作目录,rdb文件会写入该目录

redis新老版本比较
老版本采用单进程模式:redis-server接收客户端请求处理,还要进行rdb导出操作,在rdb导出时间段,不会处理客户端请求(防止rdb与内存数据不一致)。
新版本开启子进程进行rdb导出快照,服务进程仍能接收处理客户端的写操作,如果子进程导出rdb快照时出错了,停止服务进程的写入操作。

rdb缺陷:--------|-------------|---------------------------------------------
|代表保存点,在两个保存点之间断电或服务器宕机,将会丢失1-N分钟的数据。
优势:导出整个镜像,恢复速度相当快。

七.AOF持久化

AOF参数配置:
appendonly no #是否打开aof日志功能。
appendfsync always #每一个命令,都立即同步到aof,安全速度慢。
appendfsync everysec #折衷方案,每秒写一次
appendfsync no #写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof,同步频率低,速度快
no-appendfsync-on-rewrite yes #正在导出rdb快照的过程中,要不要停止同步aof(yes情况下,不会丢失clent写日志,待rdb结束同一同步到aof文件中)
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时重写
auto-aof-rewrite-min-size 64m #aof文件至少超过64m时重写

aof重写:把内存中的数据逆化成命令,写入到aof日志里,以解决aof日志过大的问题。
1.如 set age 0 经过Incr age ......... incr age 最终age=100,逆化成set age 100,此过程叫aof重写(使用到的参数Auto-aof-rewrite-percentage,Auto-aof-rewrite-min-size配置)。
2.手动重写指令:bgrewriteaof。

rdb与aof比较
rdb和aof都存在,优先使用aof来恢复数据。
rdb比aof恢复速度快,因为其是数据的内存映射,直接载入到内存,但丢失时间段数据。而aof是命令,需要逐条执行redis服务器端命令,丢失数据一秒之内,拖慢请求速度(AOF写磁盘)。

问题思考:rdb有内容,开启aof选项,重启redis,产生了一个aof空文件,aof,rdb都存在优先使用aof,所以以空文件来恢复,所以内存恢复数据时为nil。

八.redis主从复制

集群作用
①主从备份, 防止主机宕机   
②读写分离,分担master的任务 
③任务分离,如从服务分担备份与计算工作
redis使用详解_第4张图片

主从通信原理
slave启动后向master自动发起sync同步请求,master则dump出rdb给slave,与此同时master客户端处理的写操作会缓存在内存里的aof队列中,slave再同步缓冲队列中的写命令。
redis使用详解_第5张图片

主从(伪集群)配置方案(6379,6380,6381)
创建两个redis6380.conf和redis6381.conf从服务器配置文件分别修改:
slave 6380从服务器配置
pidfile /var/run/redis6380.conf
port 6380
dbfilename dump6380.rdb  #6380服务器开启rdb快照持久化
slaveof localhost 6379
slave-read-only yes
appendonly no 禁用aof日志持久化
masterauth passwd(passwd主服务器设置的密码)

slave 6381从服务器配置
pidfile /var/run/redis6381.conf
port 6381
#save 900 1
#save 300 10
#save 60 3000 禁用rdb
appendonly no 禁用aof日志持久化
slaveof localhost 6379
slave-read-only yes
masterauth passwd(passwd主服务器设置的密码)

master主服务器配置
#save 900 1
#save 300 10
#save 60 3000 禁用rdb
appendonly yes 开启aof日志持久化
Requirepass passwd 开启密码验证(slave连接需要密码, 必须设置masterauth passwd)

主从缺陷:slave断开master(主动断开,网络故障)再连接master,都要master全部dump出来rdb再aof,即同步的过程都要重新执行一遍。所以要记住多台slave不要一下启动起来,否则master可能io剧增。

九.redis运维常用命令

time #查询时间戳和微秒数
dbsize #查看当前库中的key数量
bgrewriteaof #后台进程重写aof
bgsave #后台保存rdb快照(BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。客户端可以通过 LASTSAVE 命令查看相关信息,判断 BGSAVE 命令是否执行成功。)
save #保存rdb快照(执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘)
lastsave #上次保存时间
slaveof  #设为slave服务器
flushall #清空所有db
flushdb #清空当前db
shutdown[""|save|nosave] #断开连接,关闭服务器
slowlog #显示慢查询
info #显示服务器信息
config get #获取配置信息
config set #设置配置信息
monitor #打开控制台(用于实时打印出 Redis 服务器接收到的命令,调试用)
sync #主从同步
client list #客户端列表
client kill #关闭某个客户端
client setname #为客户端设置名字
client getname #获取客户端名字

十.aof恢复与rdb服务器间迁移

flushall or flushdb危害:若此时重写aof,则aof文件被清空,若又进行了rdb快照,数据无法恢复。
①立马shutdown nosave 断开连接(停止所有客户端,为了防止别人正在写服务器导致aof重写),不要操作aof文件,这条命令不写入aof文件,一般shutdown会重写aof文件。
②vim aof文件,删除flushall或者flushdb。

rdb服务器间迁移步骤
①使用aof文件恢复,同时生成了一个dump.rdb文件,通过save快照内存数据到rdb文件。
②利用dump.rdb文件重命名(注意:需要先kill掉原redis进程,因为在redis进程运行时,rdb处于打开状态,复制的文件占据同样的句柄)。
③启动另一个redis进程,从rdb文件恢复。

十一.缓存穿透与缓存雪崩

缓存穿透:一般的缓存系统,按照key去查询缓存,不存在情况下查询DB数据库,一些恶意的请求会绕过缓存直接从后端数据库中查询,大量的请求对后端系统造成很大的压力。

避免方式:
①空查询进行短时间缓存,等到数据库insert了之后清理缓存。
②利用bitmap对所有可能存在的key进行缓存,查询时通过该bitmap过滤。

缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,请求都会从DB查询数据,会给后端系统带来很大压力,导致系统崩溃。

避免方式:
①读写锁方式处理:对某个key只允许一个线程查询数据和写缓存,其他线程等待。
②二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。
③不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

你可能感兴趣的:(redis)