07_NoSQL数据库之Redis数据库:Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存
- 事务处理 
Redis对事务的支持目前还比较简单。Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令。
| 127.0.0.1:6379> get age (nil) 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" 127.0.0.1:6379> | 
A:取消一个事务,使用discard
| 127.0.0.1:6379> get age "20" 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" 127.0.0.1:6379> | 
可以发现这次2个set
 age命令都没被执行。Discard命令其实就是清空事务的命令队列并退出事务上下文,也就是我们常说的事务回滚。
B.乐观锁:大多数是基于数据版本(version)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过数据库表添加一个“version”字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1。此时,将提交数据的版本号与数据库表对应记录的当前版本号进行比对,如果提交的数据版本号大于数据库当前版本号,则予以更新,否则认为是过期数据。
Redis乐观锁实例:假设一个age的key,我们开2个session来对age进行赋值操作,我们来看一下结果如何。
watch命令会监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败。也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了,注意watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。当然了exec,discard,unwatch命令都会清除连接中的所有监视。
| 127.0.0.1:6379> get age "20" 127.0.0.1:6379> get name (nil) 127.0.0.1:6379> set name toto OK 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" 127.0.0.1:6379> get name "toto" 127.0.0.1:6379> | 
从这个例子中可以看到,age由于是个数字,那么它可以有自增运算,但是name是个字符串,无法对其进行自增运算,所以会报错,如果按传统关系型数据库的思路来讲,整个事务都会回滚,但是我们看到redis却是将可以执行的命令提交了,所以这个现象对于习惯关系型数据库操作的朋友来说是很别扭的,这一点也是redis今天需要改进的地方。
持久化机制
Redis是一个支持持久化的内存数据库,也就是说redis需要经常讲内存中的数据同步到硬盘来保证持久化。Redis支持两种持久化方式:
- snapshotting(快照)也是默认方式。(也就是说把数据做一个备份) 
- append-only file(缩写aof)的方式。(将写和更改删除等操作放到文件中)。 
快照是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中。默认的文件名为dump.rdb。可以通过配置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照。
| save 900 1 #900秒内如果超过1个key被修改,则发起快照保存 save 300 10 #300秒内容如超过10个key被修改,则发起快照保存 save 60 10000 | 
rdb所在位置:
默认开启的配置是:
aof方式:
由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。
aof比快照方式更好的持久性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能丢失部分修改。
可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的时机。
| appendonly yes   # appendfsync always   appendfsync everysec   #appendfsync no       | 
要修改的配置文件是:vim /usr/local/redis/etc/redis.conf
appendonly的默认参数是no,我们可以给它改成yes
修改同步方式:
重新启动服务器:/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
测试运行
| [toto@localhost ~]$ /usr/local/redis/bin/redis-cli 127.0.0.1:6379> set name toto1 (error) NOAUTH Authentication required. 127.0.0.1:6379> auth toto OK 127.0.0.1:6379> set name toto1 OK 127.0.0.1:6379> exit [toto@localhost ~]$ ll 总用量 60 drwxrwxr-x. 2 toto toto 4096 10月 16 19:09 -rw-r--r--. 1 toto toto   -rw-rw-r--. 1 toto toto   drwxr-xr-x. 3 root root 4096 10月 13 16:34 drwxrwxr-x. 3 toto toto 4096 2月   drwxrwxr-x. 2 toto toto 4096 1月  drwxrwxr-x. 3 toto toto 4096 10月 16 19:02 drwxr-xr-x. 2 toto toto 4096 10月 16 08:58 drwxr-xr-x. 2 toto toto 4096 10月 16 08:58 drwxr-xr-x. 2 toto toto 4096 10月 16 08:58 drwxr-xr-x. 2 toto toto 4096 10月 16 08:58 drwxr-xr-x. 2 toto toto 4096 10月 16 08:58 drwxr-xr-x. 2 toto toto 4096 10月 16 08:58 drwxr-xr-x. 2 toto toto 4096 10月 16 08:58 drwxr-xr-x. 2 toto toto 4096 10月 16 10:07 | 
| [toto@localhost ~]$ ls 1016  [toto@localhost ~]$ *2 $6 SELECT $1 0 *3 $3 set $4 name $5 toto1 *3 $3 set $4 name $5 toto2 [toto@localhost ~]$ | 
由上可以知道aof文件中存的是写命令。
发布及订阅消息
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合,Redis作为一个pub/sub的server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向redis
 server订阅自己感兴趣的消息类型,redis将信息类型称为通道(channel).当发布者通过publish命令向redis
 server发送特定类型的信息时,订阅信息类型的全部client都会收到此消息。
实验步骤:
打开三个客户端:
分别使用:/usr/local/redis/bin/redis-cli -a toto登录客户端
在第一个客户端输入:subscribe tv1  
通过这种方式监听tv1频道
在第二个客户端输入:subscribe tv1 tv2
通过这种方式监听tv1,tv2频道
在第三个客户端通过public命令发布消息,输入:以下命令:
这样,在第一个客户端和第二个客户端中会监听到第三个客户端发布的消息,最后的输出如下:
客户端一的消息如下:
客户端二的消息如下:
应用:做消息系统和聊天系统
虚拟内存的使用:
Redis的虚拟内存与操作系统的虚拟内存内存不是一回事儿,但是思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据。尤其是对于redis这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个redis
 server外。另外能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换到磁盘上。
下面是虚拟内存的配置情况:
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对象换入的工作线程数量
注意:自己在2.配置的时候上面的参数不可以配置。
07_NoSQL数据库之Redis数据库:Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存的更多相关文章
- 【redis】06Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存
		上节课详细讲解了redis数据库的常用命令,以及redis数据库高级应用当中的, 安全性,跟咱们的主从复制, 这节课呢,咱们继续来讲咱们的高级应用, 首先来看一下咱们的事务处理, 事务处理 我前面说过 ... 
- 06_NoSQL数据库之Redis数据库:Redis的高级应用之登录授权和主从复制
		 Redis高级实用特征 安全性(登录授权和登录后使用auth授权) 设置客户端连接后进行任何其他指定前需要使用的密码. 警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户 ... 
- Redis数据库高级实用特性:持久化机制
		Redis数据库高级实用特性:持久化机制 大型web系统数据缓存设计 Redis高级特性:虚拟内存的使用技巧 Redis高级实用特性:安全性与主从复制 Memcached.Redis OR Tair 
- 高级运维(六):源码安装Redis缓存服务、常用Redis数据库操作指令、配置Redis主从服务器
		一.源码安装Redis缓存服务 目标: 本案例要求先快速搭建好一台Redis服务器,并测试该缓存服务器: 1> 设置变量test,值为123 2> 查看变量test的值 3> 设置计 ... 
- 超强、超详细Redis数据库入门教程
		这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ... 
- Redis数据库入门教程
		[使用redis客户端] 我们直接看一个例子: 复制代码 代码如下: //这样来启动redis客户端了 $ ./redis-cli //用set指令来设置key.value 127.0.0.1:637 ... 
- Redis数据库的安装配置方
		转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/100.html?1455869650 redis 是一个高性能的key-v ... 
- 超强、超详细Redis数据库入门教程(转载)
		这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使 ... 
- 项目实战11—企业级nosql数据库应用与实战-redis的主从和集群
		企业级nosql数据库应用与实战-redis 环境背景:随着互联网2.0时代的发展,越来越多的公司更加注重用户体验和互动,这些公司的平台上会出现越来越多方便用户操作和选择的新功能,如优惠券发放.抢红包 ... 
随机推荐
- BZOJ4926 皮皮妖的递推
			第二次乱出题.为了方便,以m=2为例,把原式变一下形,得f(i)+f(f(i-1))=i我们先无视掉那个-1,我们发现:诶,这个东西好像斐波那契数列.具体地,我们用f(n)表示把n用斐波那契数列进行拆 ... 
- 关于java线程中stop interrupt daemon wait notify
			一.关于终止线程stop与interrupt 一般来说,线程执行结束后就变成消亡状态,乍看之下我们并不需要人为进行干预(人为停止线程),不过凡事都有例外吧,在服务器或者其他应用场景下,线程为了提供服务 ... 
- Servlet中service()方法
			在学习Servlet的过程中,我们大多时候编码都是直接继承HttpServlet这个类,并且重写doGet ,doPost,但是查看Api时我们会发现Servlet接口 ,GenericSevlet抽 ... 
- gulp填坑记(二)——gulp多张图片自动合成雪碧图
			为优化图片,减少请求会把拿到切好的图标图片,通过ps(或者其他工具)把图片合并到一张图里面,再通过css定位把对于的样式写出来引用的html里面,对于一些图片较多的项目,这个过程可能要花费我们一天的时 ... 
- idea+jsp+jstl c标签页面异常
			先在Schema and DTDs配置C.tld文件 最后提示是少包 网上很多方法都说少jstl.jar 折腾了很久 其实还少standard.jar 以前的解决方法(看下面) 把这两个包分别加到项目 ... 
- 简介JSP与FreeMarker及Volicity区别
			FreeMarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个 ... 
- 如何搭建apache服务?
			为了日后便于查询,本文所涉及到的所有命令集合如下: chkconfig iptables off #关闭防火墙命令 在Centos7中使用的是chkconfig firewalld off vi /e ... 
- 牛客网编程练习之PAT乙级(Basic Level):1034 写出这个数
			AC代码: import java.util.*; /** * @author CC11001100 */ public class Main { public static void main(St ... 
- flowable设计器插件安装
			原文地址:http://www.shareniu.com/ 工欲善其事必先利其器,要想使用flowable,必须搭建一套环境,本文以Eclipse中安装flowable插件为例详细说明整个安装过程. ... 
- 豌豆夹Redis解决方案Codis安装使用
			豌豆夹Redis解决方案Codis安装使用 1.安装 1.1 Golang环境 Golang的安装非常简单,因为官网被墙,可以从国内镜像如studygolang.com下载. [root@vm roo ... 
