Redis的学习之旅

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 yesno 改成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.主从通信过程

image.png

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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342