redis常用命令
#redis切换命令
select 3
#获取值
get keyname
#查看当前库大小
dbsize
#查看所有的key
keys *
#清空当前库
flushdb
#清楚所有的库
flushall
#判断某个值是否存在
exists key
#移动数据到第一个库
move key 1
#设置一个数据的过期时间
EXPIRE key
#查看数据待过期时间
ttl key
#查看类型
type key
redis是单线程
C语言写的,基于内存操作。cpu不是redis的性能瓶颈。瓶颈是网络和内存。
redis是将所有的数据全部放在内存中操作,单线程效率高,多线程会涉及到cpu上下文的切换
redis五大数据类型
String类型
[
#设置值
set key1 0
#获取值
get key1
#追加到key1值里(append)
APPEND key1 "hello"
#获取长度(strlen)
STRLEN key1
#自增1
incr key1
#自减1
decr key 1
#步长,即每次增加的长度
INCRBY key1 10
#步长,即每次减少的长度
DECRBY key1 5
#获取字符串的部分值[0,3]
GRETRANGE key1 0 3
#替换值
get key2
"abcdefg"
SETRANGE key2 1 xx
"axxdefg"
]
hash
list
set
Rdb详解
#配置文件里的rdb规则触发机制
1.save的规则满足后触发
2.执行fulshall命令触发
3.退出redis会触发
#如何恢复rdb数据
1.把rdb文件放到redis的dir目录启动即可
#rdb的优点
1.适合大规模的数据恢复
2.对数据的完整性要求不高
#rdb的缺点
1.需要一定的时间间隔,如果redis机器意外关机最近修改的数据则会丢失。
2.fork进程的时候,会占用一定的内存空间。
rdb文件在主从复制里是备用的
Aof详解
#默认不开启
appendonly no 改为yes
#aof文件重写规则,即大于64m则会再fork一个新进程
auto-aof-rewrite-min-size 64mb
#如果aof文件有错误则启动不了redis,则可以使用redis-check-aof修复aof文件
redis-check-aof --fix appendonly.aof
#然后aof文件就恢复正常了,重启服务就可以恢复了
#aof优点
1.每次修改都会同步,文件完整性更好
2.每秒同步一次,则会丢失一秒的数据
3.从不同步,效率最高
#aof缺点
1.相对于rdb的小大,aof文件的大小更大,修复速度更慢
2.aof的运行效率比rdb文件慢,所以redis的默认是rdb
#同时开启两种持久化
同时开启两种持久化,当redis重启会优先载入aof文件恢复原始数据,因为通常情况下aof要比rdb保存的完整。rdb的数据不实时,同时使用时服务器重启只会找aof。
建议:使用rdb,因为rdb更适用于备份数据库,快速重启,而且不会有aof的潜在bug
redis的发布和订阅
订阅端
SUBSCRIBE kuangshenshuo #订阅一个kuangshenshuo频道
发送端
PUBLPUBLISH kuangshenshuo "发送的消息"
原理
适用场景
- 实时信息系统
- 实时聊天
主从配置
!!!!!默认情况下每台redis都是主节点
同一台机器安装需要修改如下配置
1.首先拷贝三份配置文件
2.端口
3.pid名字
4.dump.rdb名字
这种是临时的,永久的需要在配置文件里指定
#从节点解开如下配置
replicaof masterip masterport
#如果有密码则需要在如下配置设置
masterauth masterpassword
**细节**
1.主节点才可以写,从节点不可以写,从节点只可以读
2.主节点断开了[即服务停止了],从机依旧连接主机,但是没有写操作,这个时候主节点启动了,从节点已经可以读到主节点的信息。
3. 如何是在命令行里建立的主从,重启后就失效了,再次变成master,但是从手动到加入就又可以读到数据了。
原理制远离
谋权篡位
从节点执行 replication on one就可以成为主节点,其他从节点会自动连接到这里,此模式用于哨兵还没时使用,因为当是一主两从或一主多从主节点出现问题是无法写入数据的
哨兵集群
https://www.cnblogs.com/guangwenyin/p/15772266.html
Redis缓存穿透、缓存雪崩和缓存击穿
**缓存穿透**
缓存穿透是指查询一个根本不存在的数据,缓存层和持久层都不会命中,请求都会压到数据库[redis和mysql],从而压垮数据库。比如用户一个不存在的用户id获取用户信息.
**解决方法**
1.对空值缓存:如果一个查询返回的数据为空(不管数据是否存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过五分钟。
2.设置可访问的白名单:使用bitmaps;类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmaps里面的id进行比较,如果访问id不在bitmaps里面,进行拦截,不允许访问。
3.采用布隆过滤器:布隆过滤器(Bloom Filter)是由Howard Bloom在1970年提出的一种比较巧妙的概率型数据结构,它可以告诉你某种东西一定不存在或者可能存在。当布隆过滤器说,某种东西存在时,这种东西可能不存在;当布隆过滤器说,某种东西不存在时,那么这种东西一定不存在。 布隆过滤器相对于Set、Map 等数据结构来说,它可以更高效地插入和查询,并且占用空间更少,它也有缺点,就是判断某种东西是否存在时,可能会被误判。但是只要参数设置的合理,它的精确度也可以控制的相对精确,只会有小小的误判概率
**缓存击穿**
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力(有点像一把尖刀瞬间击穿到数据库)
它和缓存穿透的区别在于:缓存击穿是指缓存中没有但数据库中有的数据,由于并发用户特别多,同时读缓存没读到数据,同时数据库取数据引起数据库压力瞬间增大,造成过大压力。缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起的数据特别大而不存在的数据
**解决方法**
1.预先设置热门数据:在redis高峰访问前,把一些热门数据提前存入redis中,加大这些热门数据key的时长实时调整 现场监控哪些数据是热门数据,实时调整key的过期时长。
2.使用分布式锁: 就是在缓存失效的时候(判断拿出来的值为空),不是立即去查数据库,先使用缓存工具的某些带成功操作返回值的操作。比如redis的setnx去set一个mutex key,当操作返回成功时(分布式锁),在查数据库,并回设缓存,最后删除mutex key
当操作返回失败,证明有线程在查询数据库,当前线程睡眠一段时间在重s试整个get缓存的方法
**雪崩**
缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。
常见缓存雪崩出现原因:1、redis服务器挂掉了。2、对缓存数据设置了相同的过期时间,导致某时间段内缓存集中失效。
**解决方法**
1.构建多级缓存架构:nginx缓存+redis缓存+其他缓存(ehcache等)
2.使用锁或队列:使用锁或在队列的方式来保证不会有大量的线程对数据库进行读写,从而避免失效时大量的并发请求到底层存储系统上,不适用高并发情况。
3.设置过期标志更新缓存:记录缓存数据是否过期(设置提前量),如果过期会触发通知另外的线程在后台去更新实际key的缓存。
4.将缓存失效时间分散开:设置缓存过期时间时加上一个随机值,避免缓存在同一时间过期。