前言
Redis持久化
先来两条结论:
- Redis支持RDB和AOF两种模式的持久化
- 两种模式各有特点,根据业务中数据需求搭配使用
RDB
是默认的模式,Redis对于RDB格式可以采用压缩算法,将文件压缩的非常小,利于将数据同步到子节点,由参数rdbcompression
控制。当符合一定条件时,会将内存中的数据生成一个快照持久化到硬盘
快照触发的条件
- 在redis.conf中配置,有多种规则
- 执行save或bgsave命令
- 执行flushall命令
-
特点
一旦Redis异常退出,可能有数据丢失
- Redis会fork一个子进程来处理快照工作,如何数据量大,fork时间会很长,Redis会停止处理客户端的请求
- RDB文件是二进制压缩的,占用空间小,利于传输
- 生成快照的期间不会修改RDB文件,快照结束后,才会替换就的RDB文件
AOF
每执行一条修改数据的的命令,就会将该命令写到磁盘的AOP文件中,默认不开启,需要在redis.conf中配置
AOF持久化
将命令缓冲到操作系统缓存区,在redis.conf中配置将缓存中的数据持久化到文件的策略
特点
- 能够保证数据安全性
- 性能会差一点
RDB和AOF的选择
如果数据重要,可以使用RDB+AOF;如果只是缓存作用,就使用RDB就行
Redis事务
先来两条结论:
- Redis的事务是弱事务
- Redis的事务本质是个队列
事务使用
正常使用
127.0.0.1:6379> multi # 表示开启事务
OK
127.0.0.1:6379> set tt1 1 # 将要执行的命令放入队列中
QUEUED # 显示已经将命令放入队列中
127.0.0.1:6379> set tt2 2 # 将要执行的命令放入队列中
QUEUED
127.0.0.1:6379> exec # 执行事务,命令队列中的命令集合
1) OK # 第1个命令执行结果ok
2) OK # 第2个命令执行结果ok
语法错误
语法错误会导致整个事务的命令都不执行
127.0.0.1:6379> multi # 表示开启事务
OK
127.0.0.1:6379> set tt1 1
QUEUED
127.0.0.1:6379> setss tt2 2 # 语法错误
(error) ERR unknown command `setss`, with args beginning with: `tt2`, `2`,
127.0.0.1:6379> exec # 执行失败,队列中的命令被discard了
(error) EXECABORT Transaction discarded because of previous errors.
运行错误
运行错误会执行正确的命令,错误的不会执行
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set tt1 1
QUEUED
127.0.0.1:6379> lpush tt1 1 2 3
QUEUED
127.0.0.1:6379> exec
1) OK # 第一条命令执行成功,第二条执行失败
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
说它是弱事务是因为不支持回滚(也因此Redis的性能更高)
**
Redis使用lua
Mac 安装
lua语法和其它安装参考:菜鸟教程
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make macosx test
make install
lua编写HelloWorld
# 创建文件并进入编辑
vi HelloWorld.lua
# 在vim中编写,保存退出
print('Hello World!')
# 执行,控制台会打印出:Hello World!
lua HelloWorld.lua
Redis中运行lua脚本
# 创建文件并进入编辑
vi test-redis-string.lua
# 调用mset命令,保存值
redis.call("mset",KEYS[1],ARGV[1],KEYS[2],ARGV[2]);
# 调用mget命令,获取值
return redis.call("mget",KEYS[1],KEYS[2])
# 执行,控制台会打印zhangsan,lisi并且redis中也会保存
# --eval 执行后面的lua脚本 test-redis-string.lua
# -a 123456 是我redis设置了密码为123456
# n1 n2是key,用KEYS[1] KEYS[2]接收,zhangsan lisi是value,用ARGV[1] ARGV[2]接收
# key和value中间的逗号“,”用来区分key和value,记住一定要有空格!!!
./redis-cli -a 123456 --eval test-redis-string.lua n1 n2 , zhangsan lisi
# 创建文件并进入编辑
vi test-redis-list.lua
# 获取key
local key = KEYS[1]
# 调用lpush,保存key的value为 zhang san
redis.call("lpush",key,"zhang san");
# 获取该key的list所有内容
local list = redis.call("lrange",key,0,-1);
# 返回list的值
return list;
# 执行,控制台会打印zhang san,并且redis中也会保存(-a 123456 是我redis设置了密码为123456)
# name是传入的值,也就是KEYS[1]接收到的值
./redis-cli -a 123456 --eval test-redis-list1.lua name
请你相信我所说的都是错的