共计 4151 个字符,预计需要花费 11 分钟才能阅读完成。
丸趣 TV 小编给大家分享一下 Redis 高级应用的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
Redis 高级实用特性分 6 部分:
1、安全性
设置客户端连接后进行任何其他操作时,需要使用密码
修改 redis.conf 配置文件,requirepass password 指令就是用来设置密码的
修改完配置文件后要重启 redis 服务
重启后,发现在命令行执行操作时,会有以下提示。此时需要用 auth password 来授权
127.0.0.1:6379 keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379 auth redis123
127.0.0.1:6379 keys *
(empty list or set)
如果不希望在命令行输入密码来完成授权,则可以在登录客户端时,输入密码
[root@localhost init.d]# /usr/local/redis/bin/redis-cli -a redis123
127.0.0.1:6379 keys *
(empty list or set)
2、主从复制
Redis 主从复制配置和使用非常简单。通过主从复制可以允许多个 slave server 拥有和 master server 相同的数据库副本
主从复制的工作原理:
1、slave 与 master 建立连接后,发送 sync 同步命令
2、master 会启动一个后台进程,将数据库快照保存到文件中,同时 master 主进程会开始收集新的写命令并缓存
3、后台完成保存后,将此文件发送给 slave
4、slave 将此文件保存到硬盘上
主从复制的特点:
a、Master 可以拥有多个 slave
b、多个 slave 可以连接同一个 master 外,还可以连接到其他 slave(这个特性是为了防止 master 出现故障后,slave 无法进行同步,如果 slave 还连接了其他 slave,那么 master 挂掉后,这个 slave 就会变成 master,接管服务)
c、主从复制不会阻塞 master,在同步数据时,master 可以继续处理 client 请求
d、提高系统的伸缩性
主从复制的配置:
在 slava 的配置文件中加入以下配置:
slaveof 192.168.1.1 6379 #指定 master 的 ip 和端口
masterauth PASSWORD # 这是 master 的密码
注意:主从配置的注意事项:
master、slave 的配置文件中 bind 127.0.0.1 这条配置改成 eth0 网卡的 ip 地址,否则 redis 的端口默认监听在 127.0.0.1 上。这样 slave 到 master 的端口不通。
更改 bind 的 IP 地址后,进入客户端时使用命令:
$redis_home/bin/redis-cli -h 172.16.206.140
即使用 - h 参数指定 eth0 网卡的 IP 地址,默认是 127.0.0.1
3、事务处理
Redis 对事务的处理目前还比较简单,Redis 只能保证一个 client 发起的事物中的命令可以连续的执行,而中间不会插入其他 client 的命令。当一个 client 在一个连接中发出 multi 命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行 exec 命令时,redis 会顺序的执行队列中的命令
例如:
172.16.206.142:6379 set age 27
172.16.206.142:6379
172.16.206.142:6379 get age
172.16.206.142:6379 multi
172.16.206.142:6379 set age 37
QUEUED
172.16.206.142:6379 set age 47\
QUEUED
172.16.206.142:6379 set age 47
QUEUED
172.16.206.142:6379 exec
1) OK
2) OK
3) OK
172.16.206.142:6379 get age
47
discard:取消一个事务
172.16.206.142:6379 get age
172.16.206.142:6379 multi
172.16.206.142:6379 set age 100
QUEUED
172.16.206.142:6379 set age 200
QUEUED
172.16.206.142:6379 discard
172.16.206.142:6379 get age
47
事务回滚:
Redis 不支持事务回滚,当队列中有两个事务,一个完成了另外一个没有完成,那么没有完成的那个事务不会影响整个事务。
172.16.206.142:6379 set name zeng
172.16.206.142:6379 get age
172.16.206.142:6379 multi
172.16.206.142:6379 incr age
QUEUED
172.16.206.142:6379 incr name
QUEUED
172.16.206.142:6379 exec
1) (integer) 48
2) (error) ERR value is not an integer or out of range
172.16.206.142:6379 get name
zeng
172.16.206.142:6379
172.16.206.142:6379 get age
48
乐观锁:
watch 命令会监视给定的 key,当 exec 时候如果监视的 key 从调用 watch 后发生过变化,则整个事务会失败。也可以调用 watch 多次监视多个 key,这样就可以对指定的 key 加乐观锁了。
4、持久化机制
Redis 是一个支持持久化的内存数据库,也就是说 redis 需要经常将内存中的数据同步到硬盘来保证持久化。Redis 支持两种持久化方式:
1、snapshotting(快照)也是默认方式
2、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 重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容
appendonly yes // 启用 aof 持久化方式
#appendfsync always // 收到写命令就立即写入磁盘,最慢,但是保证完全的持久化
appendfsync everysec // 每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
#appendfsync no // 完全依赖 os,性能最好,持久化没有保证
5、发布订阅消息
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合,Redis 作为一个 pub/sub 的 server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过 subscribe 和 psubscribe 命令向 redis server 订阅自己感兴趣的消息类型,redis 将信息类型称为通道(channel)。当发布者通过 publish 命令向 redis server 发送特定类型的信息时,订阅该信息类型的全部 client 都会收到此消息
测试:
Redis server 开三个会话窗口,并进入 redis 客户端命令行
终端一订阅 tv1、tv2 两个频道
subscribe tv1 tv2
Reading messages... (press Ctrl-C to quit)
1) subscribe
2) tv1
3) (integer) 1
1) subscribe
2) tv2
3) (integer) 2
终端二订阅 tv2 频道
subscribe tv1
Reading messages... (press Ctrl-C to quit)
1) subscribe
2) tv1
3) (integer) 1
终端三向 tv1 频道发布消息 hello
publish tv1 hello
(integer) 2
结果:
终端一、二都收到消息:
1) message
2) tv1
3) hello
6、虚拟内存的使用
Redis 的虚拟内存与操作系统的虚拟内存不是一回事,但是思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据。尤其是对于 redis 这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个 redis server 外。另外能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换到磁盘上。
配置如下:
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 对象换入的工作线程数量
以上是“Redis 高级应用的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!