3.事务处理
Redis对事务的支持目前不比较简单。Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令。
redis 127.0.0.1:6379> get age "33" redis 127.0.0.1:6379> multi OK redis 127.0.0.1:6379> set age 10 QUEUED redis 127.0.0.1:6379> set age 20 QUEUED redis 127.0.0.1:6379> exec 1) OK 2) OK redis 127.0.0.1:6379> get age "20"
如何取消一个事务
redis 127.0.0.1:6379> get age "20" redis 127.0.0.1:6379> multi OK redis 127.0.0.1:6379> set age 30 QUEUED redis 127.0.0.1:6379> set age 40 QUEUED redis 127.0.0.1:6379> discard OK redis 127.0.0.1:6379> get age "20"
可以发现这次2个set age命令都没被执行。discard命令其实就是清空事务的命令队列并退出事务上下文,也就是我们常说的事务回滚。
如下例子可以看到,age由于是个数字,那么它可以有自增运算,但是name是个字符串,无法对其进行自增运算,所以会报错,如果按传统关系型数据库的思路来讲,整个事务都会回滚,但是我们看到redis却是将可以执行的命令提交了,所以这个现象对于习惯于关系型数据库操作的朋友来说是很别扭的,这一点也是redis今天需要改进的地方。
redis 127.0.0.1:6379> incr name (error) ERR value is not an integer or out of range redis 127.0.0.1:6379> multi OK redis 127.0.0.1:6379> incr age QUEUED redis 127.0.0.1:6379> incr name QUEUED redis 127.0.0.1:6379> exec 1) (integer) 21 2) (error) ERR value is not an integer or out of range redis 127.0.0.1:6379> get age "21"
乐观锁复杂事务控制:
乐观锁:大多数是基于数据版本( version)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据表添加一个"version"实段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1。此时,将提交数据的版本号与数据库表对应记录的当前版本号进行比对,如果提交的数据版本号大于数据库当前版本号,则予以更新,否则认为是过期数据。
Redis乐观锁实例:假设有一个age的key,我们开2个session来对age进行赋值操作,我们来看一下结果如何。
1)第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
2)第2步 session2
redis 127.0.0.1:6379> set age 30 OK redis 127.0.0.1:6379> get age "30"
3)第3步 session1
redis 127.0.0.1:6379> set age 30 QUEUED redis 127.0.0.1:6379> exec (nil) //因为有wathch age redis 127.0.0.1:6379> get age "30"
watch命令监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败。也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了。注意watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。当然,exec、discard、unwatch命令都会清除连接中的所有监视。
事务回滚:redis的事务实现是如此简单,当然会存在一些问题。第一个问题是redis只能保证事务的每个命令连续执行,但是如果事务中的一个命令失败了,并不回滚其他命令,比如使用的命令类型不匹配。
4.持久化机制
Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化。
Redis支持两种持久化方式:
a.snapshotting(快照)也是默认方式
b.Append-only file(缩写aof)的方式
1).Snapshotting方式
快照是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照。
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存 save 300 10 #300秒内,如超过10个key被修改,则发起快照保存
2).aof方式
由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。
aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。
可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的时机,默认的文件名为appendonly.aof[可通过cat方法看,保存的是命令]。
vi /usr/local/redis/etc/redis.conf
appendonly yes //启动aof持久化方式 #appendfsync always //收到写命令就立即写入磁盘,最慢,但是保证完全的持久化 appendfsync everysec //每秒种写入磁盘一次,在性能和持久化方面做了很好的折中 #appendfsync no //完全依赖os,性能最好,持久化没保证
5.发布订阅消息
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合,Redis作为一个pub/sub的server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将信息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的信息时,订阅该信息类型的全部client都会收到此消息。
1)第1步 session1
redis 127.0.0.1:6379> subscribe tv1 tv2 Reading message... (press Ctrl+C to quit) 1) "subscribe" 2) "tv1" 3) (integer) 1 1) "subscribe" 2) "tv2" 3) (integer) 2
2)第2步 session2
redis 127.0.0.1:6379> subscribe tv1 Reading message... (press Ctrl+C to quit) 1) "subscribe" 2) "tv1" 3) (integer) 1
3)第3步 session3
redis 127.0.0.1:6379> publish tv1 test (integer) 2 //说明有两个监听 redis 127.0.0.1:6379> publish tv2 haha (integer) 1 //说明只有一个监听 redis 127.0.0.1:6379>
4)第4步 session1
1) "message" 2) "tv1" 3) "test" 1) "message" 2) "tv2" 3) "haha"
第4步 session2
1) "message" 2) "tv1" 3) "test"
6.虚拟内存的使用
Redis的虚拟内存与操作系统的虚拟内存不是一回事,但是思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据。尤其是对于redis这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个redis server外,另外能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换到磁盘上。
下面是vm相关配置:
vi /usr/local/redis/etc/redis.conf
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
说明:本文是我网上学习LAMP兄弟连李捷老师《NoSQL数据库之Redis数据库管理》的学习笔记。
相关推荐
### NoSQL数据库之Redis数据库管理视频教程 #### NoSQL数据库简介 NoSQL(Not Only SQL)数据库是指非关系型数据库,它们与传统的关系型数据库在数据存储方式上有显著区别。NoSQL数据库通常支持灵活的数据模式,...
### NoSQL数据库之Redis知识点详解 #### 一、NoSQL数据库概述 - **NoSQL**:Not Only SQL,指的是非关系型数据库。这类数据库的设计旨在处理海量数据,并且支持高并发访问,通常用于大规模分布式存储环境中。 - *...
标题 "NoSQL数据库之Redis.zip" 提到的核心知识点是NoSQL数据库中的Redis,这是一个非常重要的分布式数据存储系统,尤其在处理大数据场景时被广泛应用。现在,让我们深入探讨一下Redis及其在大数据环境中的作用。 ...
- 为了提高并发处理能力,Redis支持事务(`MULTI`/`EXEC`)和发布订阅模式(`PUB/SUB`)。 - 使用`EXPIRE`命令可以为键设置过期时间,实现自动清理不再需要的数据。 - 通过主从复制和分片策略,可以实现Redis的水平...
它以其内存存储、数据持久化、丰富的数据结构以及强大的订阅发布功能等特性,被广泛应用于缓存、消息队列、实时统计等多个场景。 一、Redis简介 Redis作为一个开源的、基于键值对的数据存储解决方案,其设计目标是...
总之,Redis作为一款强大的NOSQL数据库,因其高性能、丰富的数据结构支持以及灵活的持久化和集群策略,被广泛应用于现代Web应用和大数据场景中。随着技术的发展,NOSQL数据库和SQL数据库之间的界限正在逐渐模糊,...
标题和描述中的知识点聚焦于高性能NoSQL数据库Redis的特性与应用,以下将深入解析这些关键概念,以便更好地理解和掌握Redis的使用。 ### Redis的核心概念 #### Redis是什么? Redis,全称为Remote Dictionary ...
- **Redis命令总结**:覆盖了连接操作、数据操作、持久化策略等方面的常用命令。 通过对MongoDB和Redis这两种NoSQL数据库的详细介绍,我们可以看出它们各自的优势和适用场景。MongoDB适合于需要灵活性和高扩展性的...
C/C++ 编写设计用于存储收集数据持久化key-value、key-zset、key-map('hashmap')、key-list存储支持 Redis 客户端客户端 API 支持包括 C++、PHP、Python、Cpy、Java、nodejs、Ruby、Go(查看全部)持久队列服务复制...
1. **MySQL**:作为经典的关系型数据库管理系统(RDBMS),MySQL基于ACID(原子性、一致性、隔离性和持久性)原则,提供结构化数据存储,支持复杂的事务处理。在实验中,我们创建了一个名为`Student`的表,包含了`...
Redis(Remote Dictionary Server)是一个开源的高...随着实际操作的不断深入,还需要更加详细和深入地理解Redis的原理和高级特性,比如发布订阅模式、事务处理、脚本编程等,以及针对不同业务场景下的性能优化技巧。
总结一下,Redis作为NoSQL数据库的代表,凭借其内存存储、丰富的数据结构、高效的持久化机制和丰富的功能,广泛应用于各种场景。理解和熟练掌握Redis的配置和使用,对于提升系统的性能和可靠性至关重要。
NoSQL数据库Redis是一种高性能的键值存储系统,它在互联网和Web领域中广泛应用于处理海量数据和高并发问题。作为NoSQL数据库的一员,Redis以其出色的性能、丰富的数据结构、持久化、高可用性、分布式支持和复制特性...
为了解决这个问题,Redis提供了多种持久化策略,如RDB(定期保存数据库快照)和AOF(Append Only File,记录每次写操作日志)。这两种方式可以单独使用,也可以结合使用,以确保数据安全。 Redis-server.exe是Redis...
- **非关系数据库**: 指的是不采用表格形式来组织数据的数据库类型,通常用于处理大量非结构化或半结构化数据。 **2. 数据库语言分类** - **数据定义语言 (DDL)**: 用于定义数据库结构的语言,如创建、修改和删除...
Titan是一个基于Go语言实现的分布式NoSQL数据库,其独特之处在于它兼容Redis协议。这使得已经熟悉Redis操作的开发者能够无缝过渡到Titan,同时享受到分布式数据库带来的高可用性和可扩展性。 1. **Go语言开发** ...
- 持久化:NoSQL数据库通常有完整的事务支持和强大的持久化机制;Redis虽不支持ACID,但有高效的持久化策略。 - 安全性:两者都需要考虑数据安全性,但NoSQL通常更注重数据一致性,Redis更关注数据的实时性和可用...
Redis,全称Remote Dictionary ...其可持久化特性保证了数据的安全性,丰富的数据结构和API设计使它成为开发者首选的NoSQL数据库之一。而了解和掌握Redis的使用,对于提升系统的响应速度和数据管理能力具有重要意义。
NoSQL数据库,全称为"Not Only SQL",是一种非关系型的数据库系统,旨在解决传统关系型数据库在处理大规模数据和高并发场景下遇到的问题。在90年代,由于网站访问量较小,静态网页为主,单一数据库可以满足需求。但...