No
sql数据库之Redis
数据库管理六 (Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存) 1:事务处理: Redis对事务的
支持目前还是是比较简单的,Redis只能保证一个Client 发起的事务中的命令可以连续的执行,而中间不会插入其他的Client的命令。 当一个Client在一个连接中发出的multi命令时,这个连接会进入一个事务的上下文 ,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令是, redis会顺序的执行队列中的所有命令。 测试命令: get age multi set age 10 set age 20 exec get age 1_1:如果取消一个事务? multi -- 使用discard命令 使用discard命令可以发现:这次2个set age命令都没有执行, discard命令其实就是清空事务的命令队列并
退出事务的上下文, 也就是说的事务回滚。 1_2:乐观锁复杂事务控制 乐观锁:大多数是基于数据版本Version的记录机制实现的。即为数据
增加一个 个版本标识,在基于
数据库表的版本
解决方案中,一般是通过
数据库表
添加 一个version字段来实现读取出数据时,将此版本号一同读出,之后更新时, 对此版本加1.此时,将提交数据的版本号与
数据库表对应记录的当前版本号 进行对比,如果提交的数据版本号大于
数据库当前版本号,则予以更新, 否则认为是过期数据。 Redis乐观锁实例:假设有一个age的key,我们开2个session来对 age进行复制操作。我们来看一下结果如何? watch命令会监视给定的key,当前exec时候,如果监视的key从
调用watch 后发生过变化,则整个事务会失败。 unwatch命令都会清除连接中的所有监视。 2:持久化机制: Redis是一个
支持持久化的内存
数据库,也就是说redis需要经常将内存 中数据同步到硬盘来保证持久化。 Redis
支持两种持久化方式: 2.1 Snapshotting(快照)也是默认的方式 快照是默认的持久化方式,这种方式是将内存中数据以快照的方式写入到二进制
文件中, 默认的
文件名称为:dump.rdb。 可以通过
配置文件设置
自动做快照持久化的方式。我们可以配置Redis在n秒内 如果超过m个key的
修改就
自动做快照保存; 例如:save 900 1 # 900秒内如果超过1个key被
修改,则发起快照保存 save 300 10 # 300秒内如果超过10个key被
修改,则发起快照保存 2.2 Append-only file (缩写AOF)的方式 由于快照的方式是在一定间隔时间做的一次的,所以如果redis意外down掉的话 ,就会丢失最后一次快照后所以
修改。 AOF比快照方式有更好的持久化性,是由于在使用AOF时,redis会将每一个收到的 写命令都通过write
函数,追加到
文件中,当redis重启时,会通过执行
文件中保存 的写命令来在内存中重建整个
数据库的
内容。 当然由于OS会在内核中缓存write做的
修改,所以可能不是立即写到磁盘上。这样AOF 方式的持久化也还是有可能丢失部分
修改的数据。
解决方法:可以通过
配置文件告诉redis我们想要通过fsync
函数强制os写入到磁盘的时机。
修改配置文件:redis.conf #appendonly yes // 启用aof持久化方式 #appendfsync always //收到写命令就立即写入到磁盘,最慢,但是保证完成的持久化 #appendfsync everysec // 每秒钟写入磁盘一次,在
性能和持久化方面做了很好的折中 appendfsync no // 完全依赖OS,
性能最好,持久化没有保证 3:pub_sub实时消息:发布以及
订阅消息 发布
订阅(pub/sub)是一种消息通信模式, 主要的目的是解耦消息发布者和消息
订阅者之间的耦合, 这点和设计模式中的观察者模式比较相似。 pub /sub不仅仅
解决发布者和
订阅者直接
代码级别耦合也
解决两者在物理部署上的耦合。 redis作为一个pub/sub server,在
订阅者和发布者之间起到了消息路由的
功能。
订阅者可以通过subscribe和psubscribe命令向redis server
订阅自己感兴趣的消息类型, redis将消息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的消息时。
订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。 一个client可以
订阅多个 channel,也可以向多个channel发送消息。 4:虚拟内存: 先说明下redis的虚拟内存与操作系统的虚拟内存不是一码事,但是思路和目的都是相同的。 就是暂时把不经常访问的数据从内存交换到磁盘中, 从而腾出宝贵的内存空间用于其他需要访问的数据。 尤其是对于redis这样的内存
数据库,内存总是不够用的。 除了可以将数据分割到多个redis server外。 另外的能够提高
数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换的磁盘上。 如果我们的存储的数据总是有少部分数据被经常访问,大部分数据很少被访问, 对于网站来说确实总是只有少量
用户经常活跃。当少量数据被经常访问时, 使用虚拟内存不但能提高单台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对象换入换出的工作线程
数量