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. 在Ubuntu中启动./jmeter-server报错Server failed to start: java.rmi.RemoteException: Cannot start. ranxf is a loopback address.解决方法

      执行失败错误信息: root@ranxf:/home/ranxf/apache-jmeter-3.1/bin# ./jmeter-server Writing log file to: /home ...

  2. 制作RPM包

    RPM包制作过程 1.1 前期工作 1)创建打包用的目录rpmbuild/{BUILD,SPECS,RPMS, SOURCES,SRPMS} 建议使用普通用户,在用户家目录中创建 2)确定好制作的对象 ...

  3. MySql中concat函数的用法(链接字符串)

    MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串 ...

  4. Python爬虫学习笔记之爬虫基础库

    知识预览 beautifulsoup的简单使用 beautifulsoup的遍历文档树 beautifulsoup的搜索文档树 beautifulsoup的css选择器 回到顶部 beautifuls ...

  5. 前端初级技能No.1 [切图]

    “切图”是指通过测量设计稿,从设计稿中提取图片等方式为页面开发提供支持的过程. 整个“切图”过程主要分为以下五个主要步骤: 分析设计图: 测量元素: 提取图片: 保存图片: 图片优化与合并: 1.分析 ...

  6. Spring Boot企业微信点餐系统

    第1章 课程介绍 包括项演示.课程概述.课程安排.学习前提等的介绍, 让同学们了解这课程 1-1 课程介绍 第2章 项目设计 包括需求分析,项?目设计,项?目架构,数据库设计等等. 2-1 项目设计 ...

  7. AVL模板

    感谢此博客 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define de(x) cout &l ...

  8. layer弹出层的关闭及父页面的刷新问题

    当在主页面执行添加或修改时,用弹出层是比较好的选择,如何关闭弹出层并对父级页面进行操作呢 首先在父级页面中打开一个添加页面(弹出层) 在添加页面的表单提交函数中添加如下代码: function for ...

  9. Kettle 数据抽取

    1.创建数据库连接 2.建立转换 3.指定源数据库和目标数据库的字段映射 一定要在「输出」中勾选「指定字段」,然后点按钮「Get All fields」,再「Enter mapping」,在弹出窗口映 ...

  10. poi 取excel单元格内容时,需要判断单元格的类型,才能正确取出

    以下内容非原创,原文链接http://blog.sina.com.cn/s/blog_4b5bc01101015iuq.html ate String getCellValue(HSSFCell ce ...