Redis高级实用特性
1.安全性
2.主从复制
3.事务处理
4.持久化机制
5.发布订阅信息
6.虚拟内存的使用
1.安全性
一秒钟可以做15000次,防止暴力破解
修改配置文件:
requirepass beijing
重启redis服务
auth lamplijie //获取授权的一种方式
另一中授权方式:
redis-cli -a lamplijie //lamplijie是密码
2.主从复制
允许多个salve server拥有和master server相同
的版本。
(1)master可以拥有多个salve
(2)多个slave可以连接同一master外,还可以连接到其它slave
(3)主从复制不会阻塞master,在同步数据时,master可以继续处理
client请求
(4)提高系统的伸缩性
Redis主从复制的具体过程:
(1)Slave与master建立连接,发送sync同步命令;
(2)Master会启动一个后台进程,将数据库快照保存到文件中,
同时master主进程会开始收集新的写命令并缓存;
(3)到后台完成保存后,就将次文件发送给slave
4.slave将此文件保存到硬盘上
配置主从服务器:
在salve的redis.conf中配置
配置slave服务器,只需要在slave的配置文件中加入以下配置:
slaveof 192.168.1.1 6379 #指定master的ip和端口
masterauth lamp #这是主机的密码
在info可以看到当前服务器的role
3.事务处理
Redis对事务的处理,只能保证一个client
发起的事物中的命令可以连续的执行,而中间
不会插入其它client的命令。当一个client在一个
连接中发出multi命令是,这个连接会进入一个事务上下文,
该连接的后续的命名不会立即执行,而是先放到一个队列中,
当执行exec命令是,redis会顺序的执行队列中的所有命令。
multi
set age 10
set age 20
exec
get age
"20"
discard:取消当前的事务所有命令,实质清空队列
达到事务回滚的效果
如果队列中某个命令错误,不会回滚。
有待改进:
乐观锁:
基于数据库的版本的记录机制实现的。
为数据增加一个版本标识,在基于数据库表的版本解决方案中,
一般是通过为数据库表添加一个“vesion”字段来实现读取出数据时,
将此版本号一同读出,之后更新时,对此版本号加1.此时,将提交数据
的版本号与数据库对应记录的版本号进行对比,如果提交的数据版本号
大于数据库的版本号,则更新,否则认为过期数据。
Redis乐观锁实例:假设有个一个age的key,我们开了2个session来对
age进行赋值操作,我们来看一下结果如何:
watch命令会监视给定的key,当exec到时候如果监视的key从调用
watch后发生过变化,则整个事物会失败。
也可以调用watch多次监视多个key。这样就可以对指定的key加
乐观锁了,注意watch的key是对整个连接有效的,事物也一样。
如果连接断开了,监视和事物都会被自动清除。当然了exec,discard
,unwatch命令都会清除连接中所有监视。
第一步:
session 1:
get age //查看age当前值
watch age //watch age,启动乐观锁
multi //开始事物
第二步:
session 2:
set age 30
ok
get age 30
第四步:
session 1:
set age 20
QUEUED
exec
get age
“30” //不是20,执行失败
4.持久化机制
Redis是一个支持持久化的内存数据库,也就是
说redis需要经常将内存中数据同步到硬盘保证
持久化。
支持2中方式:
1.snapshotting(快照)也是默认方式:
把数据写到二进制文件,默认的文件名为
dump.rdb.可以通过配置设置自动做快照,可以配置
redis在n秒内如果超过m个key修改就保存。
redis.conf:
save 900 1 //900秒内如果超过1个key被修改,则发起快照
保存
2.Append-only file(aof)的方式
由于快照方式在一定间隔时间做一次,所以如果
redis意外down掉的话,就会丢失最后一次快照后
的所有修改。
aof比快照方式有更好的持久性,是由于在使用aof时,
redis会将每一个收到的命令都通过write函数追加到文件中
,当redis重启时,会通过重新执行文件保存的写命令来在内存
中重建整个数据库的内容。
aof方式:
当让由于os会在内核中缓存write做的修改,所以可能不是立即写到
磁盘上的,这样aof方式的持久化也是有可能丢失部分修改的。
可以通过配置文件告诉redis我们要通过fsync函数强制os写入到磁盘的
时机,有3种方法:
appendonly yes //启用aof持久化
(1)appendfsync always //收到命令就立即写入磁盘,最慢,但保证持久化
(2)appendfsync everysec //每秒钟写入一次磁盘,折中
(3)appendfsync no //完全依赖os,性能最好,持久化没保证
5.发布订阅信息
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除
消息发布者和消息订阅者之间的耦合,Redis作为一个pub/sub的
server,在订阅者和发布者之间起到了消息路由的功能。
订阅者可以通过subscribe和psubscribe命令向redis server订阅自己
感兴趣的消息类型,redis将信息类型称为通道(channel).当发布
者通过publish命令向redis server发送特定类型的信息时,定阅该信息
类型的全部client都会收到此信息。
例子:
起3个连接:
在第一个连接:
subscribe tv1
在第二个连接:
subscribe tv1 tv2
在第三个连接:
psubscribe tv1 hello
6.虚拟内存的使用
Redis的虚拟内存与操作系统的虚拟内存不是一回事,
但思路和目的是相同的。就是暂时把不经常访问
的数据从内存交换到磁盘中,从而腾出宝贵的内存空间
用于其他需要访问的数据中。尤其是对于redis这样的内存数据库
,内存总是不够用的。出来可以将数据分割到多个redis server
之外。另外,能够提高数据库容量的办法就是使用虚拟内存把
哪些不经常访问的数据交换到磁盘上。
下面是vm相关配置:
vm-enabled yes //开启vm功能
vm-swap-file /tmp/redis.swap //交换出来的value保存的文件路径
vm-max-memory 1000000 //redis使用的最大内存上限
vm-page-size 32 //每个页面的大小为32字节
vm-pages 134217728 //最多使用多少页面
vm-mx-threads 4 //用于执行value对象换入的工作线程数量
再加入:really-use-vm yes
1.安全性
2.主从复制
3.事务处理
4.持久化机制
5.发布订阅信息
6.虚拟内存的使用
1.安全性
一秒钟可以做15000次,防止暴力破解
修改配置文件:
requirepass beijing
重启redis服务
auth lamplijie //获取授权的一种方式
另一中授权方式:
redis-cli -a lamplijie //lamplijie是密码
2.主从复制
允许多个salve server拥有和master server相同
的版本。
(1)master可以拥有多个salve
(2)多个slave可以连接同一master外,还可以连接到其它slave
(3)主从复制不会阻塞master,在同步数据时,master可以继续处理
client请求
(4)提高系统的伸缩性
Redis主从复制的具体过程:
(1)Slave与master建立连接,发送sync同步命令;
(2)Master会启动一个后台进程,将数据库快照保存到文件中,
同时master主进程会开始收集新的写命令并缓存;
(3)到后台完成保存后,就将次文件发送给slave
4.slave将此文件保存到硬盘上
配置主从服务器:
在salve的redis.conf中配置
配置slave服务器,只需要在slave的配置文件中加入以下配置:
slaveof 192.168.1.1 6379 #指定master的ip和端口
masterauth lamp #这是主机的密码
在info可以看到当前服务器的role
3.事务处理
Redis对事务的处理,只能保证一个client
发起的事物中的命令可以连续的执行,而中间
不会插入其它client的命令。当一个client在一个
连接中发出multi命令是,这个连接会进入一个事务上下文,
该连接的后续的命名不会立即执行,而是先放到一个队列中,
当执行exec命令是,redis会顺序的执行队列中的所有命令。
multi
set age 10
set age 20
exec
get age
"20"
discard:取消当前的事务所有命令,实质清空队列
达到事务回滚的效果
如果队列中某个命令错误,不会回滚。
有待改进:
乐观锁:
基于数据库的版本的记录机制实现的。
为数据增加一个版本标识,在基于数据库表的版本解决方案中,
一般是通过为数据库表添加一个“vesion”字段来实现读取出数据时,
将此版本号一同读出,之后更新时,对此版本号加1.此时,将提交数据
的版本号与数据库对应记录的版本号进行对比,如果提交的数据版本号
大于数据库的版本号,则更新,否则认为过期数据。
Redis乐观锁实例:假设有个一个age的key,我们开了2个session来对
age进行赋值操作,我们来看一下结果如何:
watch命令会监视给定的key,当exec到时候如果监视的key从调用
watch后发生过变化,则整个事物会失败。
也可以调用watch多次监视多个key。这样就可以对指定的key加
乐观锁了,注意watch的key是对整个连接有效的,事物也一样。
如果连接断开了,监视和事物都会被自动清除。当然了exec,discard
,unwatch命令都会清除连接中所有监视。
第一步:
session 1:
get age //查看age当前值
watch age //watch age,启动乐观锁
multi //开始事物
第二步:
session 2:
set age 30
ok
get age 30
第四步:
session 1:
set age 20
QUEUED
exec
get age
“30” //不是20,执行失败
4.持久化机制
Redis是一个支持持久化的内存数据库,也就是
说redis需要经常将内存中数据同步到硬盘保证
持久化。
支持2中方式:
1.snapshotting(快照)也是默认方式:
把数据写到二进制文件,默认的文件名为
dump.rdb.可以通过配置设置自动做快照,可以配置
redis在n秒内如果超过m个key修改就保存。
redis.conf:
save 900 1 //900秒内如果超过1个key被修改,则发起快照
保存
2.Append-only file(aof)的方式
由于快照方式在一定间隔时间做一次,所以如果
redis意外down掉的话,就会丢失最后一次快照后
的所有修改。
aof比快照方式有更好的持久性,是由于在使用aof时,
redis会将每一个收到的命令都通过write函数追加到文件中
,当redis重启时,会通过重新执行文件保存的写命令来在内存
中重建整个数据库的内容。
aof方式:
当让由于os会在内核中缓存write做的修改,所以可能不是立即写到
磁盘上的,这样aof方式的持久化也是有可能丢失部分修改的。
可以通过配置文件告诉redis我们要通过fsync函数强制os写入到磁盘的
时机,有3种方法:
appendonly yes //启用aof持久化
(1)appendfsync always //收到命令就立即写入磁盘,最慢,但保证持久化
(2)appendfsync everysec //每秒钟写入一次磁盘,折中
(3)appendfsync no //完全依赖os,性能最好,持久化没保证
5.发布订阅信息
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除
消息发布者和消息订阅者之间的耦合,Redis作为一个pub/sub的
server,在订阅者和发布者之间起到了消息路由的功能。
订阅者可以通过subscribe和psubscribe命令向redis server订阅自己
感兴趣的消息类型,redis将信息类型称为通道(channel).当发布
者通过publish命令向redis server发送特定类型的信息时,定阅该信息
类型的全部client都会收到此信息。
例子:
起3个连接:
在第一个连接:
subscribe tv1
在第二个连接:
subscribe tv1 tv2
在第三个连接:
psubscribe tv1 hello
6.虚拟内存的使用
Redis的虚拟内存与操作系统的虚拟内存不是一回事,
但思路和目的是相同的。就是暂时把不经常访问
的数据从内存交换到磁盘中,从而腾出宝贵的内存空间
用于其他需要访问的数据中。尤其是对于redis这样的内存数据库
,内存总是不够用的。出来可以将数据分割到多个redis server
之外。另外,能够提高数据库容量的办法就是使用虚拟内存把
哪些不经常访问的数据交换到磁盘上。
下面是vm相关配置:
vm-enabled yes //开启vm功能
vm-swap-file /tmp/redis.swap //交换出来的value保存的文件路径
vm-max-memory 1000000 //redis使用的最大内存上限
vm-page-size 32 //每个页面的大小为32字节
vm-pages 134217728 //最多使用多少页面
vm-mx-threads 4 //用于执行value对象换入的工作线程数量
再加入:really-use-vm yes