redis 乐观锁
乐观锁,即获取数据时不加锁,在修改的时候才会比对数据是否和获取时一致。若一致才能修改。
使用watch关键字,他的作用是在事务开始前先获取值,然后监控这个值,当你开始事务之后,如果在你执行之前redis会自动帮你检测这个数据是否被更改了,若被更改了整个事务都不会执行。需要unwatch之后再重新开始watch,开始事务。
redis.conf
启动的时候,就通过配置文件启动。
1.对unit单位,大小写不敏感
2.包含,可以把多个配置文件导入到我们的总配置文件中
3.网络,bind默认是本机,port默认是6379,protected-mode,保护模式默认开启。
4.通用,daemonize yes以守护进程的方式运行,默认是no,需要我们手动改成yes
pidfile /var/run/redis_6379.pid 如果以后台方式运行,我们就需要一个pid文件。
loglevel notice 默认日志级别
logfile 日志文件位置,为空则默认输出
databases 16 数据库数量,默认16个
always-show-logo yes 是否总是显示logo,就是我们启动redis出现的那个大大的图像。默认开启
5.快照
也叫持久化,在规定时间内,执行多少次会持久化到硬盘.rdb .aof,因为redis是内存
数据库,如果没有持久化,断电数据就丢失了。
save 900 1 # 如果900s内,如果至少有一个key进行了修改,我们就持久化操作
save 300 10 # 如果在300s内,至少10个key进行了修改...
save 60 10000 # 如果在60s内,至少10000个key进行了修改...
stop-writes-on-bgsave-error yes 持久化出错是否还继续工作,默认为yes
rdbcompression yes 是否压缩rdb文件,默认开启,当然压缩要消耗一些cpu资源
rdbchecksum yes 保存rdb文件时,进行错误检查,默认yes
dir ./ # rdb文件默认保存位置,此处默认为当前文件夹
6 REPLICATION复制,见后面
7 security安全
默认没有密码,可以在配置文件中
requirepass 123
或者在命令中
config set requirepass 456
之后登陆redis之后就需要auth 加密码,才能进行后续操作
8 clients客户端的一些限制,默认空
maxmemory <bytes> 最大内存容量
maxmemory-policy noeviction 内存满了之后的处理策略,有六种,具体六种百度
9 append only aof配置
appendonly no 默认不开启aof模式,即默认使用rdb方式持久化,因为正常情况下rdb都够用了
appendfilename "appendonly.aof"
appendfsync 三种级别,默认为everysec,每秒持久化一次,always,每次修改执行一次,no,关闭
持久化
rdb机制
有时候我们会对这个文件进行备份
1.在我们利用save关键字,并且满足配置文件save的条件时会产生
2.flushall的时候会产生
3.退出redis的时候会产生
当dump.rdb文件和启动文件在同一目录下,在启动的时候就会自动回复
优点:
。。。查
缺点:
。。。查
aof(append only file)
将我们的命令都记录下来,恢复的时候把所有命令重新执行一遍,读命令是不记录的。保存的文件是appendonly.aof。默认不开启。
如果手动开启之后,那么重启redis之后就会产生appendonly.aof文件,因为默认是每秒备份一次。
当我们的appendonly.aof有错误,比如有些错误的代码,那么redis 是无法启动的,我们可以使用自带的redis-check-aof来修复这个文件
redis-check-aof --fix appendonly.aof
这个修复会帮我们删除一些错误的代码,保证大部分的数据的完整的。
aof优点:
如果开启每一次修改都同步,文件完整性更好
如果开启每秒同步,只会丢失一秒的数据
缺点:
aof文件比rdb大很多,且修复速度慢
aof运行效率也低于rdb
重写规则
redis发布订阅
需要两个终端测试
订阅端
subscribe dingyue1 订阅消息,自动监听,当发送端有信息发送,就自动获取
发布端
puiblish dingyue2 hello 发送信息
unsubscribe dingyue1 退订
发布订阅原理
redis是使用C实现的,通过分析redis源码里的pubsub.c文件,了解发布和订阅的底层实现,借此加深对redis的理解。
Redis通过publish、subscribe和psubscribe等命名实现发布和订阅功能。
通过subscribe命令订阅某一个频道后,redis-server里维护了一个字典,字典的键就是一个个频道,而字典的值则是一个链表。
通过publish命令向订阅者发送信息,redis-server会使用给定的频道作为key,在它维护的channel字典中查找记录了订阅这个频道所有客户端的链表,遍历这个链表,将信息发布给所有订阅者
pub/sub从字面上理解就是发布(publish)与订阅(subscribe),在riedis中,你可以设定对某一个key值进行信息发布及信息订阅,当一个key值上进行了信息发布后,所有订阅他的客户端都会收到相应的数据。这一功能最明显的用法就是用于实时信息系统,比如普通的即时聊天,群聊等等