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\redis\Redis>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

redis高级应用特征的更多相关文章

  1. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  2. NoSQL之Redis高级实用命令详解--安全和主从复制

    Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim ...

  3. 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  4. 3.Redis高级功能

    3.Redis高级功能3.1 慢查询分析3.1.1 慢查询的两个配置参数3.1.2 最佳实践3.1.3 单线程架构3.2 Redis Shell3.2.1 redis-cli 详解3.2.2 redi ...

  5. 分布式缓存技术redis系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  6. redis 高级特性 不要太好用

    Redis高级特性及应用场景 redis中键的生存时间(expire) redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它. 过期时间可以设置为秒或者毫秒精度. ...

  7. Redis学习第八课:Redis高级实用特性(二)

    Redis高级实用特性 4.持久化机制 Redis是一个支持持久化的内存数据库,也就是说Redis需要经常将内存中的数据同步到硬盘来保证持久化.Redis支持两种持久化方式:(1).snapshott ...

  8. Redis学习第八课:Redis高级实用特性(一)

    Redis高级实用特性 注:我学习的环境是vmware7.1 + ubantu10.10+ redis 3.0.2 1.安全性 设置客户端连接后进行任何其他指定前需要的密码.因为redis速度相当快, ...

  9. redis高级应用(集群搭建、集群分区原理、集群操作)

    文章主目录 Redis集群简介 Redis集群搭建 Redis集群分区原理 集群操作 参考文档 本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 ...

随机推荐

  1. 原生js 操作dom

    1.一些常用的方法 obj.getElementById() 返回带有指定 ID 的元素. obj.getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节 ...

  2. 多媒体文件格式分析 MP3文件结构及编解码流程

    多媒体文件格式分析 http://blog.csdn.net/taniya001/article/details/7962864 多媒体文件格式分析 MP3文件结构及编解码流程 http://www. ...

  3. ABP官方文档翻译 1.5 多租户

    多租户 什么是多租户? 数据库和部署架构 多部署-多数据库 单部署-多数据库 单部署-单数据库 单部署-混合数据库 多部署-单/多/混合数据库 ABP的多租户 启用多租户 租主和租户 会话 决定当前租 ...

  4. java单例模式之懒汉式分析

    转自:http://blog.csdn.net/withiter/article/details/8140338 今天中午闲着没事,就随便写点关于Java单例模式的.其实单例模式实现有很多方法,这里我 ...

  5. Html遮罩层的显示(主要在于样式设置)

    <html> <head> <title>aaa</title> <script type="text/javascript" ...

  6. 线程实现Runnable接口比继承Thread的优势

    1.适合多个相同程序代码的线程去处理同一资源,把虚拟CPU(线程)同程序的代码.数据有效分离,较好地体现了面向对象的设计思想.2.可以避免由于java单继承特性带来的局限.3.增强了程序的健壮性,代码 ...

  7. C#实现日历样式的下拉式计算器

    C#实现日历样式的下拉式计算器 原文地址:http://developer.51cto.com/art/201508/487486.htm 如果我们正在做一个类似于库存控制和计费系统的项目,有些部分可 ...

  8. 数据结构实习 - Problem N 树的括号表示法

    writer:pprp date:20171103 题目描述 先将根结点放入一对圆括号中,然后把它的子树按由左而右的顺序放入括号中,而对子树也采用同样方法处理:同层子树与它的根结点用圆括号括起来,同层 ...

  9. (转帖) 为Docker容器指定自定义网段的固定IP/静态IP地址

    作者:雨水,日期:2016-04-09  CSDN博客: http://blog.csdn.net/gobitan 摘要:Docker容器运行的时候默认会自动分配一个默认网桥所在网段的IP地址.但很多 ...

  10. python 这个stdin怎么写

    !/usr/bin/env python -- coding: utf-8 -- import json import pprint import sys reload(sys) sys.setdef ...