一、事务

  Redis 事务本质:一组命令的集合,一个事务中的所有命令都会被序列化。在事务执行过程中,会按照顺序执行。Redis 事务没有隔离级别的概念。所有的命令在事务中,并没有直接背执行,只有发起执行命令的时候才会执行。Redis 单条命令保证原子性,但是事务不保证原子性

  • 原子性:不支持,不会回滚且继续执行。
  • 隔离性:支持,事务中的命令顺序,不会被打断,先EXEC先执行,单机redis读写操作使用单进程单线程。
  • 持久性:不支持,redis 数据容易丢失。
  • 一致性:不支持,要求通过乐观锁 watch 来实现。

1、事务的应用

  Redis 的事务:

  • 开启事务(multi);
  • 命令入队(...);
  • 执行事务(exec)。

  正常执行事务。

 1127.0.0.1:6379> multi # 开启事务
 2OK
 3127.0.0.1:6379> set k1 v1
 4QUEUED
 5127.0.0.1:6379> set k2 v2
 6QUEUED
 7127.0.0.1:6379> get k2
 8QUEUED
 9127.0.0.1:6379> set k3 v3
10QUEUED
11127.0.0.1:6379> exec # 执行事务
121) OK
132) OK
143) "v2"
154) OK

  放弃事务。

 1127.0.0.1:6379> multi # 开启事务
 2OK
 3127.0.0.1:6379> set k1 v1
 4QUEUED
 5127.0.0.1:6379> set k4 v4
 6QUEUED
 7127.0.0.1:6379> discard # 取消事务
 8OK
 9127.0.0.1:6379> get k4 # 事务队列中的命令都不会被执行
10(nil)

  编译型异常(代码有问题,命令出错),事务中所有的命令都不会执行。

 1127.0.0.1:6379> multi # 开启事务
 2OK
 3127.0.0.1:6379> set k4 v4
 4QUEUED
 5127.0.0.1:6379> get1 v1 # 错误命令
 6(error) ERR unknown command `get1`, with args beginning with: `v1`, 
 7127.0.0.1:6379> set k5 v5
 8QUEUED
 9127.0.0.1:6379> exec # 执行事务,报错!
10(error) EXECABORT Transaction discarded because of previous errors.
11127.0.0.1:6379> get v4 # 错误命令前后的所有命令都不会执行
12(nil)
13127.0.0.1:6379> get v5
14(nil)

  执行命令时,如果事务队列是运行时异常(1/0),那么其他命令可以正常执行,错误命令抛出异常。

 1127.0.0.1:6379> multi
 2OK
 3127.0.0.1:6379> set k4 v4
 4QUEUED
 5127.0.0.1:6379> incr k4 # 因为 v4 不是数字,自增会报错
 6QUEUED
 7127.0.0.1:6379> set k5 v5
 8QUEUED
 9127.0.0.1:6379> exec # 其他命令正常执行
101) OK
112) (error) ERR value is not an integer or out of range
123) OK
13127.0.0.1:6379> get k4
14"v4"
15127.0.0.1:6379> get k5
16"v5"

2、乐观锁

  乐观锁,很乐观,认为什么时候都不会出现问题,所以不会上锁。更新数据的时候去判断一下,在此期间是否有人修改过这个数据。获取 value,更新的时候比较 value(存在 ABA 问题)。

乐观锁:

  • watch 命令用于监视一个(或多个)key;
  • 开启事务前,设置对数据的监听,exec 时,如果数据发生过修改,事务会失败;
  • 事务 exe 后,无论成败,监视会被移除;
  • unwatch 命令用于取消 watch 命令对所有 key 的监视。只能在 watch 和 multi 之间使用,在事务中使用无效。

  正常执行成功。

 1127.0.0.1:6379> set money 100
 2OK
 3127.0.0.1:6379> set out 0
 4OK
 5127.0.0.1:6379> watch money # 监视 money 对象
 6OK
 7127.0.0.1:6379> multi # 事务正常结束,数据期间没有发生变动,这个事务就正常执行成功。
 8OK
 9127.0.0.1:6379> decrby money 20
10QUEUED
11127.0.0.1:6379> incrby out 20
12QUEUED
13127.0.0.1:6379> exec
141) (integer) 80
152) (integer) 20

  测试多线程修改值,使用 watch 可以当做 redis 的乐观锁操作。

 1127.0.0.1:6379> watch money # 监视 money
 2OK
 3127.0.0.1:6379> multi
 4OK
 5127.0.0.1:6379> decrby money 10
 6QUEUED
 7127.0.0.1:6379> incrby out 10
 8QUEUED
 9127.0.0.1:6379> exec # 执行前,另外一个线程修改了该值,会导致执行失败
10(nil)

二、配置文件

  Redis 的配置文件 redis.conf。

1、单位

配置文件对单位大小写不敏感。

 1# Note on units: when memory size is needed, it is possible to specify
 2# it in the usual form of 1k 5GB 4M and so forth:
 3#
 4# 1k => 1000 bytes
 5# 1kb => 1024 bytes
 6# 1m => 1000000 bytes
 7# 1mb => 1024*1024 bytes
 8# 1g => 1000000000 bytes
 9# 1gb => 1024*1024*1024 bytes
10#
11# units are case insensitive so 1GB 1Gb 1gB are all the same.

2、链接配置文件

1# include /path/to/local.conf
2# include /path/to/other.conf

3、网络

1# bind 127.0.0.1 # 绑定的 ip
2protected-mode yes # 保护模式
3port 6379 # 端口设置

4、通用 general

 1daemonize yes # 以守护进程的方式运行,yes 允许后台启动
 2pidfile /var/run/redis_6379.pid # 如果以后台的方式运行,我们需要指定一个 pid 
 3
 4# 日志
 5# Specify the server verbosity level.
 6# This can be one of:
 7# debug (a lot of information, useful for development/testing)
 8# verbose (many rarely useful info, but not a mess like the debug level)
 9# notice (moderately verbose, what you want in production probably) 生产环境
10# warning (only very important / critical messages are logged)
11
12loglevel notice # 设置日志级别
13logfile "" # 日志的文件位置名
14
15databases 16 # 数据库的数量,默认是 16 个数据库
16
17always-show-logo yes # 是否总是显示 logo

5、快照

持久化,在规定的时间内,执行了多次操作,则会持久化到文件 .rdb 呵 .aof。redis 是内存数据库,如果没有持久化,那么数据断电及失。

 1# 在 900s 内,如果至少有一个 1 key 进行了修改,我们就进行持久化操作
 2save 900 1
 3# 在 300s 内,如果至少 10 key 进行了修改,我们就进行持久化操作
 4save 300 10
 5# 在 60s 内,如果至少 10000 key 进行了修改,我们就进行持久化操作
 6save 60 10000
 7
 8# 持久化如果出错,是否还需要继续工作
 9stop-writes-on-bgsave-error yes
10# 是否压缩 rdb 文件,需要消耗一些 cpu 资源
11rdbcompression yes
12# 保存 rdb 文件的时候,进行错误的检查校验
13rdbchecksum yes
14# rdb 文件保存的目录
15dir ./

6、replication 复制

主从复制

7、security 安全

1requirepass 密码值
2config set requirepass password # 设置密码命令 
3config get requirepass # 获取密码命令 
4auth password # 连接客户端验证密码命令 

8、限制 clients

1maxclients 10000 # 设置连接 redis 客户端的最大连接数
2maxmemory <bytes> # redis 配置的最大内存容量
3maxmemory-policy noeviction # 内存达到上限之后的处理策略
4# volatile-lru:使用LRU算法删除键(只对设置了生存时间的键) 
5# allkeys-lru:使用LRU算法删除键
6# volatile-random:随机删除键(只对设置了生存时间的键)
7# allkeys-random:随机删除键
8# volatile-ttl:删除即将过去的键
9# noeviction:不删除键,只返回错误

9、appen only 模式 aof 配置

1appendonly no # 默认不开启aof模式的 ,默认使用的是rdb方式持久化,在大部分的情况下,rdb完全够用
2appendfilename "appendonly.aof" # 持久化的文件的名字
3
4# appendfsync always # 每次修改都会 sync,消耗性能
5appendfsync everysec # 每秒执行一次 sync,可能会丢失这 1s 的数据
6# appendfsync no # 不执行sync,这个时候操作系统自己同步数据,速度最快

标题:Redis 事务和配置文件
作者:Yi-Xing
地址:http://zyxwmj.top/articles/2021/03/01/1614587895599.html
博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!