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 事务的相关命令:

 

序号命令及描述
1DISCARD 取消事务,放弃执行事务块内的所有命令。
2EXEC 执行所有事务块内的命令。
3MULTI 标记一个事务块的开始。
4UNWATCH 取消 WATCH 命令对所有 key 的监视。
5WATCH 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"

 

转载于:https://www.cnblogs.com/zxtceq/p/7250987.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式缓存的面试题9

1、面试题 如何保证缓存与数据库的双写一致性? 2、面试官心里分析 你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 3、面试题剖析…

ROS与navigation教程——概述

navigation是ROS的二维导航功能包,简单来说,就是根据输入的里程计等传感器的信息流和机器人的全局位置,通过导航算法,计算得出安全可靠的机器人速度控制指令。 代码库:https://github.com/ros-planning/navigation 代…

Linux下c开发 之 线程通信与pthread_cond_wait()的使用

pthread_cond_wait() /************pthread_cond_wait()的使用方法**********/pthread_mutex_lock(&qlock); pthread_cond_wait(&qready, &qlock);pthread_mutex_unlock(&qlock);/*****************************************************/The mutex passed …

ROS与navigation教程——ACML参数配置

<launch> <!--//后为wiki官网的参数说明 &#xff08;&#xff09;中为粗读算法参数说明及理解 面临的问题常用地图有2种&#xff1a;1.基于特征&#xff0c;仅指明在指定位置&#xff08;地图中包含的对象的位置&#xff09;的环境的形状。特征表示使得调节对象的位置…

【设计模式】单例模式 Singleton Pattern

通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例&#xff08;Instance&#xff09; 的情况&#xff0c; 比如说我们想做一计数器&#xff0c;统计某些接口调用的次数&#xff0c;通常我们的数据库连接也是只期望有一个实例。Windows系统的系统任务管理器…

修改输入框placeholder的默认样式

一般网页中都用到input的placeholder属性&#xff0c;想让这个默认样式和网页保持一致&#xff0c;就需要重新设定样式&#xff0c;百度百度&#xff1a; :-moz-placeholder { / color: #000; opacity:1; }支持/* Mozilla Firefox 4 to 18 * ::-moz-placeholder { color: #000;…

进程及线程通信总结

上文我们介绍了如何建立一个简单的多线程程序&#xff0c;多线程之间不可避免的需要进行通信 。相比于进程间通信来说&#xff0c;线程间通信无疑是相对比较简单的。 首先我们来看看最简单的方法&#xff0c;那就是使用全局变量&#xff08;静态变量也可以&#xff09;来进行通…

ROS multi-master——multimaster_fkie配置

多主站ROS配置和mutimaster_fkie ROS版本&#xff1a;kinetic 操作系统&#xff1a;Ubuntu 16.04。 multimaster_fkie&#xff1a;github 1网络配置 1.1路由器 设置无线路由器并连接两台计算机/机器人。为这两台计算机设置静态IP地址。相互测试ping命令和ssh。 1.2主机 …

Docker入门

1. Docker简介: docker是一个基于LXC的高级容器引擎。简单地说&#xff0c;docker是一个轻量级的虚拟解决方案&#xff0c;或者说它是一个超轻量级的虚拟机&#xff08;容器&#xff09;。 Docker是一个开源的引擎&#xff0c;可以轻松的为任何应用创建一个轻量级的、可移植的、…

乐器库的混合

每台微机一个声卡&#xff0c;也就是一片D/A&#xff0c;驱动按波特率、采样位数、采样通道传输给D/A&#xff0c;输出模拟音频。播放时仅一种与硬件支持格式对应&#xff0c;其他需驱动&#xff08;有损&#xff09;变换到硬件支持格式。每个应用都可单独播放声音&#xff0c;…

kafka认知--(1)

文档参考&#xff1a;http://kafka.apache.org/documentation.html 下载代码&#xff1a; tar -xzf kafka_2.11-0.11.0.0.tgz cd kafka_2.11-0.11.0.0 启动 bin/zookeeper-server-start.sh config/zookeeper.properties 创建topic&#xff08;主题为test&#xff0c;只有一个分…

带头尾指针的list的C实现

一、缘起 很早写了一个带头尾指针的list&#xff0c;该list支持从尾部插入元素&#xff0c;在任意位置删除元素&#xff0c;最近用这个list时发现一个bug&#xff0c;修正了&#xff0c;并加了几个接口函数。贴出来&#xff0c;希望对C的初学者有用。 二、基本说明 2.1、数据结…

Gmapping——从原理到实践

概述 在SLAM中&#xff0c;机器人位姿和地图都是状态变量&#xff0c;我们需要同时对这两个状态变量进行估计&#xff0c;即机器人获得一张环境地图的同时确定自己相对于该地图的位置。我们用x表示机器人状态&#xff0c;m表示环境地图&#xff0c;z表示传感器观测情况&#xf…

关于git分支

1.关于git分支 git的“分支”乍一听是一个特别容易让人产生错觉的概念&#xff0c;以为它和树枝一样是分叉的枝节&#xff0c;其实Git中的分支本质上是个指向commit对象的指针,每次commit&#xff0c;git都把它们串成一条时间线&#xff0c;这条时间线就是一个分支。 2.直接切换…

【机器学习经典算法源码分析系列】-- 逻辑回归

1.逻辑回归&#xff08;Logistic Regression&#xff09;又常被成为“逻辑斯蒂回归”&#xff0c;实质上是一个二元分类问题。 逻辑回归代价函数&#xff1a; 代价函数导数&#xff1a; Matlab实现&#xff1a; 采用matlab中自带的无约束最小化函数fminunc来代替梯度下降法&…

求特殊自然数

总时间限制: 1000ms 内存限制: 65536kB 描述一个十进制自然数,它的七进制与九进制表示都是三位数&#xff0c;且七进制与九进制的三位数码表示顺序正好相反。编程求此自然数,并输出显示。 输入无。输出三行&#xff1a;第一行是此自然数的十进制表示&#xff1b;第一行是此自然…

ROS——不同版本间ROS进行通信

在相同版本间的ROS进行通信不在赘述了&#xff0c;修改/etc/hosts文件即可。 最近项目遇到在Ubuntu16.04 与Ubuntu18.04两个系统间进行ROS通信&#xff0c;ROS版本分别为Kinetic和Melodic。配置网络后&#xff0c;两边都能够ping通&#xff0c;但是在获取ros数据是&#xff0c…

大数据开发实战:数据流图及相关数据技术

1、大数据流程图 2、大数据各个环节主要技术 2.1、数据处理主要技术 Sqoop&#xff1a;&#xff08;发音&#xff1a;skup&#xff09;作为一款开源的离线数据传输工具&#xff0c;主要用于Hadoop(Hive) 与传统数据库&#xff08;MySql,PostgreSQL&#xff09;间的数据传递。它…

oracle 中时间类型 date 与 long 互转

我们在保存时间到数据库时&#xff0c;有时候会保存long型的数据&#xff0c;固定长度是13位&#xff0c;是用当前时间减去1970-01-01&#xff0c;再换算成毫秒得到的结果。 但是要考虑到时区问题中国的时区时8区所以时间要加上8小时 oracle中的实现方式&#xff1a; ---------…

Linux对包管理阐述

Centos/Redhat/Fedora的软件包&#xff0c;都是rpm后缀的文件。包管理器rpm(Redhat packages manager) linux的哲学思想是简单命令解决复杂任务&#xff0c;因此每个软件的功能较单一&#xff0c;所以各种包之间有着复杂的依赖关系&#xff0c;为了解决这种可以使用前端工具&am…