NoSQL数据库之Redis数据库管理六 (Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存)

NoSQL数据库之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对象换入换出的工作线程数量







































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值