zoukankan      html  css  js  c++  java
  • redis高级实用特性(2)

    事务处理:

    redis对事务的支持目前还是比较简单,redis只能保证一个

    client发起事务中的命令可以连续执行,而中间不会插入其他

    client的命令,当一个client 在一个连接中发出multi命令时,这个

    连接会进入一个事务上下文,该连接后续的命令不会立即执行,

    而是先放到一个队列中,当执行exec命令时,redis会顺序的执行

    队列中的所有命令。

    127.0.01:6379> MULTI
    OK
    127.0.01:6379> set age 20
    QUEUED
    127.0.01:6379> set age 30
    QUEUED
    127.0.01:6379> get age
    QUEUED
    127.0.01:6379> EXEC
    1) OK
    2) OK
    3) "30"

    如何取消一个事务

    discard 取消事务,达到事务回滚的效果

    >>现在的redis对事务的支持还是不完善的

    如:

    127.0.01:6379> MULTI
    OK
    127.0.01:6379> incr age
    QUEUED
    127.0.01:6379> incr name
    QUEUED
    127.0.01:6379> exec
    1) (integer) 31
    2) (error) ERR value is not an integer or out of range
    当执行事务中的语句出错时,age并没有回滚

    >>乐观锁复杂事务控制

    乐观锁:大多数是是基于数据版本(version)的记录机制实现的。

    即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一

    般是通过为数据表添加一个version字段来实现读取数据时,将此版本号一同

    读出,之后更新时,对此版本号加1.此时,将提交数据的版本号与数据库表对应

    的字段版本号进行对比,如果提交的数据版本号大于数据库当前版本号,则给予

    更新,否则认为是过期数据。

    >redis乐观锁实例:假设有一个age的key,我们开两个session来对age进行复制操作,

    这样事务会执行失败,watch 命令会监视给定的key,当exec时,如果监视的key

    从调用watch后发生过变化,则整个事务会失败。也可以调用watch多次监视多个

    key.这样就可以对指定的key加乐观锁了,注意watch的key是对整个连接

    有效的,事务也是一样的,如果连接断开,监视和事务都会自动清除,

    当然exec,discard,unwatch命令都会清除连接中的所有监视。

    >>持久化机制

    redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据

    同步到硬盘来保持持久化。redis支持两种持久化方式:

    1.snapshotting(快照)也是默认的方式

    2.append-only file(缩写aof)的方式

    >snapshottting

    快照是默认的持久化方式,这种方式是将内存中数据以快照的方式写入

    到二进制文件中,默认的 文件名为dump.rdb.可以通过配置设置自动

    做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被

    修改就自动做快照。

    save 60 10000 #如果60秒内超过10000个key被修改,则发起快照保存

    >aof

    由于快照方式是在一定间隔时间内做一次,所以如果redis意外down掉得话,

    就会丢失最后一次快照后的所有修改。

    aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个

    收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行

    文件中保存的写命令来在内存中重建整个数据库内容。

    当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。

    这样aof方式的持久化也还是有可能丢失部分修改。

    可以通过配置文件告诉redis,我们想要通过fsync函数强制os写入到磁盘的时机。

    appendonly yes //启用aof持久化方式

    #appendfsync always //收到写命令就立即写入到磁盘,最慢,但是保证完全的持久化

    #appendsync everysec //每秒写入磁盘一次,在性能和持久化方面做了很好的折中

    #appendsync no //完全依赖os,性能最好,性能没有保证

    >>发布及订阅消息

    发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间

    的耦合,redis作为一个pub/sub的server,在订阅者和发布者之间起到了消息路由的功能。

    订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型

    redis将消息类型称为通道(channel).当发布者通过publish命令向redis server发送

    特定类型的信息时,订阅该信息类型的全部client都会收到此消息。

    客户端1 subscibe tv1 订阅tv1

    publish tv1 "发布的消息"

    消息发布时,客户端1会收到信息

    >>虚拟内存的使用

    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对象换入的线程数量

  • 相关阅读:
    视频相关一些基础概念解析
    git
    mysql数据库查找类型不匹配
    matlab转python
    神经网络(二)
    python图片处理(三)
    python图片处理(二)
    python图片处理(一)
    python图片处理和matlab图片处理的区别
    MapReduce原理与设计思想
  • 原文地址:https://www.cnblogs.com/LvLoveYuForever/p/5734685.html
Copyright © 2011-2022 走看看