zoukankan      html  css  js  c++  java
  • redis(2)redis的基础入门(linux)

    1.memcache与redis对比

      memcahce只有一种string数据结构,而redis有5种数据数据存储,memcahce具有的方法redis基本全部都有,且redis代码更简洁,更加易读,更加具有维护性,性能方面基本差不多,redis支持持久化,memcache自身不支持持久化。

    2.redis数据类型与api

    string,list,set,hash,zset

    redis  api: http://redisdoc.com/

    备注:incr ,decr,incrby,decrby 是原子性操作 ,keys支持pattern模式 ,如keys * :表示匹配所以, key k?:?表示一个字符。

    3.通用命令:

    Tab:补全命令

    redis-server redis.conf;//按指定配置文件启动服务器

    redis-cli  -p  6379 ;//-h没写默认为localhost ,-p端口,启动客户端

    redis-check-aof  aof文件名;// aof文件修复,这里需要使用diff命令比较一下与原文件的差异

    redis-check-rdb  rdb文件名;//rdb文件修复,这里需要使用diff命令比较一下与原文件的差异

    config set  配置文件参数 ;//修改配置参数

    config get  配置文件参数 ;//获取配置参数

    redis-benchmark  -h ip  -p port  -c number  -n number  //redis性能测试

    redis-benchmark参数说明:http://www.runoob.com/redis/redis-benchmarks.html

    4.登录客户端后的常用命令

    clear:清屏 ; 

    flushdb:清空当前库且将数据保存持久化;

    flushall:清空所有库且将数据保存持久化 ;

    shutdown:将数据持久化并关闭会话

    exit:将数据持久化并退出;  

    save :将数据持久化,同步阻塞,保证数据安全;

    bgsave:异步进行快照,可以通过lastsave获取最后一次保存的快照的时间,保证效率

    select  库 //切换库

    dbsize //查看当前库的key的大小

    5.设置密码//一般没有必要,因为他不是做安全的

    获取密码:config get requirepass //默认没有密码

    设置密码:config set  requirepass  12345678

    登录 :auth  密码

    redis的配置文件中的说明

    6.分布式中的cap原理

    C:Consistency(强一致性)

    A:Availability(可用性)

    P:Partition tolerance(分区容错性)

    选用原则

    由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。 AP 大多数网站架构的选择, CA 传统Oracle数据库

    7.redis的持久化aof与rdb

    1)rdb的持久化

    redis中的配置中设置如下:

    只要满足以下三个条件中的任意一个,BGSAVE命令就会被执行

    服务器在900秒之内,对数据库进行了至少1次修改;
    服务器在300秒之内,对数据库进行了至少10次修改;

    服务器在60秒之内,对数据库进行了至少10000次修改.

    2)aof持久化

    appendonly no;//默认为关闭,开启设置为yes

    appendfilename appendonly.aof;//默认的aof的文件文件名

    appendfsync everysec ;//默认写入策略

    参数如下

    no:表示等操作系统进行数据缓存同步到磁盘(快) 

    always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) 

    everysec:表示每秒一次(折衷,默认值)

    备注:no太慢,always太快系统易崩溃

     

    3)rdb与aof的比较

    rdb在恢复大数据集时的速度比 aof的恢复速度要快,rdb远比aof文件小,发生故障停机aof比rdb丢失的数据少

    4)aof的重写原理:

    当aof文件达到一定的值后(配置文件中默认为64M,auto-aof-rewrite-percentage 100,

    auto-aof-rewrite-min-size 64mb),会fork出一条新进程来将文件重写(先写临时文件,然后删除原文件,最后再rename),遍历新进程的内存中数据,重写aof文件,优化文件大小(前面多条set或者incr等,最后就只剩一下,一个键和一条值,一个set语句),并没有读取旧的aof文件,将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

    备注:rdb与aof出现错误后的修复前面已写,一般而言两个都开启,倘若flush了,那么可以打开相应的aof文件,删除flush语句重新加载可以修复,但是在重写aof后不能恢复,aof文件优先于rbd文件加载。

    8.Redis的事务

    1)api

    开启事物multi

    取消事务:discard

    提交事物exec  //提交之后无论失败还是成功都会取消监控

    监控:watch

    取消监控:unwatch  //取消所有的监控

    2)回滚

    开启事务后在exec之前报错,那么会全部回滚,假如在exec之后报错,那么没出错的语句继续执行,不会回滚

    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set k1  v1
    QUEUED
    127.0.0.1:6379> getset k2
    (error) ERR wrong number of arguments for 'getset' command
    127.0.0.1:6379> exec
    (error) EXECABORT Transaction discarded because of previous errors.
    127.0.0.1:6379> get k1
    (nil)
    
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set k1 v1
    QUEUED
    127.0.0.1:6379> incr k1
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    2) (error) ERR value is not an integer or out of range
    127.0.0.1:6379> get k1
    "v1"
    

    3)watch与unwatch

    watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,整个事务队列都不会被执行,通过watch命令在事务执行之前监控了多个Keys,倘若在watch之后multi之前有任何Key的值发生了变化,exec命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败.

    客户端1 //成功案例
    127.0.0.1:6379> set k1 1000
    OK
    127.0.0.1:6379> set k2  0
    OK
    127.0.0.1:6379> WATCH k1
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> DECRby k1 500
    QUEUED
    127.0.0.1:6379> INCRby k2 500
    QUEUED
    127.0.0.1:6379> exec
    1) (integer) 500
    2) (integer) 500
    
    客户端1//在multi之前,watch之后修改了数据,所以multi中的内容无效
    127.0.0.1:6379> set  k1 1000
    OK
    127.0.0.1:6379> set  k2 0
    OK
    127.0.0.1:6379> WATCH  k1
    OK
    127.0.0.1:6379> set  k1 500
    OK
    127.0.0.1:6379> MULTI 
    OK
    127.0.0.1:6379> DECRBY k1 500
    QUEUED
    127.0.0.1:6379> INCRBY  k2 500
    QUEUED
    127.0.0.1:6379> exec
    (nil)
    127.0.0.1:6379> get k1
    "500"
    
    客户端1//正常走
    127.0.0.1:6379> set  k1 1000
    OK
    127.0.0.1:6379> set  k2 0
    OK
    127.0.0.1:6379> WATCH  k1
    OK
    127.0.0.1:6379> MULTI 
    OK
    127.0.0.1:6379> DECRBY k1 500
    QUEUED
    127.0.0.1:6379> INCRBY  k2 500
    QUEUED
    127.0.0.1:6379> exec
    (nil)
    127.0.0.1:6379> get k1
    "2000"
    
    客户端2//设置值,导致上述失败
    set k1  2000
    

    备注:

    单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

    悲观锁:认为别人对自己是不安全的,将整个相应的空间都锁起来,例如表锁,写锁等

    乐观锁:认为别人对自己是安全的,类似行锁,在修改行后面加一个版本号,例如当版本是1,两个人都同时哪一个数据,差不多时间提交,当有人提交后,变为2,然后后提交的版本与当前版本冲突,就需要解决冲突后提交,类似版本管理。

    9.redis的发布订阅

    略,基本不会使用,因为基本上都使用activemq

    10.主从复制//优点:读写分离,容灾恢复

    1)文件配置(一主二仆)

    需要修改的配置(端口和文件地址)

    port 

    pidfile

    logfile

    dbfilename

    appendfilename (开启aof之后需要更改)

    2)1为主2,3为从

    主//info replication

    从 //SLAVEOF 127.0.0.1 6379,另一个从类似

    备注:只能主写,从不能写,主掉了,两仆还是两仆,主回来后依旧是主

    3)薪火相传

    另一个挂在一个从上,但是被挂载的从,还是从

    备注:主掉了,仆还是仆,主回来后依旧是主

    4)反客为主//SLAVEOF no one

    备注:反客为主后跟主没关系了

    4)哨兵模式

    配置文件

    新建sentinel.conf文件,名字绝不能错,文件内的内容

    sentinel monitor mymaster 127.0.0.1 6379 1   // mymaster主机名能谁便取, ip  ,prot,投票数

    sentinel down-after-milliseconds mymaster 5000  //配置多长时间检测一次,默认30秒,这里配置5秒
    sentinel failover-timeout mymaster 900000
    sentinel parallel-syncs mymaster 2

    启动 redis-sentinel   sentinel.conf文件路径

    备注:主掉线之后,从机进行投票,在从机中自动的选出主机,主回来后变从机

  • 相关阅读:
    sql server分布式事务解决方案 (笔记)
    深入理解Datatable(笔记)
    SQLSERVER 2005 实现文件读写操作
    局部变量、全局变量、堆、堆栈、静态和全局
    分布式事务DISTRIBUTED TRANSACTION
    SQLSEVER2005中找不到存储过程xp_getfiledetails 解决办法
    模式窗口
    理解析构函数的执行过程
    Oracle分页
    DataTable导出到Excel、GSV (转)
  • 原文地址:https://www.cnblogs.com/gg128/p/9526046.html
Copyright © 2011-2022 走看看