在cenos7中 使用docker 进行快速安装 直接下载redis的最新版本 (当然不使用docker 直接下载压缩包解压安装亦可 )
sudo docker pull redis
使用 docker images 命令进行查看是否安装成功
使用 docker ps 查看 redis的CONTAINER ID 复制
docker exec -it 8c26e7a42531 /bin/bash 即可进入redis 容器
redis-cli # 执行客户端命令
127.0.0.1:6379> 即可进行操作
---
关于常用命令:
redis默认有0-15 一共16个库 ,可通过 redis/redis.conf中的databases 进行修改; 默认使用0号库 可随时使用select进行切换 如: select 2
使用key * (注意两者间有空格)查看当前库的所有key 当然刚装完数据为空 可以通过set key value的方法添加测试数据 通过get key获取 mset mget 可对多个kv进行操作
如: set k1 lucy 提示ok 那么现在我在2号库添加了一组键值对数据 使用exists可判断是否存在 如 exists k1 使用type 可对值类型进行判断
关于删除 key del 和unlink 都可以 后者为非阻塞删除
需要知道的: 对同一key进行赋值 后者会覆盖前一个值 但使用 setnx key的方式可以避免 如果key的值已存在 则无法覆盖
关于过期 exprie key 10 #10s后过期 ttl key 查看多长时间过期 -1 永不过期 -2已过期
dbsize 查看当前库key的数量
flashdb 清空当前库
flashall 通杀所有库 这两个清空库的操作慎用
append key 内容 可对该key的内容进行追加 如 append k1 abc 查看:lucyabc
----
然后 redis的数据类型:
其实面试都要背烂的东西 字符串String 列表list 集合set 有序集合zset 哈希hash
String作为redis最常用的数据类型
使用 incr 可对数字进行+1操作 相应的 decr key 做减一操作
Redis的列表list是简单的字符串列表,底层实际是双向列表 可以在头尾插入
命令 lpush key value1 value2 value3 从左边放入
查询 lrange key 0 -1 说明要取所有值 :value3 value2 value1
rpush key2 value1 value2 value3 从又边放入
查询 lrange key 0 -1 说明要取所有值 :value1 value2 value3
set 无序不可重复
sadd key vakue value 对应的 smembers key 取出所有值 scard key 返回该key值的个数 spop key 随即吐一个值
hash 和zset 先放一下....
---
关于redis的配置文件
如果这时还不清楚 redis被安装在哪 ps -ef|grep redis 可使用命令查看进程号
redis-server所在行的 第一个就是进程号 本机为 6175 所以 ls -l /proc/6175/cwd 即可获得 redis安装地址 光标闪烁 /data
cd /data 失败 ?? 怎么回事 (像查看win文件夹一样 翻了目录) 原来是mydata cd /mydata/redis/conf/redis.conf
发布订阅
PUBLISH channel msg 将信息 message 发送到指定的频道 channel SUBSCRIBE channel [channel ...] 订阅频道,可以同时订阅多个频道 UNSUBSCRIBE [channel ...] 取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道
PSUBSCRIBE pattern [pattern ...] 订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符,比如 it* 匹配所 有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有 以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类
PUNSUBSCRIBE [pattern [pattern ...]] 退订指定的规则, 如果没有参数则会退订所有规则
PUBSUB subcommand [argument [argument ...]] 查看订阅与发布系统状态
注意:使用发布订阅模式实现的消息队列,当有客户端订阅channel后只能收到后续发布到该频道的消息,之前发送的不会缓存,必须Provider和Consumer同时在线。
做一个最简单的演示
开两个连接
在其中一个 SUBSCRIBE channel1 #订阅频道1
另一个 publish channel1 hello #发送给订阅频道信息
---
对于redis的保存 也就是持久化
rdb: redis database 以配置文件中的 "save 时间 操作数"为间隔进行快照保存 比如 save 60 5 表示60s内进行5次操作 生成 dump.rdb快照文件进行保存
当然除了写操作保存外 flushdb 清空当前库 flushall清空所有库 退出reids 也会进行一次保存 之后bin文件夹下存在dump.rdb文件就会去读取加载
默认情况下 使用的是bgsave 后台保存 主进程 fork分支子进程进行非阻塞保存 为默认方式 当然保存期间的操作无法持久化
aof : append only file 日志型保存 conf配置文件中默认关闭 如果两种方式同时开启 aof的优先级高
以秒为单位对写操作进行保存 文件 append.aof
如果append.aof 或者dump.rdb文件遭到破坏随意修改 则在启动时无法加载 可使用check文件进行修复:
redis-check-rdb redis-check-aof
命令为:redis-check-rdb -fix 文件名
---
redis的主从复制 集群下 master 和slave的信息复制 读写为单向 主节点向子节点写入,默认情况下 每一个redis都是主节点
使用 info replication可查看当前库的信息
使用 solveof 主机地址 端口号 可将当前节点设为子节点 但命令配置是暂时的
可在conf配置文件中进行永久配置 replicaof master port
子节点启动连接成功后会发送 sync命令 主节点会收集命令集 进行全量同步
主节点宕机后该怎么办: 哨兵模式 Sentinel
作为独立进程 监控所有节点 通过发送命令 等待服务器相应 从而监控所有reids实例,当然为了保证哨兵进程的健壮性 需要开启多个哨兵互相监控 在监控节点的同时 各自间也相互监控
在bin/文件夹下 Sentinel.conf的配置文件 中 使用
# sentinel auth-pass <master-name> <password> 进行配置
对主从节点配置完毕,哨兵集群配置完毕后,当主节点宕机 哨兵1 检测不到 主观认为主服务器不可用 :主观下线 等待其他哨兵也判断 主节点宕机,哨兵之间发起投票 票出一个哨兵进行故障转移操作 failover 在solve选举出新的主节点 到此 主节点客观下线
----
缓存穿透 (访问不到)
发起查询请求 reids中没有命中 转而向 持久层数据库查询 发现也没有,大量的未命中请求到达持久层数据库 带来压力
解决方案: 1 布隆过滤器 作为一种数据结构 对可能查询的参数以hash进行储存, 在控制层进行校验,不符合皆丢弃
2 缓存空对象 :当储存层为命中 将该空对象进行缓存 防止二次落空
缓存击穿 (过期期间被击穿)
大量并发集中访问一个key,在缓存过期期间,直接访问数据库 (假如说是mysql) 对于redis的key的删除 有定期删除 和 惰性删除 ,但大量数据遍历损耗时间 所以使用随机删除过期key redis默认是每隔 100ms随机删除 出现的问题为 已过期的key怎么处理 :惰性删除 的系统去查一下那个 key,才会被redis给删除掉;但如果后期过期key没有被随机和惰性处理掉 这时就需要reids的淘汰机制:比如在过期的key挑选最近最少使用的数据淘汰,任意选择淘汰, 快过期淘汰
解决方案 可以将该热点key设为永不过期
加分布式锁
缓存雪崩 (大量key 在同一时间过期)
redis集群显得很有必要 或者服务降级 数据预热
------------恢复内容结束------------