Redis高级应用特性
1、安全性
2、主从复制
3、事务处理
4、持久化机制
5、发布订阅消息
6、虚拟内存的使用
安全性
设置客户端连接后进行任何其他指定前需要使用的密码。
警告:因为redis速度相当快,所以在1台比较好的服务器下,一个外部的用户可以在1秒中进行150k次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。
方式:
在redis的配置文件中加入:requirepass password //password为自己设定
之后进入:
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
授权方式:
1、127.0.0.1:6379> auth guozhen123
OK
127.0.0.1:6379> keys *
(empty list or set)
2、在开启redis的时候授权:
D:Program Files edisRedis>redis-cli -a guozhen123
127.0.0.1:6379> keys *
(empty list or set)
主从复制
Redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master server相同的数据库副本
redis主从复制的特点:
1、Master可以拥有对个slave
2、多个slave可以连接同一个master外,还可以连接到其他slave
3、主从复制不会阻塞master,同步数据时,master可以继续处理client请求
4、提高系统的伸缩性
配置从服务器:
配置slave服务器很简单,只需要在slave的配置文件中加入以下配置:
slaveof 192.168.1.1 6379 #指定master的ip和端口
masterauthlamp #这是主机的密码
可以通过info命令查看当前redis的状态,是主还是从:
事务处理
Redis对事务的支持目前还比较简单。Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序执行队列中的命令
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 10
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> get age
"20"
取消事务:discard命令
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 100
QUEUED
127.0.0.1:6379> set age 200
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get age
"20"
事务处理的缺陷:
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> get name
"guozhen"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr name
QUEUED
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> exec
1) (error) ERR value is not an integer or out of range
2) (integer) 21
发生错误不回滚所有操作。
乐观锁:
大多数是基于数据版本(version)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个“version”字段开实现读取数据时,将此版本号一同读出,之后更新时,对此版本号加1.此时,将提交数据的版本号与数据表对应记录的当前版本号进行对比,如果提交的数据版本号大于当前的数据版本号,则予以更新,否则认为是过期数据。
比如:版本控制器svn就肯定乐观锁的实现。首先中央仓库和个人仓库中的版本号都一致。如果拉下来的进行了修改,本地对应的锁自增。然后提交到中央仓库后中央仓库的锁变成提交者的锁,之后就乐观锁控制。
乐观锁复杂事务控制:
实例:假设有一个age的key,我们开两个session来对age进行赋值操作,我们下面来看一下结果如何
(1)、session1
redis 127.0.0.1:6379> get age
"10"
redis 127.0.0.1:6379> watch age
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379>
(2)session2
redis 127.0.0.1:6379> set age 30
OK
redis 127.0.0.1:6379> get age
"30"
redis 127.0.0.1:6379>
(3)session1
redis 127.0.0.1:6379> set age 20
QUEUED
redis 127.0.0.1:6379> exec
(nil)
redis 127.0.0.1:6379> get age
"30"
redis 127.0.0.1:6379>
监视发现对age有更改,就不允许事务执行成功。这就是乐观锁的事务控制。
watch命令会监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,整个事务会失败。也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了。注意watch的key是对整个连接有效的,事务也是一样。如果连接断开,监视和事务都被自动清除。当然exec,discard,unwatch命令都会清除连接中的所有监视。
持久化机制
Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化。
redis支持两种持久化方法:
snapshotting(快照)也是默认方式
Append-only file(缩写aof)的方式
snapshotting方式
快照是默认的持久化方式。这种方式时将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照。
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内如果超过10个key被修改,则发起快照保存
save 60 10000
快照保存的是数据,二进制文件。
aof方式
由于快照方式是在一定间隔时间做一次的,所以如果redis以外down掉的话,就会丢失最后一次快照后的所有修改。
aof比快照方式有更好的持久化,是由于在使用aof时,redis会将每一个受到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保的写命令来重建整个数据库的内容。
当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化还是有可能会丢失部分修改。
可以通过配置文件高数redis我们想要通过fsync函数强制os写入磁盘的时机。
appendonlyfile yes #启用aof持久化方式
#appendfsnc always //受到写命令就立即写入磁盘,最慢,但是保证完全的持久化
#appendfsync everysec //每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
#appendfsync no //完全依赖os,性能最好,持久化没保证
aof持久化的是写操作,以字符串类型存储。
发布以及订阅消息
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合。Redis作为一个pub/sub的server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和pubscribe命令向redis server订阅自己感兴趣的消息,redis将信息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的信息时,订阅该信息类型的全部client都会收到此消息。
session1:
127.0.0.1:6379> subscribe tv2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "tv2"
3) (integer) 1
1) "message"
2) "tv2"
3) "welcome to shanghai"
session2:
127.0.0.1:6379> subscribe tv1 tv2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "tv1"
3) (integer) 1
1) "subscribe"
2) "tv2"
3) (integer) 2
1) "message"
2) "tv1"
3) "nice to meet you"
1) "message"
2) "tv2"
3) "welcome to shanghai"
session3:
127.0.0.1:6379> publish tv1 "nice to meet you"
(integer) 1
127.0.0.1:6379> publish tv2 "welcome to shanghai"
(integer) 2
虚拟内存的使用
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-max-threads 4 #用于执行value对象换入工作线程数量
really-use-vm yes #再次确认使用vm