一、事务
Redis 事务本质:一组命令的集合,一个事务中的所有命令都会被序列化。在事务执行过程中,会按照顺序执行。Redis 事务没有隔离级别的概念。所有的命令在事务中,并没有直接背执行,只有发起执行命令的时候才会执行。Redis 单条命令保证原子性,但是事务不保证原子性。
- 原子性:不支持,不会回滚且继续执行。
- 隔离性:支持,事务中的命令顺序,不会被打断,先EXEC先执行,单机redis读写操作使用单进程单线程。
- 持久性:不支持,redis 数据容易丢失。
- 一致性:不支持,要求通过乐观锁 watch 来实现。
1、事务的应用
Redis 的事务:
- 开启事务(multi);
- 命令入队(...);
- 执行事务(exec)。
正常执行事务。
127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> exec # 执行事务
1) OK
2) OK
3) "v2"
4) OK
放弃事务。
127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> discard # 取消事务
OK
127.0.0.1:6379> get k4 # 事务队列中的命令都不会被执行
(nil)
编译型异常(代码有问题,命令出错),事务中所有的命令都不会执行。
127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> get1 v1 # 错误命令
(error) ERR unknown command `get1`, with args beginning with: `v1`,
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> exec # 执行事务,报错!
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get v4 # 错误命令前后的所有命令都不会执行
(nil)
127.0.0.1:6379> get v5
(nil)
执行命令时,如果事务队列是运行时异常(1/0),那么其他命令可以正常执行,错误命令抛出异常。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> incr k4 # 因为 v4 不是数字,自增会报错
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> exec # 其他命令正常执行
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
127.0.0.1:6379> get k4
"v4"
127.0.0.1:6379> get k5
"v5"
2、乐观锁
乐观锁,很乐观,认为什么时候都不会出现问题,所以不会上锁。更新数据的时候去判断一下,在此期间是否有人修改过这个数据。获取 value,更新的时候比较 value(存在 ABA 问题)。
乐观锁:
- watch 命令用于监视一个(或多个)key;
- 开启事务前,设置对数据的监听,exec 时,如果数据发生过修改,事务会失败;
- 事务 exe 后,无论成败,监视会被移除;
- unwatch 命令用于取消 watch 命令对所有 key 的监视。只能在 watch 和 multi 之间使用,在事务中使用无效。
正常执行成功。
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money # 监视 money 对象
OK
127.0.0.1:6379> multi # 事务正常结束,数据期间没有发生变动,这个事务就正常执行成功。
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> exec
1) (integer) 80
2) (integer) 20
测试多线程修改值,使用 watch 可以当做 redis 的乐观锁操作。
127.0.0.1:6379> watch money # 监视 money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 10
QUEUED
127.0.0.1:6379> incrby out 10
QUEUED
127.0.0.1:6379> exec # 执行前,另外一个线程修改了该值,会导致执行失败
(nil)
二、配置文件
Redis 的配置文件 redis.conf。
1、单位
配置文件对单位大小写不敏感。
# Note on units: when memory size is needed, it is possible to specify
# it in the usual form of 1k 5GB 4M and so forth:
#
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.
2、链接配置文件
# include /path/to/local.conf
# include /path/to/other.conf
3、网络
# bind 127.0.0.1 # 绑定的 ip
protected-mode yes # 保护模式
port 6379 # 端口设置
4、通用 general
daemonize yes # 以守护进程的方式运行,yes 允许后台启动
pidfile /var/run/redis_6379.pid # 如果以后台的方式运行,我们需要指定一个 pid
# 日志
# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably) 生产环境
# warning (only very important / critical messages are logged)
loglevel notice # 设置日志级别
logfile "" # 日志的文件位置名
databases 16 # 数据库的数量,默认是 16 个数据库
always-show-logo yes # 是否总是显示 logo
5、快照
持久化,在规定的时间内,执行了多次操作,则会持久化到文件 .rdb 呵 .aof。redis 是内存数据库,如果没有持久化,那么数据断电及失。
# 在 900s 内,如果至少有一个 1 key 进行了修改,我们就进行持久化操作
save 900 1
# 在 300s 内,如果至少 10 key 进行了修改,我们就进行持久化操作
save 300 10
# 在 60s 内,如果至少 10000 key 进行了修改,我们就进行持久化操作
save 60 10000
# 持久化如果出错,是否还需要继续工作
stop-writes-on-bgsave-error yes
# 是否压缩 rdb 文件,需要消耗一些 cpu 资源
rdbcompression yes
# 保存 rdb 文件的时候,进行错误的检查校验
rdbchecksum yes
# rdb 文件保存的目录
dir ./
6、replication 复制
主从复制
7、security 安全
requirepass 密码值
config set requirepass password # 设置密码命令
config get requirepass # 获取密码命令
auth password # 连接客户端验证密码命令
8、限制 clients
maxclients 10000 # 设置连接 redis 客户端的最大连接数
maxmemory <bytes> # redis 配置的最大内存容量
maxmemory-policy noeviction # 内存达到上限之后的处理策略
# volatile-lru:使用LRU算法删除键(只对设置了生存时间的键)
# allkeys-lru:使用LRU算法删除键
# volatile-random:随机删除键(只对设置了生存时间的键)
# allkeys-random:随机删除键
# volatile-ttl:删除即将过去的键
# noeviction:不删除键,只返回错误
9、appen only 模式 aof 配置
appendonly no # 默认不开启aof模式的 ,默认使用的是rdb方式持久化,在大部分的情况下,rdb完全够用
appendfilename "appendonly.aof" # 持久化的文件的名字
# appendfsync always # 每次修改都会 sync,消耗性能
appendfsync everysec # 每秒执行一次 sync,可能会丢失这 1s 的数据
# appendfsync no # 不执行sync,这个时候操作系统自己同步数据,速度最快
标题:Redis 事务和配置文件
作者:Yi-Xing
地址:http://47.94.239.232/articles/2021/03/01/1614587895599.html
博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!