zoukankan      html  css  js  c++  java
  • Redis学习第八课:Redis高级实用特性(一)

    Redis高级实用特性

    注:我学习的环境是vmware7.1 + ubantu10.10+ redis 3.0.2

    1、安全性

    设置客户端连接后进行任何其他指定前需要的密码。因为redis速度相当快,一个外部用户可以在一秒钟进行很多次的密码尝试,这就需要设定非常强大的密码来防止暴力破解。 可以在Redis的配置文件中找到如下项: # requirepass foobared requirepass anny

    root@ubuntu:/usr/local/redis# ps -e

    root@ubuntu:/usr/local/redis# kill -9 2039
    root@ubuntu:/usr/local/redis# netstat -tunpl | grep 6379
    root@ubuntu:/usr/local/redis# ./bin/redis-server ./etc/redis.conf 
    root@ubuntu:/usr/local/redis# ./bin/redis-cli
    127.0.0.1:6379> keys *
    (error) NOAUTH Authentication required.
    127.0.0.1:6379>

    为Redis设置密码后,再启动Redis客户端,命令就无法执行。

    对Redis客户端进行授权,通过以下命令:

    127.0.0.1:6379> auth anny
    OK

    或者在启动Redis客户端时,设置密码,命令如下:

    root@ubuntu:/usr/local/redis# ./bin/redis-cli -a anny


    2、主从复制

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

    Redis主从复制的特点:

    1、Master可以拥有多个slave。

    2、多个slave可以连接同一个master外,还可以连接到其它的slave。

    3、主从复制不会阻塞master, 在同步数据时,master可以继续处理client请求。

    4、提高系统的伸缩性。

    注意:Redis的主从复制,不仅仅是master与slave相连接,也可以slave与slave相连接,当master宕机时,另一个主要的slave立马转换角色,变成master。

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

    配置主从服务器:

    只需要修改slave的配置文件中加入以下配置:

    slaveof 192.168.32.216 6379 #指定master的ip和端口

    masterauth anny #这是主机的密码

    主从服务器实验操作:

    1、首先将本台虚拟机重命名为Redis_master,通过下面命令关机。

    root@ubuntu:/usr/local/redis#init 0

    2、通过vmware,在Redis_master虚拟机名称上点右键,点击“Clone”命令,一路点“下一步”,直到完成。将新克隆的虚拟机重命名为Redis_slave。

    3、分别启动虚拟机redis_master和redis_slave。

    4、切换到虚拟机redis_slave,修改IP。修改/usr/local/redis/etc/redis.conf文件,修改以下内容:     

    slaveof 192.168.32.216 6379     

    masterauth anny

    5、分别启动两台机器的redis-server.

    6、我们在虚拟机redis_master的 redis客户端写入数据,数据会自动同步到虚拟机redis_slave上。

    7、如何判断谁是主谁是从,可以通过info命令查看role内容。


    3、事务处理

    Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

    • 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
    • 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

    一个事务从开始到执行会经历以下三个阶段:

    • 开始事务。
    • 命令入队。
    • 执行事务。

    Redis对事务的支持目前还比较简单。Redis只能保证一个client发起的事务中命令可以连续的执行,而中间不会插入其他client的命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令

    Redis 事务命令

    下表列出了 redis 事务的相关命令:

    序号命令及描述
    1 DISCARD 取消事务,放弃执行事务块内的所有命令。
    2 EXEC 执行所有事务块内的命令。
    3 MULTI 标记一个事务块的开始。
    4 UNWATCH 取消 WATCH 命令对所有 key 的监视。
    5 WATCH key [key ...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

    multi:将任务命令放入队列

    exec:顺序执行本事务上下文队列中的任务命令。

    127.0.0.1:6379> get age
    "20"
    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:清空事务的命令队列并退出事务上下文,即我们常说的事务回滚。

    当执行了multi命令后,如果想取消事务处理,可以使用discard命令。

    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set age 30
    QUEUED
    127.0.0.1:6379> set age 40
    QUEUED
    127.0.0.1:6379> discard
    OK
    127.0.0.1:6379> get age
    "20"

    强调:在Redis的事务上下文中,当其中某一个命令执行失败时,不会影响到其他命令的执行。这一点跟我们理解中的事务不一样,发生错误,不会回滚。

    看下面例子,在整个事务中,第一条命令执行成功,而第二条命令执行失败,但事务没有回滚。

    127.0.0.1:6379> get age
    "20"
    127.0.0.1:6379> get name
    "test"
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> incr age
    QUEUED
    127.0.0.1:6379> incr name
    QUEUED
    127.0.0.1:6379> exec
    1) (integer) 21
    2) (error) ERR value is not an integer or out of range
    127.0.0.1:6379> get age
    "21"

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

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

    Redis乐观锁实例:

    在第一个终端中,通过watch命令监控名称为“age“的key:

    127.0.0.1:6379> get age
    "21"
    127.0.0.1:6379> watch age
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set age 18
    QUEUED

    然后我在第二个终端中,对key为“age“进行赋值。

    127.0.0.1:6379> set age 25
    OK

    然后我又回到第一个终端进行后续命令,这时执行事务返回nil,表示事务执行不成功。
    127.0.0.1:6379> exec
    (nil)
    127.0.0.1:6379> get age
    "25"

  • 相关阅读:
    Hadoop专有名词
    mapreduce的cleanUp和setUp的特殊用法(TopN问题)和常规用法
    Hadoop 中文编码相关问题 -- mapreduce程序处理GBK编码数据并输出GBK编码数据
    MapReduce核心
    技术提升
    Linq使用group by
    C#中DllImport用法
    mysql分组后将未分组的列合并成行GROUP BY,GROUP_CONCAT
    MVC之CodeFirst
    MVC的Forms登录验证
  • 原文地址:https://www.cnblogs.com/zxtceq/p/7250987.html
Copyright © 2011-2022 走看看