redis
安装
1、下载 redis.tar.gz
2、make
3、make install
4、换端口启动:redis server --port 6380 使用:./redis-cli -p 6380
5、指定配置文件可以多开redis启动:
1、 复制一个新的redis.conf并更名为redis端口号.conf
2、在redis根目录下新增data目录,存放日志
3、port改为6380,logfile改为6380.log,dir改为data目录
4、启动:./redis-server ../redis端口号.conf; 使用:./redis-cli -p 端口号
1、介绍
1、数据之间没有关系
2、单线程工作
3、高性能
4、多数据类型
5、持久化存储,用于备份
2、string
类型:一个key存储一个value
1、增加/获取/删除:set name del
2、添加多个数据:mset key1 value1 key2 value2
3、获取多个数据: mget key1 key 2
4、获取长度:strlen
5、拼接:append key value
6、自增 :incr key; 自增几个:incrby key 数字
7、自减:decr key; 自减几个:decr key 数字
8、设置过期时间:setex key 秒 value; psetex key 毫秒 value
9、key的数据分类可以用冒号(:)拼接:user:001:001
3、hash
类型:一个key对应key value,类似于一个key对应一个map
1、添加:hset key field value
2、删除:hdel key field
3、获取:hget key field ;获取全部:hgetall
4、添加,获取多个:hmset hmget
5、获取字段数量:hlen key
6、判断是否有指定字段:hexists key field
7、获取所有的key和value:hkeys hvals
8、自增:hincrby key field 数值
4、list
类型:存多个数据,有序
原理:使用的是双向链表的方式进行存储
注意:由于是链表格式,是右边入,左边查,才会是先进先出。右边入,右边出就会是先进后出
1、添加:lpush key value ; rpush key value
2、查询:从第几个到第几个:lrange key start stop; 查角标:lindex key index; 查长度:llen key
3、获取并移除:lpop key; rpop key
4、规定时间内获取并且移除数据:blpop key 时间 ;brpop key 时间 ;
5、删除list中几个数据:lrem key count value
5、set
1、介绍
数据不能重复,可以存储大量数据,查询效率更高。list内部是双向链表,所以存储大量数据会很慢
2、存储结构
hash的结构,一个key对应多个field,field的key为值,value为null,就是set的结构
3、添加:sadd key value
4、查询所有数据:smembers key
5、删除数据:srem key
6、获取数据总量:scard key
7、查询是否存在该值:sismmeber key
8、随机获取一个数据:srandmember key
9、随机取出一个数据:spop key
10、取交、并、差集:sinter key1 key2, sunion key1 key2,sdiff key1 key2
11、将两个的交、并、差集放到一个集合中:sinterstore 新集合名称 key1 key2
12、将set中的数据放到新set中:smove 原set 原set中数据 新set
6、sorted_set
1、介绍
保存可排序的set数据,也可以存储大量数据
2、原理
在set的基础上加了一列排序
3、添加:zadd key score value
4、获取数据:zrange key start stop ;反向获取数据:zrevrange key start stop
5、删除数据:zrem key
6、条件获取数据:zrangebyscore key start stop ;反向:zrevrangebyscore key start stop
7、条件删除数据:zrembyscore key start stop
7、通用操作
1、删除:del key
2、是否存在:exists key
3、key类型:type key
4、设置有效时间:expire key 秒 ;pexpire key 毫秒
5、获取有效期:ttl key ; pttl key ;转换为永久:persist key
6、查询key:keys *
8、可视化工具下载
redis可视化工具:跳转
9、持久化
1、介绍
储存在本地,启动后读到内存中。防止redis数据丢失
2、RDB
1、执行save就可以存储到本地的redis根目录下
2、rdb相关配置配置
1、设置文件名称,默认是dump.rdb
dbfilename dump.rdb
2、文件储存路径
dir 文件路径
3、是否压缩数据,可以节省cpu时间,默认开启
rdbcompression yes
4、是否校验文件
rdbchecksum yes
5、原理
单线程存储到本地,如果文件大,会拖慢进程,因为是单线程
3、bgsave
1、介绍
后台执行存储到本地,子进程执行,推荐使用
2、如果出现错误,是否要继续执行:
stop-writes-bgsave-error yes
4、配置自动保存
save 秒 key执行次数
满足时间范围内 key 的执行次数 达到设置的执行次数就进行持久化储存
5、优点
1、存储的是二进制文件,效率高
2、存储的是某个时间段的数据快照,适合数据备份,全量赋值
3、数据恢复速度比AOF快
6、缺点
1、不能做实时持久化
2、运行子线程,会牺牲性能
3、各个版本之间的数据可能不能兼容
4、数据量大,全量赋值慢
3、AOF
1、介绍
存储的是操作记录,降低丢失数据的可能性,也不会有那么大的数据量
2、策略
1、每次都存储:always
性能差
2、每秒存储一次:evelysec
相对性能好,建议使用
3、系统决定:no
3、使用
1、开启:appendOnly yes
2、设置策略:appendfsync always|evelysec|no
4、问题
1、aof重写
连续使用三个set name 不同值 ,备份没有意义,解决方案
1、规则:
超时数据不再写入
对数据无效指令不再写入
对同一数据的多条指令合并为一条写指令
2、配置:
命令行执行该操作,aof文件重写:bgrewriteaof
自动条件重写:
aof缓冲区大小到达该文件大小自动重写:aoto-aof-rewrite-min-size 文件大小
当前缓冲期百分比到达设定值后自动重写:aoto-aof-rewrite-percentage 百分比
10、事务
1、使用
1、开始结束事务:multi exec
2、回滚事务:discard
2、问题
1、如果事务中输入了错误指令,会造成所有指令都不能执行
2、如果是指令正确,但是执行后却发生了错误,会正常执行,只能是程序员自己进行回滚
11、锁
1、对值加锁
事务前增加对key 的监控,如果结束事务之前key被修改了,则事务执行失败
1、加监控:watch key1 key2
2、取消所有值的监控: unwatch
2、分布式锁
如果已经有值了返回失败,没有纸,返回成功,解锁时删除锁即可,适合使用商品秒杀
1、加锁:setnx key value
2、删除锁:del key
3、问题:只加了锁,系统坏了,怎么办
加锁后增加失效:expire key 秒,该时间尽量短
12、删除策略
1、过期数据
已经过期的数据,其实并没有直接被删除,而是还存在cpu中
我们要做的是让cpu闲着的时候再去处理过期数据
1、定时删除
当数据过期时,定时器来删除内存中的数据
好处:节约内存
坏处:影响cpu效率
2、惰性删除
下次访问数据的时候,如果查看到该数据已过期,删除数据
坏处:内存占用量大
3、定期删除
1、每秒执行几次:server.hz
2、每次检查几个:ACTIVE_EXPIRE_CYCLE_LOOKUPS_PRE_LOOP
3、记录已经到哪一个数据库了:current_db
每秒钟执行server.hz次检测redis中的数据,随机检测key,如果第一次删除的key大于百分之W*25,再次执行该过程
2、逐出算法
1、介绍
在每次调用命令时,都会查询一次内存是否充足,如果内存不足了,会临时删除一些数据,判断删除哪些数据就是逐出算法
2、相关参数
1、最大内存(默认全用):maxmemory
2、每次获取的数据个数(每次查询不是全表查,而是随机查几个):maxmemory-samples
3、内存不足时策略:maxmemory-policy
4、策略:
1、检测易失数据
1、volatile-lru:最长时间没有用的数据淘汰
2、volatile-lfu:挑选数据使用次数最少的淘汰
3、volatile-ttl:挑选快过期的数据淘汰
4、volatile-random:随机淘汰
2、检测所有数据
1、allkeys-lru:最长时间没有用的数据淘汰
2、allkeys-lfu:挑选数据使用次数最少的淘汰
3、allkeys-random:随机淘汰
3、不淘汰:no-enviction
13、主从复制
1、什么是主从复制
保证高可用,防止机器故障。解决方案就是创建多个服务器,一个服务挂了,其他服务也能直接用,每个服务器之间的数据都是同步的。
分为主服务器(master)和从服务器(slave),主服务器只操作写,从服务器只执行读
2、链接过程
1、从服务器发送向主服务器链接的指令:saveof ip port
2、主服务器响应成功
3、从服务器保存主服务器的所有信息,并创建一个与主服务器的socket,保证数据的一致性
4、定时向主服务器ping一下保证正在运行
5、主服务器回应从服务器
6、主服务器保存从服务器的端口
3、开始连接
1、将配置文件中daemonize守护线程关闭,logfile日志文件注释
2、配置文件连接主服务器:slaveof ip port
3、查询到当前的链接信息:info
4、关闭链接:slaveof no one
4、同步过程
全量复制开始
1、从服务器发送同步请求
2、主服务器使用rdb方式bgsave存储到本地
3、当有从服务器链接时,创建命令缓冲区缓存用户执行的命令,是为了全量复制完后,将这些用户命令发给从服务器,保证数据不丢失
4、主服务器生成rdb文件,soket方式发送给从服务器
5、从服务器清空key,执行rdb文件
全量复制结束
部分复制开始
6、从服务器告知主服务器已经全量复制完成
7、主服务器将命令缓存中的命令aof方式发给从服务器
8、从服务器执行aof恢复数据
部分复制完成
5、需要注意
1、数据量过大时,避免高峰期同步,尽量关闭服务器进行同步
2、当命令缓冲区满了后,最开始的命令就会被挤出,此时如果发现部分恢复时出现数据丢失的情况,则会第二次全量复制,也就进入了死循环,也就需要给主服务器设置合理的命令缓冲区大小
repl-backlog-size 1mb
14、哨兵
1、哨兵简介
当master宕机时,哨兵可以通过投票的方式推选出一个新的master作为主服务器,并将slave都连到新的master
由于是投票,尽量配置单数,方式投票打平
2、配置
1、创建sentinel-26379.conf
port 26379
dir /tmp
# master的ip端口 1:1个哨兵同意即可算投票通过
sentinel monitor mymaster 192.168.149.131 6379 1
#master 多长时间没响应就算宕机 毫秒
sentinel down-after-milliseconds mymaster 30000
#master宕机,新的slave一次几个同步
sentinel parallel-syncs mymaster 1
#多长时间同步完成算有效
sentinel failover-timeout mymaster 180000
2、启动: ./redis-sentinel ../sentinel-26379.conf
15、缓存预热
1、服务器启动直接宕机
原因:请求量大,同步数量大
2、解决
系统启动之前,先将数据加载到缓存系统
16、缓存雪崩
1、访问数剧增,导致崩溃
解决:
1、业务优化,限制请求
2、加分布式锁,拿到锁的运行,没拿到锁的等待
17、缓存击穿
1、redis数据平稳,但是数据库蹦了,原因是大量流量访问同一个已经过期的数据,访问不到,就去查询了数据库,数据库崩溃了
解决:
1、可以设置永久key
2、快到高峰值前更新过期时间
3、加分布式锁
18、缓存穿透
1、黑客攻击,访问一个redis不存在的id,直接查询数据库,给数据库造成压力
解决:布隆过滤器
根据key获取多个hash,存入bit数组中,bit数组初始化都是0,存入到bit数组中的改为1,。获取时,只要判断bit数组位置上都是1,也就是存在,可能会出现误判,因为可能会出现算出的hash值和别的值重叠,如果想要出现重叠次数少,就增大数组长度,减少hash次数。
1 系统启动需要先将数据给布隆过滤器初始化值
2 用户访问数据,先查询下布隆过滤器中是否可能存在,如果不存在,则直接返回空,如果可能存在,则去查询缓存,如果缓存也没有,再去查询数据库