Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
1.redis的特点
(1)redis具有非常高的读写性能,读的性能是110000次/s,写的性能是81000次/s。
(2)支持的数据类型丰富,包括String(字符串),List(链表),Hash(哈希),SET(集合),ZSET(有序集合)
(3)数据是缓存在内存里面的,可以把数据同步到硬盘里,导致断电不会丢失。
(4)所有命令的执行都是原子性。
2.适合场合及优势
(1)高性能缓存,最常见的应用场景,(memcache)能干的他都能干。
(2)对类型数据结构,适用各种类型数据。
(3)redis分布式存储。
(4)数据有生命周期,redis的键可以设置过期时间 ,一段时间以后自动删除。
(5)高并发和海量数据的处理。
(6)数据持久化,数据存储到硬盘了,服务器断电不丢失。
5.与memcache的比较
(1)数据类型:memcache支持的数据类型只有String(字符串)类型,而redis支持的数据类型有String(字符串),List(链表),Hash(哈希),SET(集合),ZSET(有序集合)
(2)持久化 :memcache 数据是存储到内存中的,一旦断电或重启,则数据丢失,redis数据也是存储到内存中的,但是可以持久化,周期性的把数据保存到硬盘里,导致重启或断电也不会丢失数据。
(3)数据量 :memcache一个键存储的数据最大是1M,redis一个键存储的数据是1G。
6.启动
(1)使用vim打开配置文件redis.conf,修改如下参数:
daememonize yes 把 no 改成yes,让redis的进程在后台执行,不占据当前终端。
(2)redis-server 开启redis服务
~ % redis-server
35049:C 20 Aug 2020 13:28:46.604 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
35049:C 20 Aug 2020 13:28:46.604 # Redis version=5.0.2, bits=64, commit=00000000, modified=0, pid=35049, just started
35049:C 20 Aug 2020 13:28:46.604 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
35049:M 20 Aug 2020 13:28:46.606 * Increased maximum number of open files to 10032 (it was originally set to 256).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 5.0.2 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 35049
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
35049:M 20 Aug 2020 13:28:46.620 # Server initialized
35049:M 20 Aug 2020 13:28:46.624 * DB loaded from disk: 0.004 seconds
35049:M 20 Aug 2020 13:28:46.624 * Ready to accept connections
(3)客户端连接redis
语法:redis-cli -h 主机ip -p 端口号
如果是连接本地,直接输入连接命令即可,redis-cli是客户端连接服务器的命令。
~ % redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
7.redis的数据类型
redis中的数据模型为 key / value 模型
1. String(字符串)
String 是redis 最基本的数据类型
Redis的string可以包含任何数据,包括序列化的对象,数组。
单个value值 最大上线是1G字节,如果只用string类型,redis就可以看作加上持久化特性(服务器重启之后不丢失)的memcache。
应用场景:缓存HTML页面,关系型数据库的查询结果,统计网站访问者的数量,每天注册用户数,统计活跃用户,用户在线状态等等。
(1)set
设置键,值
语法:set key value
返回值,设置成功返沪ok
注意:从新设置则直接覆盖
具体语法:set key value [expiration EX seconds I PX milliseconds] [NX |XX]
Ex seconds (生成时间:秒) | PX milliseconds (生存时间毫秒)
NX (仅键不存在是时设置) | XX 仅键存在时设置
127.0.0.1:6379> set name zhangshan
OK
(2) mset
语法:mset key value [key value]
同时设置多个key,如果key存在会被覆盖,该命令是原子的,所有的键会同时设置成功或失败,成功返回OK。
127.0.0.1:6379> mset name lisi age 18 sex 1
OK
(3) setex
语法:setex key seconds value
给一个键设置字符串类型,并指定生存时间(单位:秒),该命令是原子的,如果设置失败或指定时间失败,会恢复初始状态,
返回值:如果设置成功,返回ok,设置失败,返回失败信息。
127.0.0.1:6379> setex name 10 lisi
OK
127.0.0.1:6379> get name
"lisi"
127.0.0.1:6379> get name
(nil)
(4) setnx
语法:setnx key value
如果key不存在,将其设置为字符串类型,设置成功,如果该键已经存在,则设置失败,设置成功返回1 ,设置失败返回0
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> setnx name zhangshang
(integer) 0
127.0.0.1:6379> get name
"lisi"
127.0.0.1:6379> setnx height 180
(integer) 1
127.0.0.1:6379> get height
"180"
(5) get
获取key对应的string值,如果key不存在,则返回nil
语法:get key
如果key不是string类型,返回错误信息
127.0.0.1:6379> set name zhangfei
OK
127.0.0.1:6379> get name
"zhangfei"
(6) mget
语法:mget key [key key...]
查询多个key的值。
返回值,列出所有键key的值,绝不会执行失败,如果键是string类型,返回其值,如过键不存在或者不是string类型,返回nil
127.0.0.1:6379> mset name zhangfei age 18 email zhangfei@163.com
OK
127.0.0.1:6379> mget name age email
1) "zhangfei"
2) "18"
3) "zhangfei@163.com"
(7) strlen
语法:strlen key
返回key的字符串长度
返回值:字符串长度,如果key不存在则返回0,如果不是字符串类型,返回错误信息。
127.0.0.1:6379> set name zhangjiajia
OK
127.0.0.1:6379> strlen name
(integer) 11
(8) getset
语法:getset key value
原子的给一个key设置一个新值,并且将旧值返回,
返回值:如果key不是字符串类型,则返回一个错误
应用场景:比如获取计数器并且重置为0.
127.0.0.1:6379> set count 5
OK
127.0.0.1:6379> getset count 6
"5"
127.0.0.1:6379> get count
"6"
(9) incr
对key的值做加加操作,每执行一次值加一,值类型要是数据类型。
语法:incr key
将key中存储的值增一操作,如果key不存在,则key的值会被先初始化为0,然后再执行 incr 操作,key的值必须是整形。
127.0.0.1:6379> incr age
(integer) 1
127.0.0.1:6379> incr age
(integer) 2
127.0.0.1:6379> incr age
(integer) 3
127.0.0.1:6379> incr age
(integer) 4
127.0.0.1:6379> get age
"4"
(10) incrby
执行加法命令,可以指定相加的值。
语法:incrby key 相加的值
127.0.0.1:6379> incrby number 10
(integer) 10
127.0.0.1:6379> incrby number 10
(integer) 20
127.0.0.1:6379> get number
"20"
(11) decr/decrby
同incr/incrby,只是它是减的
127.0.0.1:6379> set age 100
OK
127.0.0.1:6379> decr age
(integer) 99
127.0.0.1:6379> decrby age 20
(integer) 79
2.Hash(哈希)
Redis中的哈希类型可以看成是具有key和value的容器,该类型非常适合存储对象信息,mysql中的一行数据,类似与关联数组。
(1)hset
设置hash里面的field和value的值
语法:hset key field value
127.0.0.1:6379> hset student name bajie
(integer) 1
(2) hget
获取哈希里面的field的值
语法: hget key field
127.0.0.1:6379> hset student name bajie
(integer) 1
127.0.0.1:6379> hget student name
"bajie"
(3) hmset
一次性设置多个field 和value
语法:hmset key field1 value1 field2 value2...
127.0.0.1:6379> hmset student name bajie age 2000 address china
OK
(4) hmget
一次性获取多个field的value
语法:hmget key field1 field2...
127.0.0.1:6379> hmset student name bajie age 2000 address china
OK
127.0.0.1:6379> hmget student name age address
1) "bajie"
2) "2000"
3) "china"
(5) hgetall
获取指定哈希中所有的field和value
语法:hgetall key
127.0.0.1:6379> hmset student name bajie age 2000 address china
OK
127.0.0.1:6379> hgetall student
1) "name"
2) "bajie"
3) "age"
4) "2000"
5) "address"
6) "china"
3.List(链表)
List类型其实就是一个字符串的双向链表,按照插入顺序排序,可以添加一个元素到链表的头部(左边)或者尾部(右边),一个链表做多可以包含2³²-1个元素。这使得list即可以用作栈,也可以用作队列。
应用场景:粉丝列表,最新文章,消息队列等。
上进下出:队列,特点,先进先出
(1)lpush
从链表的头部添加一个或多个元素
语法:lpush key value
操作为原子性操作,如果key不存在,一个空列表会被创建并执行lpush操作,返回执行lpush操作后链表的长度
127.0.0.1:6379> lpush student_list zhangshan
(integer) 1
127.0.0.1:6379> lpush student_list lisi wangwu
(integer) 3
(2) lrange
获取链表里的元素
语法:lrange key start strop
注意:如果start(开始下标)是0,strop(结束下标)是-1,则是返回链表中所有的元素。链表里面的元素序号是从0开始的,类似与索引数组。
(3) linsert
将元素插入到来链表中某个元素之前或之后
语法:linsert key before | after 链表中的某个元素 新的元素
如果命令执行成功,返回插入操作厚之后的链表长度,如果没有找到链表中的元素,返回-1,如果链表不存在或空链表,返回0.
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "lisi"
3) "zhangshan"
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "lisi"
3) "zhangshan"
127.0.0.1:6379> linsert student_list before lisi mazi
(integer) 4
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "mazi"
3) "lisi"
4) "zhangshan"
127.0.0.1:6379> linsert student_list after lisi xiaobai
(integer) 5
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "mazi"
3) "lisi"
4) "xiaobai"
5) "zhangshan"
(4) lset
修改链表中指定下标的元素,
语法:lset key index value
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "mazi"
3) "lisi"
4) "xiaobai"
5) "zhangshan"
127.0.0.1:6379> lset student_list 1 xiaoming
OK
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "xiaoming"
3) "lisi"
4) "xiaobai"
5) "zhangshan"
(5) lindex
返链表中指定下标的元素
语法:lindexn key index
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "xiaoming"
3) "lisi"
4) "xiaobai"
5) "zhangshan"
127.0.0.1:6379> lindex student_list 0
"wangwu"
127.0.0.1:6379> lindex student_list 1
"xiaoming"
(6) rpush
从链表的尾部添加元素
语法:rpush key value [value ...]
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "xiaoming"
3) "lisi"
4) "xiaobai"
5) "zhangshan"
127.0.0.1:6379> rpush student_list xiaohong xiaohei
(integer) 7
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "xiaoming"
3) "lisi"
4) "xiaobai"
5) "zhangshan"
6) "xiaohong"
7) "xiaohei"
127.0.0.1:6379>
(7) llen
返回链表的长度
语法:llen key
127.0.0.1:6379> llen student_list
(integer) 7
(8) lpop
返回链表中头部的元素,并删除。
语法:lpop key
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "xiaoming"
3) "lisi"
4) "xiaobai"
5) "zhangshan"
6) "xiaohong"
7) "xiaohei"
127.0.0.1:6379> lpop student_list
"wangwu"
127.0.0.1:6379> lrange student_list 0 -1
1) "xiaoming"
2) "lisi"
3) "xiaobai"
4) "zhangshan"
5) "xiaohong"
6) "xiaohei"
(9) lrem
删除链表中的元素
语法: lrem key count value
根据参数count 的值 ,删除链表中与value相等的元素
count>0 ,从表头开始向表尾搜索,删除与value 相等的元素,数量为count
count<0,从表尾开始向表头开始搜索,删除与value 相等的元素,数量为count
count=0,删除表中所有与value相等的值,
返回值,被删除的元素的数量
127.0.0.1:6379> lrange student_list 0 -1
1) "xiaoming"
2) "lisi"
3) "xiaobai"
4) "zhangshan"
5) "xiaohong"
6) "xiaohei"
127.0.0.1:6379> lrem student_list 0 xiaoming
(integer) 1
127.0.0.1:6379> lrange student_list 0 -1
1) "lisi"
2) "xiaobai"
3) "zhangshan"
4) "xiaohong"
5) "xiaohei"
(10) ltrim
保留指定范围的元素
语法:ltrim key 开始下标 结束下标
127.0.0.1:6379> lrange student_list 0 -1
1) "xiaoming"
2) "lisi"
3) "xiaobai"
4) "zhangshan"
5) "xiaohong"
6) "xiaohei"
127.0.0.1:6379> lrem student_list 0 xiaoming
(integer) 1
127.0.0.1:6379> lrange student_list 0 -1
1) "lisi"
2) "xiaobai"
3) "zhangshan"
4) "xiaohong"
5) "xiaohei"
127.0.0.1:6379> ltrim student_list 0 3
OK
127.0.0.1:6379> lrange student_list 0 -1
1) "lisi"
2) "xiaobai"
3) "zhangshan"
4) "xiaohong"
(11)rpop
删除并返回链表尾部的元素
127.0.0.1:6379> lrange student_list 0 -1
1) "lisi"
2) "xiaobai"
3) "zhangshan"
4) "xiaohong"
127.0.0.1:6379> rpop student_list
"xiaohong"
127.0.0.1:6379> lrange student_list 0 -1
1) "lisi"
2) "xiaobai"
3) "zhangshan"
4.Set(集合)
Redis的set是string类型的无序集合,
set元素最大可以包含(2³²-1 整型最大值)个元素。
set集合类型除了基本的添加,删除操作,还有其他的操作,包括集合的取并集(union),交集(intersection),差集(diffierence),通过这些操作可以很容易的实现sns中的好友推荐功能。
注意:每个集合中的各个元素不同重复。
该类型的应用场合:qq推荐。
(1)sadd
向集合中添加元素
语法:sadd key member [member ...]
127.0.0.1:6379> sadd friend zhnagsan
(integer) 1
127.0.0.1:6379> sadd friend lisi wangwu
(integer) 2
(2) smembers
获取集合中的元素。
语法:smembers key
127.0.0.1:6379> sadd friend zhnagsan
(integer) 1
127.0.0.1:6379> sadd friend lisi wangwu
(integer) 2
127.0.0.1:6379> smembers friend
1) "lisi"
2) "wangwu"
3) "zhnagsan"
(3) sdiff
获取集合中的差集。
获取集合中的差集(在集合1中存在,不在集合二中存在的元素)
语法:sdiff 集合1 集合2 ...
127.0.0.1:6379> sadd class1 xiaohei xiaobai xiaohong xiaolan xiaolv
5
127.0.0.1:6379> sadd class2 xiaohei xiaohua xiaohong xiaobei xiaoli
5
127.0.0.1:6379> sdiff class1 class2
xiaolv
xiaobai
xiaolan
(4) sinter
获取交集,(在两个集合中都存在的元素)
语法:sinter 集合1 集合2 ...
127.0.0.1:6379> sadd class1 xiaohei xiaobai xiaohong xiaolan xiaolv
5
127.0.0.1:6379> sadd class2 xiaohei xiaohua xiaohong xiaobei xiaoli
5
127.0.0.1:6379> sinter class1 class2
xiaohong
xiaohei
(5) sunion
求并集(两个集合合并后,去掉重复的元素)
语法:sunion 集合1 集合2...
127.0.0.1:6379> sadd class1 xiaohei xiaobai xiaohong xiaolan xiaolv
5
127.0.0.1:6379> sadd class2 xiaohei xiaohua xiaohong xiaobei xiaoli
5
127.0.0.1:6379> sunion class1 class2
xiaobei
xiaohei
xiaolv
xiaoli
xiaohong
xiaohua
xiaolan
xiaobai
(6)scard
获取集合中的个数
语法:scard key
127.0.0.1:6379> sadd class1 xiaohei xiaobai xiaohong xiaolan xiaolv
5
127.0.0.1:6379> sadd class2 xiaohei xiaohua xiaohong xiaobei xiaoli
5
127.0.0.1:6379> scard class1
5
127.0.0.1:6379> scard class2
5
5.Zset(有序集合)
Sorted set 是set 的一个升级版本,它在set的基础上增加了一个顺序属性(权职),这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。操作中的key 理解为zset 的名字。
(1)zadd
向有序集合中添加元素。如果该元素存在,则更新其顺序,
语法:zadd 集合名 序号 内容
127.0.0.1:6379> zadd friend 3 张三
1
(2) zrange
(把集合排序后,返回名次[start stop]的元素默认是升序排列
Withscores 是把score 也打印出来)
按序号升序获取有序集合中的内容
语法:zrange key start stop [WITHSCORES]
注意:下标不是序号,是数据的索引
127.0.0.1:6379> zadd friend 3 张三
0
127.0.0.1:6379> zadd friend 1 李四
0
127.0.0.1:6379> zadd friend 2 王五
1
127.0.0.1:6379> zrange friend 0 -1
李四
王五
张三
127.0.0.1:6379> zrange friend 0 -1 withscores
李四
1
王五
2
张三
3
(3) zrevrange
按序号降序获取有序集合中的内容 。
语法:zrevrange key start stop [WITHSCORES]
127.0.0.1:6379> zadd friend 3 张三
0
127.0.0.1:6379> zadd friend 1 李四
0
127.0.0.1:6379> zadd friend 2 王五
1
127.0.0.1:6379> zrevrange friend 0 -1
张三
王五
李四
127.0.0.1:6379> zrevrange friend 0 -1 withscores
张三
3
王五
2
李四
1
(4) zremrangebyrank
Zremrangebyrank 删除集合中排名在指定范围的元素(从小到大排序)
语法 zremrangebyrank key min max
127.0.0.1:6379> zadd friend 3 张三
0
127.0.0.1:6379> zadd friend 1 李四
0
127.0.0.1:6379> zadd friend 2 王五
1
127.0.0.1:6379> zremrangebyrank friend 0 1
2
127.0.0.1:6379> zrange friend 0 -1
张三
(5) zcard
语法:zcard key
返回集合中元素的个数
127.0.0.1:6379> zadd friend 3 zhangshan
1
127.0.0.1:6379> zadd friend 2 wangwu
1
127.0.0.1:6379> zadd friend 1 lisi
1
127.0.0.1:6379> zcard friend
3
(6) zscore
语法:zscore key 元素
返回给定元素对应的score
127.0.0.1:6379> zadd friend 3 zhangshan
1
127.0.0.1:6379> zadd friend 2 wangwu
1
127.0.0.1:6379> zadd friend 1 lisi
1
127.0.0.1:6379> zscore friend wangwu
2
8.redis的常用命令
redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以在Linux终端使用
- 键值相关的命令
- 服务器相关的命令
(1) xKeys
返回数据库里面的键,可以使用通配符,* 表示,任意多个,?任意一个字符。
127.0.0.1:6379> set name zhnagjiajia
OK
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> set email zhangjiajia@163.com
OK
127.0.0.1:6379> keys *
age
name
email
127.0.0.1:6379> keys ag*
age
(2)exists
判断一个键是否存在。
语法:exists 键名称 1 键名称 2....
返回值:1代表存在(表手存在的数量) 0 代表不存在
127.0.0.1:6379> set name zhnagjiajia
OK
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> set email zhangjiajia@163.com
OK
127.0.0.1:6379> keys *
age
name
email
127.0.0.1:6379> exists age
1
127.0.0.1:6379> exists height
0
(3)del
指定删除的键
语法:del key
127.0.0.1:6379> set name zhnagjiajia
OK
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> set email zhangjiajia@163.com
OK
127.0.0.1:6379> keys *
age
name
email
127.0.0.1:6379> del email
1
127.0.0.1:6379> keys *
age
name
(4)expire
设置键的有效期
语法:expire key 有效期(秒数)
127.0.0.1:6379> set name zhangjiajia
OK
127.0.0.1:6379> expire name 5
1
127.0.0.1:6379> get name
zhangjiajia
127.0.0.1:6379> get name
(5)ttl
返回一个键剩余的过期时间
127.0.0.1:6379> set name zhangjiajia
OK
127.0.0.1:6379> expire name 20
1
127.0.0.1:6379> ttl name
15
127.0.0.1:6379> ttl name
13
127.0.0.1:6379> ttl name
9
127.0.0.1:6379> ttl name
3
127.0.0.1:6379> ttl name
-2
127.0.0.1:6379> get name
(6)type
返回数据类型
语法:type key
127.0.0.1:6379> lpush student zhangshan
1
127.0.0.1:6379> type student
list
(7)Select
选择数据库,在redis里默认有0~15号数据库,默认是0号数据库,可以通过redis,conf配置文件进行设置。
切换数据库语法:select 数据库的编号
127.0.0.1:6379> select 1
OK
(8)dbsize
返回当前数据库里面键的个数
127.0.0.1:6379> keys *
age
student
127.0.0.1:6379> dbsize
2
(9)flushdb
清空当前数据库里面所有的键。(慎重使用)
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty list or set)
10)flushall
清空所有数据库里面的所有的键。(慎重使用)
9.安全认证
设置客户端连接后进行任何其他操作前需要使用的密码
方法:打开redis的配置文件(redis.conf)
#requirepass 设置的密码
注意:设置的密码是明文的,因此要对redis配置文件,进行严格的授权。
重启redis服务器,让密码生效
关闭redis服务,pkill redis-server
启动 redis-server
客户端验证方式
注意:如果没有通过验证,则无法操作
方式一:
通过客户端登入到服务器时,添加 -a 选项,语法:redis-cli -a 密码
~ % redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> ping
PONG
方式二:
登入到服务器端后,使用auth命令来完成验证。语法 auth 密码
通过命令行来设置密码(这种方式重启一下就无效了)
首先在终端连接redis服务器: redis-server
连接之后,可以先看看密码是否存在,使用命令 config get requirepass
如果没有密码,就只返回一个requirepass 字符串
如果有密码 那么第二行就是密码了
使用config set requirepass 密码 来进行设置密码。
之后的操作都需要用 auth 密码 命令来进行验证了
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
127.0.0.1:6379> config set requirepass 123456
OK
127.0.0.1:6379> config get requirepass
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "123456"
10.持久化机制
redis为了内存数据的安全考虑,会把内存中的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘中的数据恢复到内存(redis)的里面
数据保存到硬盘的过程就称为”持久化”效果。
redis支持两种此久化方式,
- snapshotting(快照) 默认方式
- append--only file(缩写 aof)的方式
1.snapshotting快照方式持久化
该持久化默认开启,一次性把redis中全部的数据保存一份存储到硬盘中(备份文件名字默认是dump,.rdb),如果数据非常多(10~20G)就不适合进行该持久化操作。
(1)工作原理
每隔N分钟N次写操作后,从内存dump数据形成rdb文件,压缩放在备份的目录中。
(2)如何开启,默认开启,有自己的触发条件,
Save 900 1 #900秒内如果超过1个key被修改,则发起快照保存。
Save 300 10 #300秒内如果超过10个key被修改,则发起快照保存。
Save 60 10000 #60秒内如果超过1000个key被修改,则发起快照保存。
注意:屏蔽该触发条件 ,即可关闭快照方式
(3) 可以设置保存的位置,和备份的文件名
备份文件名默认是dump.php,我们可以自己修改,
可以通过配置文件来完成修改
dbfilename dump.rdb
Dir ./
(4)手动发起快照
两种方式完成手动保存
方式一:在登入状态
则直接执行bgsave 即可
方式二:在没有登入状态
redis-cli bgsave -a 密码
手动发起一次快照保存操作
(5) 缺点
由于快照方式是在一定间隔做一次的,如果redis意外down掉的话,就会丢失最后一次快照后的所有修改
2.append-only-file 追加方式此久化AOF
本质:把用户执行的每个“写”指定(添加,修改,删除)都备份到文件中。还原数据的时候就是执行具体写指令而已
(1) 如何开启
appendonly yes //启用 aof此久化方式,
appendfilename appendonly.aof //保存命令的文件(可以指定路径)
打开redis.conf 配置文件 ,进行修改配置
(2) 触发条件
# appenddfsync aways //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全此久化,不推荐使用。
appendfsync no //每秒种强制写入磁盘一次,在性能和此久化方面做了很好的折中,推荐
#appendsync no //完全依赖 os 性能最好,此久化没保证
3.其他问题说明
注:在dump rdb过程中,aof 如果停止同步,会不会丢失
答:不会,所有的操作缓存在内存的队列里,dump完成后,统一操作。
注:aof重写是值什么?
答:aof中的重写是指把内存中的数据逆化成命令,写入到.aof日志里,已解决oaf日志过大的问题
问:如果rbd文件,和aof文件都存在,优先用谁来恢复数据?
答:aof。
问:2种是否可以同时用?
答:可以,而且推荐这么做。
问:恢复时 rbd 和aof哪个恢复的快。
答:rbd快,因为其是数据的映射,直接载入到内存,而aof是命令,需要逐条执行。
注意点:如果两种此久化方式都开启,则已aof为准,虽然快照方式恢复速度快,但是最终aof给覆盖,所以两种方式都开启时,以aof为准。
11.主从复制
1.什么是主从复制
网站运行,mysql 的写入,读取操作的sql 语句比例:1:7。
mysql为了降低每个服务器负载,可以设置读写分类(有写服务器,有读取服务器)
为了降低每个redis服务器的负载,可以多设置几个,并做主从模式。
一个服务器负载“写”(添加,修改,删除)数据,其他服务 器负载“读”数据,
主服务器数据会“自动” 同步给从服务器
Redis 支持简单易用的主从复制(master-slave-replication)功能,该功能可以让从服务器(slave server)称为主服务器(master server)的精确复制品。
作用:
主从备份,防止主服务器宕机;
读写分离,分担主服务器的任务;
任务分离,从服务器分别担任备份工作和计算工作。
注意点:
redis使用异步复制
一个主服务器可以有多个从服务器。
不仅主服务器可以有从服务器,从服务器也可以有自己的从服务器。
复制功能不能回阻塞主,从服务器。
2.主从通信过程
3.具体配置步骤
配置操作
主服务器配置:
(1)bind 127.0.0.1 改为 #bind 127.0.0.1
(2)Protected-model yes 改为 protected-model no 关闭保护模式
从服务器配置:
(1)通过slaveof 指定自己的角色,主服务器的地址和IP
slaveof 主服务器ip 端口号
(2)从服务器只读
从redis2.6开始,从服务器支持只读模式,通过slave-read-only配置项配置,该模式为从服务器的默认模式
(3)指定从服务器连接主服务器的密码
如果主服务器通过requirepass 选项设置了密码,为了让从服务器同步操作顺利进行,通过masterauth配种连接主服务器的密码。
4.Redis 主从复制的缺陷
每次slave服务器断开后,无论是主动断开,还是网络故障,再连接master,从服务器都要从master服务器全部dump出来rdb,再aof;即同步的过程都要重新执行一遍,所以要记住如果是多台服务器时,不要一下子都启动起来
12.Redis中的事务
Redis支持简单的事务
1.redis与mysql的事务对比
mysql | redis | |
---|---|---|
开启 | start transaction | multi |
语句 | 普通sql | 普通命令 |
失败 | rollback回滚 | discard取消 |
成功 | commit | exec |
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set ticket 1
QUEUED
127.0.0.1:6379> set money 100
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> keys *
1) "money"
2) "ticket"
2.watch命令
watch命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到exce命令(事务中的命令是在exec之后才执行的,exec命令执行完之后被监控的键会自动被unwatch)