这里写目录标题
5 发布与订阅
Redis发布订阅(publish/subscribe)是一种消息通信模式,发送者(publish)发送消息,订阅者(subscribe)订阅后接受频道消息。
总的来说,该项功能估计不会长久使用,随着版本迭代,会被替换了,缺点:
- 没有 Ack 机制,也不保证数据的连续: PubSub 的生产者传递过来一个消息,Redis 会直接找到相应的消费者传递过去。如果没有一个消费者,那么消息会被直接丢弃。如果开始有三个消费者,其中一个突然挂掉了,过了一会儿等它再重连时,那么重连期间的消息对于这个消费者来说就彻底丢失了。
- 不持久化消息: 如果 Redis 停机重启,PubSub 的消息是不会持久化的,毕竟 Redis 宕机就相当于一个消费者都没有,所有的消息都会被直接丢弃。
#订阅频道
subscribe 频道1[,频道2…]
#支持通配符
psubscribe 名称*
#发布频道
publish 频道 发送消息
6 数据持久化
数据持久化就是在服务重启或服务器重启后数据不丢失。实现持久化,就需要把数据存储到磁盘中。
Redis的持久化有2种方式
- 快照(rdb)默认就开启
- aof日志方式(需要手动开启)
两种的持久化的机制不相同,rdb在某一个时间点把内存中的数据整体保存下来。aof是把用户操作的命令全部记录下来。记录全部命令会对性能有一定的损耗,所以默认redis就没有开启,有条件化建议开启。
6.1 rdb快照
相关配置选项 vim /usr/local/redis/redis.conf
# 秒 命令次数
save 900 1 # 900秒内,有1条写入,则产生快照
save 300 10 # 300秒内有10次写入,则产生快照
save 60 10000 # 60秒内有10000次写入,则产生快照
dbfilename dump.rdb //导出来的rdb的默认文件名
dir ./ // 持久化文件存放路径
创建一个数据快照存储目录
6.2 aof日志持久化
相关配置 vim /usr/local/redis/redis.conf
appendonly no # 是否打开 aof日志功能 no不打开 yes打开
#appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢
appendfsync everysec # 推荐方案,每秒写1次
#appendfsync no # 写入工作交给操作系统,数据同步性没有保证,同步频率低,速度快
进入到redis命令客户端中,执行几次set操作,就可以在指定的日志目录中查看到对应的日志文件
7 Redis中的事务
Redis支持简单的事务,事务就是:当同一个操作需要多条命令执行,一条执行有误,其它操作将回滚到之前的状态。Redis是以单进程形式执行的,所以从本质上就保证了事务的隔离性(与MySQL的区别)
例如:银行转账工作,从一个账号扣款并在另一个账户增款,要么都执行,要么都不执行。
#执行的步骤:
#开始事务
#命令入队
#执行事务
#Redis事务实现
watch key1 key2 # 监听key的变化
multi 事务开始
普通命令(string list hash set zset中的命令)
exec # 执行 / discard # 取消 exec和discard两个只能执行一个
#unwatch # 解除监听
#回滚命令 discard
如果执行的命令没有错,只是业务有问题则不会自动回滚,会执行可以操作的队列中的命令
如果命令有错,则会自动回滚
事务执行操作
key的监听 watch 监听key是否有改变,如果有改变,则执行的事务将会不会成功执行。只有监听的在事务没有执行成功前没有改变,事务才能完成执行。
在其他数据库,关于事务的一些其他解读
- 第1级别:Read Uncommitted(读取未提交内容)
所有事务都可以看到其他未提交事务的执行结果,本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少,该级别引发的问题是——脏读(Dirty Read):读取到了未提交的数据 - 第2级别:Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)
它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变
这种隔离级别出现的问题是——不可重复读(Nonrepeatable Read):不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。导致这种情况的原因可能有:有一个交叉的事务有新的commit,导致了数据的改变;一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit - 第3级别:Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
此级别可能出现的问题——幻读(Phantom Read):当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行
InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决幻读问题;InnoDB还通过间隙锁解决幻读问题
8 Redis密码安全
8.1 ip限制
vim /usr/local/redis/etc/redis.conf文件来通过配置文件限制ip访问,多个ip用空格隔开
8.2 密码
重启redis服务
登录测试验证密码是否生效
9 Redis的主从设置
当数据量变得庞大的时候,读写分离还是很有必要的。redis提供了主从复制的机制,从服务器可以复制主服务器的数据信息,就可以实现读写分离,从而降低单台服务器的压力。
9.1 主服务器配置
开启rdb和aof日志记录,还有密码认证登录
9.2 从服务器配置
因为是使用从端口,所以复制一个redis.conf文件,并命名为redis6380.conf
修改redis6380.conf文件中的相关记录配置
修改端口号
修改一下pid文件
修改rdb文件
设置从服务器中连接主服务器的IP和端口号
设置主服务器连接时的口令
关闭aof日志记录
9.3 测试主从是否完成
写在最后
上述博客单纯用于记录个人学习,方便日后复习使用,同时让自己养成写博客习惯,内容质量可能不是很高,希望对小白入门有帮助。