前言

介绍Redis中的几个特性

Redis持久化

先来两条结论:

  1. Redis支持RDB和AOF两种模式的持久化
  2. 两种模式各有特点,根据业务中数据需求搭配使用

RDB

是默认的模式,Redis对于RDB格式可以采用压缩算法,将文件压缩的非常小,利于将数据同步到子节点,由参数rdbcompression控制。当符合一定条件时,会将内存中的数据生成一个快照持久化到硬盘

快照触发的条件

  1. 在redis.conf中配置,有多种规则
  2. 执行save或bgsave命令
  3. 执行flushall命令
  4. 第一次执行主从复制

    特点

  5. 一旦Redis异常退出,可能有数据丢失

  6. Redis会fork一个子进程来处理快照工作,如何数据量大,fork时间会很长,Redis会停止处理客户端的请求
  7. RDB文件是二进制压缩的,占用空间小,利于传输
  8. 生成快照的期间不会修改RDB文件,快照结束后,才会替换就的RDB文件

    AOF

    每执行一条修改数据的的命令,就会将该命令写到磁盘的AOP文件中,默认不开启,需要在redis.conf中配置

AOF持久化

将命令缓冲到操作系统缓存区,在redis.conf中配置将缓存中的数据持久化到文件的策略

特点

  1. 能够保证数据安全性
  2. 性能会差一点

RDB和AOF的选择

如果数据重要,可以使用RDB+AOF;如果只是缓存作用,就使用RDB就行

Redis事务

先来两条结论:

  1. Redis的事务是弱事务
  2. Redis的事务本质是个队列

事务使用

正常使用

  1. 127.0.0.1:6379> multi # 表示开启事务
  2. OK
  3. 127.0.0.1:6379> set tt1 1 # 将要执行的命令放入队列中
  4. QUEUED # 显示已经将命令放入队列中
  5. 127.0.0.1:6379> set tt2 2 # 将要执行的命令放入队列中
  6. QUEUED
  7. 127.0.0.1:6379> exec # 执行事务,命令队列中的命令集合
  8. 1) OK # 第1个命令执行结果ok
  9. 2) OK # 第2个命令执行结果ok

语法错误

语法错误会导致整个事务的命令都不执行

  1. 127.0.0.1:6379> multi # 表示开启事务
  2. OK
  3. 127.0.0.1:6379> set tt1 1
  4. QUEUED
  5. 127.0.0.1:6379> setss tt2 2 # 语法错误
  6. (error) ERR unknown command `setss`, with args beginning with: `tt2`, `2`,
  7. 127.0.0.1:6379> exec # 执行失败,队列中的命令被discard了
  8. (error) EXECABORT Transaction discarded because of previous errors.

运行错误

运行错误会执行正确的命令,错误的不会执行

  1. 127.0.0.1:6379> multi
  2. OK
  3. 127.0.0.1:6379> set tt1 1
  4. QUEUED
  5. 127.0.0.1:6379> lpush tt1 1 2 3
  6. QUEUED
  7. 127.0.0.1:6379> exec
  8. 1) OK # 第一条命令执行成功,第二条执行失败
  9. 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value

说它是弱事务是因为不支持回滚(也因此Redis的性能更高)
**

Redis使用lua

Mac 安装

lua语法和其它安装参考:菜鸟教程

  1. curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
  2. tar zxf lua-5.3.0.tar.gz
  3. cd lua-5.3.0
  4. make macosx test
  5. make install

lua编写HelloWorld

  1. # 创建文件并进入编辑
  2. vi HelloWorld.lua
  3. # 在vim中编写,保存退出
  4. print('Hello World!')
  5. # 执行,控制台会打印出:Hello World!
  6. lua HelloWorld.lua

Redis中运行lua脚本

  1. # 创建文件并进入编辑
  2. vi test-redis-string.lua
  3. # 调用mset命令,保存值
  4. redis.call("mset",KEYS[1],ARGV[1],KEYS[2],ARGV[2]);
  5. # 调用mget命令,获取值
  6. return redis.call("mget",KEYS[1],KEYS[2])
  7. # 执行,控制台会打印zhangsan,lisi并且redis中也会保存
  8. # --eval 执行后面的lua脚本 test-redis-string.lua
  9. # -a 123456 是我redis设置了密码为123456
  10. # n1 n2是key,用KEYS[1] KEYS[2]接收,zhangsan lisi是value,用ARGV[1] ARGV[2]接收
  11. # key和value中间的逗号“,”用来区分key和value,记住一定要有空格!!!
  12. ./redis-cli -a 123456 --eval test-redis-string.lua n1 n2 , zhangsan lisi
  1. # 创建文件并进入编辑
  2. vi test-redis-list.lua
  3. # 获取key
  4. local key = KEYS[1]
  5. # 调用lpush,保存key的value为 zhang san
  6. redis.call("lpush",key,"zhang san");
  7. # 获取该key的list所有内容
  8. local list = redis.call("lrange",key,0,-1);
  9. # 返回list的值
  10. return list;
  11. # 执行,控制台会打印zhang san,并且redis中也会保存(-a 123456 是我redis设置了密码为123456)
  12. # name是传入的值,也就是KEYS[1]接收到的值
  13. ./redis-cli -a 123456 --eval test-redis-list1.lua name

请你相信我所说的都是错的