Redis
1、Redis功能介绍
高速读写
数据类型丰富 ******************
支持持 久化 ******************
多种内存分配及回收策略
支持事务 ******************
消息队列、消息订阅
支持高可用
支持分布式分片集群 (面试) ******************
缓存穿透\雪崩(笔试、面试) ******************
Redis API ************
2、Redis使用场景介绍
Memcached:多核的缓存服务,更加适合于多用户并发访问次数较少的应用场景
Redis:单核的缓存服务,单节点情况下,更加适合于少量用户,多次访问的应用场景。
Redis一般是单机多实例架构,配合redis集群出现。
3. Redis安装部署
-
下载安装
下载: wget http://download.redis.io/releases/redis-3.2.12.tar.gz 解压: 上传至 /data tar xzf redis-3.2.12.tar.gz mv redis-3.2.12 redis 安装: cd redis make 启动: src/redis-server & 环境变量: vim /etc/profile export PATH=/data/redis/src:$PATH source /etc/profile redis-server &
-
配置文件
[root@standby ~]# redis-cli shutdown mkdir /data/6379 cat >>/data/6379/redis.conf <
-
客户端命令常用参数说明
redis-cli 刚装完,可以在redis服务器上直接登录redis -p 6379 指定端口号 -h 指定链接地址 -a 指定链接密码 redis-cli set num 10 ,无交互执行redis命令 cat /tmp/1.txt |redis-cli [root@db01 ~]# redis-cli -h 10.0.0.51 -p 6379 10.0.0.51:6379>
-
redis安全配置
redis默认开启了保护模式,只允许本地回环地址登录并访问数据库。 禁止protected-mode 1. Bind :指定IP进行监听 echo "bind 10.0.0.200 127.0.0.1" >>/data/6379/redis.conf 2. 增加requirepass {password} echo "requirepass 123" >>/data/6379/redis.conf 3. 重启redis redis-cli shutdown redis-server /data/6379/redis.conf
-
在线查看和修改配置
CONFIG GET * CONFIG GET requirepass CONFIG SET requirepass 123
-
redis持久化(内存数据保存到磁盘)
作用:可以有效防止,在redis宕机后,缓存失效的问题.
RDB 持久化
可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。 优点:速度快,适合于用做备份,主从复制也是基于RDB持久化功能实现的。 缺点:会有数据丢失 rdb持久化核心配置参数 vim /data/6379/redis.conf dir /data/6379 dbfilename dump.rdb save 900 1 save 300 10 save 60 10000 配置分别表示: 900秒(15分钟)内有1个更改 300秒(5分钟)内有10个更改 60秒内有10000个更改
AOF 持久化(append-only log file)
记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 优点:可以最大程度保证数据不丢 缺点:日志记录量级比较大 AOF持久化配置 vim /data/6379/redis.conf appendonly yes # 是否打开aof日志功能,每1个命令,都立即同步到aof appendfsync everysec # 每秒写1次 appendfsync always appendfsync no
总结
持久化方式有哪些?有什么区别? rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能 aof:以追加的方式记录redis操作日志的文件。可以最大程度的保证redis数据安全,类似于mysql的binlog
4. 发布订阅
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同时在线。
发布订阅例子:
窗口1:
127.0.0.1:6379> SUBSCRIBE baodi
窗口2:
127.0.0.1:6379> PUBLISH baodi "jin tian zhen kaixin!"
订阅多频道:
窗口1:
127.0.0.1:6379> PSUBSCRIBE wang*
窗口2:
127.0.0.1:6379> PUBLISH wangbaoqiang "jintian zhennanshou "
5. Redis事务
redis的事务是基于队列实现的
mysql的事务是基于事务日志实现的
multi 开启事务
discard 取消执行
exec 执行
开启事务功能时(multi)
multi
command1
command2
command3
command4
4条语句作为一个组,并没有真正执行,而是被放入同一队列中。
如果,这是执行discard,会直接丢弃队列中所有的命令,而不是做回滚。
当执行exec时,对列中所有操作,要么全成功要么全失败
redis是乐观锁, mysql为悲观锁
乐观锁: 在事物开始时修改了某条数据, 还未提交时另一个事物也能修改这条数据并且提交
悲观锁: 在事物开始时修改了某条数据, 还未提交时, 其他事物不得修改这条数据
.
6. 乐观锁与悲观锁
redis默认为乐观锁
窗口1开启事务修改了num的值, 还未提交, 窗口2 也在修改num, 并且提交了, 最后两个窗口都提交成功了 ,所以num的值会被修改两次
通过watch
可以避免两个事物同时修改了一条记录这一情况
窗口1开启事务修改了a的值, 还未提交, 窗口2 也在修改a, 并且提交了, 这时窗口1再提交就会提交失败
窗口1开启事务修改了money的值, 还未提交, 窗口2 再修改同一数据时会阻塞住
7. 服务器管理命令
Info
Clinet list
Client kill ip:port
config get *
CONFIG RESETSTAT 重置统计
CONFIG GET/SET 动态修改
Dbsize
FLUSHALL 清空所有数据
select 1
FLUSHDB 清空当前库
MONITOR 监控实时指令
SHUTDOWN 关闭服务器
关闭数据库:
redis-cli -a root shutdown