redis简单学习4-redis高级实用特性简单学习

1.安全性


设置客户端连接后进行任何其他指定前需要使用的密码 
警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150K次的密码尝试 
这意味着你需要指定非常非常强大的密码来防止暴力破解 


修改密码: 
redis-conf配置文件中修改 
# requirepass foobared 
requirepass beijing 
修改密码后需要重启redis 
关闭redis 
pkill redis-server 


启动一个客户端 
[root@localhost redis-2.2.12]# src/redis-cli 
redis 127.0.0.1:6379> keys * 
(error) ERR operation not permitted 
这里显示权限被禁止,我们来设置一下权限 
redis 127.0.0.1:6379> auth beijing 
ok 
redis 127.0.0.1:6379> keys * 
1) "name" 


如果不想每次执行命令的时候都输入授权信息 
在登陆的时候就指定授权信息 
[root@localhost redis-2.2.12]#
src/redis-cli -a beijing 
redis 127.0.0.1:6379> keys * 
1) "name" 

2.主从复制


Redis
主从复制配置和使用都非常简单 
通过主从复制可以允许多个slave server 拥有和 master server 相同的数据库副本 


Redis主从复制特点: 
1
master可以拥有多个slave 
2
)多个slave可以连接同一个master外,还可以连接到其他slave 
3
)主从复制不会阻塞master,在同步数据时,master可以继续处理client请求 
4
)提高系统的伸缩性 


redis
主从复制过程: 
1
slavemaster建立连接,发送sync同步命令 
2
master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存 
3
)后台完成保存后,就将此文件发送给slave 
4
slave将此文件保存到硬盘上 


配置主从服务器: [记得重启一下slave - redis]
配置slave服务器很简单,只需要在slave的配置文件中加入如下配置: 
slaveof 192.168.1.1 6379 #
指定masterip和端口 
masterauth lamp #
这是主机的密码 
如何判断哪个是master哪个是slave 
只需要调用info就可以得到主从的信息 
在从库执行info 
redis 127.0.0.1:6379> info 
role:slave 
master_host:localhost 
master_port:6379 
master_link_status:up 
master_last_io_seconds_ago:10 
master_sync_in_progress:0 
db0:keys=1,expires=0 
主服务器上执行info 
role:master 

3.事务处理

redis对事务的支持目前还比较简单,redis只能保证一个client发起的事务中的命令可以连续的执行 
而中间不会插入其他client的命令 
当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文 
该连接后续的命令不会立即执行 
而是先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令 
简单事务处理 
redis 127.0.0.1:6379> get age 
"33" 
redis 127.0.0.1:6379> multi 
ok 
redis 127.0.0.1:6379> set age 10 
QUEUED 
redis 127.0.0.1:6379> set age 20 
QUEUED 
redis 127.0.0.1:6379> exec 
1) ok 
2) ok 
redis 127.0.0.1:6379> get age 
"20" 
如何取消一个事务 
该案例可以发现这次2 set age 命令都没有被执行 
discard命令其实就是清空事务的命令队列并退出事务上下文 
也就是我们常说的事务回滚 
redis 127.0.0.1:6379> get age 
"20" 
redis 127.0.0.1:6379> multi 
ok 
redis 127.0.0.1:6379> set age 33 
QUEUED 
redis 127.0.0.1:6379> set age 10 
QUEUED 
redis 127.0.0.1:6379> discard 
ok 
redis 127.0.0.1:6379> get age  
"20" 


redis的事务,如果事务中某个命令出现错误不会回滚 
http://www.blogjava.net/loocky/archive/2006/11/15/81138.html【理解乐观锁概念】


乐观锁复杂事务控制 
乐观锁大多数是基于数据版本(version)的记录机制实现的 
即为数据增加一个版本标识,在基于数据库表的版本解决方案中, 
一般是通过为数据库表增加一个version字段来实现读取出数据时, 
将此版本号一同读出,之后更新时,对此版本号加
此时,将提交数据的版本号与数据库表对应记录的当前版本号进行比对 
如果提交的数据版本号大于数据库当前版本号,则予以更新,否则认为是过期数据 


redis乐观锁实例: 
假设有一个agekey,我们开2session来对age进行赋值操作,我们来看一下结果如何 
(1)
1 session1 
redis 127.0.0.1:6379> get age 
"10" 
redis 127.0.0.1:6379> watch age #
代表对age进行监控 
ok 
redis 127.0.0.1:6379> multi 
ok 
(2)
2 session2 
redis 127.0.0.1:6379> set age 30 
ok 
redis 127.0.0.1:6379> get age 
"30" 
(3)
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" 


watch
命令会监视给定的key,当exec时候,如果监视的key从调用watch后发生过变化 
则整个事务会失败 
也可以调用watch多次监视多个key,这样就可以对指定的key加乐观锁了 
注意:watchkey 是对整个连接有效的,事务也一样 
如果连接断开,监视和事务都会被自动清除 
当然了execdiscardunwatch命令都会清除连接中的所有监视 


事务回滚 
redis
的事务实现是如此简单,当然会存在一些问题 
第一个问题是redis只能保证事务的每个命令连续执行 
但是如果事务中的一个命令失败了,并不回滚其他命令 
比如使用的命令类型不匹配 

4.持久化机制

redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化 

redis支持2种持久化方式: 
1
snapshotting(快照)也是默认方式 
2
Append-only file (缩写aof)的方式 


(1.)
Snapshotting
方式 
快照是默认的持久化方式 
这种方式是将内存中数据以快照的方式写入到二进制文件中 
默认的文件名为dump.rdb 
可以通过配置设置自动做快照持久化的方式 
我们可以配置redisn秒内如果超过mkey被修改就自动做快照 
save 900 1 # 900秒内如果超过1key被修改,则发起快照保存 
save 300 10 # 300秒内如果超过10key被修改,则发起快照保存 
save 60 10000  #60秒内如果超过10000key被修改,则发起快照保存


(2.)
aof方式 
由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改 
aof比快照方式有更好的持久化性, 
是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中 
redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容 
当然,由于os会在内核中缓存write做的修改, 
所以可能不是立即写到磁盘上,这样aof方式的持久化也还是有可能会丢失部分修改 
可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的时机 
appendonly yes // 启用aof持久化方式 
# appendfsync always //
收到写命令就立即写入磁盘,最慢,但是保证完全的持久化 
appendfsync everysec //
每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中 
# appendfsync no //
完全依赖os,性能最好,持久化没保证 

5.发布订阅消息

发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合 
redis
作为一个pub/subserver,在订阅者和发布者之间起到了消息路由的功能 
订阅者可以通过subscribepsubscribe命令向redis server 订阅自己感兴趣的消息类型 
redis
将消息类型称为通道(channel 
当发布者通过publish命令向redis server发送特定类型的信息时 
订阅该信息类型的全部client都会收到此消息 

6.虚拟内存的使用

redis的虚拟内存与操作系统的虚拟内存不是一回事 
但是思路和目的都是相同的 
就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据 
尤其是对于redis这样的内存数据库,内存总是不够用的 
除了可以将数据分割到多个redis server 
另外能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换到磁盘上 


虚拟内存配置 
下面是vm相关配置 
vm-enabled yes #
开启vm功能 
really-use-vm yes 
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对象换入缓存的工作线程数量 

 


转载于:https://my.oschina.net/hanchao/blog/357159

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值