redis



一、安装


将jar上传至 /usr/local目录下进行解压

make install PREFIX=/usr/local/redis  安装到该路径下
将 解压好后的安装包下的redis.conf 复制到 redis 下的 bin 目录下

那么,安装结束,修改配置文件redis.conf,默认端口可以不修改
daemonize:设置为yes 表示指定Redis以守护进程的方式启动(后台启动)。默认值为 no
dbfilename :设置快照的文件名,默认是 dump.rdb
pidfile:配置PID文件路径,当redis作为守护进程运行的时候
logfile :配置log文件地址,默认打印在命令行终端的窗口上


安装配置完毕后,启动redis的服务

在安装目录下的bin目录下
使用命令行: ./redis-server redis.conf   启动服务
然后在启用客户端 : ./redis-cli

此时就可以使用了

二、使用

常用命令

设置
    set 键名 值
      获取
    get 键名

判断是否存在键
    exists  键名   存在放回1,不存在返回0

查找当前库的所有键  keys *  


配置文件中默认配置了16个数据库 0~15,可通过下表进入
select  0~15   进入其他的库,共有16个库


move  键名  库名    将当前库的键移动到指定的库,当前库的所指键会被移除 


查看设置过期时间 
  查看;
    ttl  键名 
       返回-1,表示永不过期,-2表示已经过期
  设置:
    先设置值,然后在 :expire 键名  时间()
    到了过期时间,键和值都会被移除


当一个键已经被设置了值后,对他进行再次赋值,那么将会覆盖

查看数据类型
    type  键名   ,键不存在,返回none


dbsize   当前库的大小


字符串

Set   键  值
get   键
del   键
strlen  键                    长度
append 键                     值是追加    

Incr   键              值加1
decr   键              值加减
incrby  键   数值      值加数值大小
decrby  键   数值      值减数值大小
      注意值必须是数值类型的才可以

getrange  键名  0  -1  显示键的所有值
getrange  键名  0   2  表示从下标0开始到下标为3的,包括3


Setrange  键名  0  x  表示将下标0开始,用x替换,替换个数取决于替换的长度
                     xx表示代替两个,类推


哈希

设置值,单个
  hset  h1  键名  值        h1是名称

设置多组键值
  hset  h1 age 20 sex man    其中age是键, sex也是键
  但注意,如果h1存在了,那么会直接添加进去,不会有影响


获取单个值
  hget   h1  键名   


获取多个值
  hmget  h1  age  sex       age和sex是键名


删除
   hdel  h1  键名  键名      可删除多个


删除整个hash,使用哈希名
   del  h1 


修改则和重新赋值一样,可以单个,可以多个,多个也是hmset

 hincrby h1  age  10  
    将该值增加10

判断
hexists h1 age 判断age键存不存在,存在返回1,否则返回0


hlen  h1   获取h1的长度,也就是里面有多少个键值对


获取该哈西的所有键
   hkeys  h1  


获取所有的值
   hvals  h1

注意:这个demo的h1是hash名

list

 增加
    lpush  名称  值12
          l表示从左边插入,值1,值2 ,那么值1会在值2的右边
    也可以是rpush 从右边开始插入


添加数
     指定前后关系
          linsert  list  after  值12   
        将值2 添加在值1后面
        还有before 表示添加在前面

 查看值
   lrange  名称  0  -1     查看全部
      或 0 3 表示从下表03四个值

注意:
   rpush  和 lpush 都可以在不存在list,使用该种方式创建

   但是lpushx  和  rpushx  是当该list存在时才可以添加, 

弹出数据  ,其实就是删除并返回该值
   lpop  list  弹出左边的第一个
   rpop list  弹出右边的第一个值

llen  list  查看长度 




删除 
  lren  list  0  aa         aa表示值    ,list是名称
      0表示删除所有匹配的值

lrem  list  -2  aa
 从尾部也就是右边开始删除,两个aa 
 正数则是从左边,数字多大就删除几个




可以在指定数据替换
    lset  list  下标  值
         注意下标不能超过list的长度大小, 也就是要小于llen返回的值
         为什么不能是等于大小呢,那是因为这种方式并非添加,而是将数据替换,
         也就是说数据不会增加



rpoplpush  list1  list2   将list1的右边的第一个值弹出赋赋值给list2 

Set

添加
  Sadd  set1   aa  bb  cc  
  Sadd  set2   bb  cc

查
  Smembers  set1  查询set的所有值

删除
  Srem  set1  值12    可同时删除多个


差集
   Sdiff  set 1  set2 
   返回的是set1有,而set2没有的 ,也就是去除set1共有的部分,输出set1独有的
   注意:如果set1的值,set2全有,而set1却没有独有的,则会报错


并集
   Sunion  set1  set2
   
交集
   Sinter  set1  set2   
     共有的部分


Srandmember set1   随机返回一个元素



Sdiffstore   set3  set  set2    将set set2的差集放到set3集合里
     注意,这里的差集也要和上面一样要注意


 Sinterstore  set4  set2  set3 将交集放到set4上

Sunionstore  set5  set3  set2  将并集放到set5上

Sortedset(zset)

增加
     Zadd  st  10  gww  40  gww2    tr是名称  ,注意,是值在前面,键在后面

     Zadd  st  50  gww   
查看     
     Zscore  st  gww   
     Zcard   st   查看 st的长度

 删除
     Zrem  st  gww2  


显示所有
    Zrem  st  0  -1 

显示所有值和分数
    Zrange  st  0  -1  withscore  
 
按照分数删除
    Zremrangebyscore  st  0  50

显示分数在70~90之间的键名
    Zrangebyscore  st  70  90  

zincrby st 10 gg 是gg原来的值加上10



zcount  st  50  100  就算分数在这个范围内的键的个数


zrank st 键名   升序        
zrevrank   st   键名  降序


Flushdb  清空当前库的key
Flushall  清空所有库的key

结束redis服务,
  exit   
当在客户端命令下,使用shutdown 退出,然后exit可结束
如果只是输入quit则是退出客户端命令,未关闭服务

2.持久化

RDB

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,
待持久化过程结束了,再用这个临时文件替换上次持久化好的文件,整个过程,主进程是不进行任何io操作的,这就确保了极高的性能。
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那么rdb方式要比aof方式更加的高效,
rdb的缺点是最后一次持久化后的数据可能丢失。


Fork :作用是复制一个与当前进程一样的进程,新进程的所有数据,变量,环境变量,程序计数器等,数值都是和原进程一致,
       但是是一个新的·进程,作为原进程的子进程

Rdb是整个内存的压缩过的Snapshot,Rdb数据结构,可以配置复合的快照触发条件


默认
 1分钟内改了1万次
 5分钟改了1015分钟改了1次       这是在配置文件中的默认配置,可以修改


可以使用save可以立刻备份到rdb文件里
Save只管保存,其他不管,全部阻塞,因此影响性能


Bgsave :会在后台异步进行快照操作,同时还可以响应客户端请求,可以通
        过lastsave命令获取最后一次成功执行快照的时间

执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义。

保存的文件是dump.rdb,文件名可以通过配置文件 *.conf配置

默认开启
rdbcompression yes  表示使用压缩算法



优势:适合大规模的数据恢复,对数据完整性和一致性要求不高
劣势:在一定间隔时间做一次备份,所以如果redis意外down掉的话,
     就会丢失最后一次快照后的所有修改,fork的时候,内存中的数据被克
     隆了一份,大致2倍的膨胀性需要考虑

Aof

appendonly yes  开启aof  ,默认no

   以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来,不记读
   只序追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,也就是说,
   redis重启后就根据日志文件的内容将写指令从前到后执行一次完成恢复数据工作

 保存的文件是appendonly.aof ,文件名可以在配置文件中修改


注意:
  这两个文件是两个策略,当我们在同一个配置文件里将他们设置为yes后
  他们是不会互斥的,但是,注意,会先读取aof文件
  Aof他保存的是你使用了./redis-cli后的所有命令操作,
  然后在读取rdb文件


但如果此时在操作redis时,遇到了一些意外,如断电等,使得aof文件保存的指令不完整
也就是保存到了一半,那么启动服务是启动不了的,

这时,我们可以
     redis-check-aof --fix aof文件
     执行这个命令,会将不符合的语法删除,那么就可以重新启动服务了
   
   当然,类比rdb也可以使用这种方式恢复,他也有一个对应的redis-check-rdb文件

Aof     的三种策略
   Appendfsync   
       Always:同步持久化,每次发生数据变更会被立即记录到磁盘,性能较差,但完整
       Everysec:出厂默认,异步操作,每秒记录,如果一秒内宕机,有数据丢失
       No  不同步

触发重写
		No-appendfsync-on-rewrite:重写是否可以运用appendsync,默认no即可,保证数据安全,同步
		Auto-aof-rewrite-min-size:设置重写的基准值   默认64M ,   修改异步
		Auto-aof-rewrite-percentage:设置重写的基准值   默认100    就是100%  不同步
          也就是说aof是上次大小的一倍时,且阈值达到64M时触发重写

Aof启动、修复、恢复
  启动,在配置文件将appendonly的no 设置为yes
 
  修复:将有数据的aof文件复制一份保存到对应的目录,然后配置文件需要指定该aof,才能在启动时读取指令,恢复数据
  恢复:重启redis重新加载

异常修复
  aof
    redis-check-aof  --fix  aof文件
  rdb
    redis-check-dump  --fix  rdb文件



Aof采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当aof文件的大小超过所设定的阈值时,
redis就会启动aof文件的内容压缩
只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof


重写原理: 
   Aof文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中的数据,
   每条记录有一条的set语句,重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,
   和快照类似

触发机制:  
   Redis会记录上次重写时的aof大小,默认配置是当aof文件大小是上次rewrite后大小的一倍且问价大于64M时触发
   这些参数可以在redis.conf配置文件里进行修改


优势:三个策略
劣势
   Aof文件远要大于rdb文件,恢复速度慢,aof运行效率慢于rdb,每秒同步策略效率较好,不同步和rdb的效率一样


补充:Df -h 查看磁盘

事务

说明:
   可以一次执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会序列化,
   按顺序串行化执行而不会被其他命令插入,不许加塞

     MULTI 标记一块事物的开始
     Exec执行所有事务快内的命令
     Discard  取消事务,放弃执行事物块内的所有命令
     Unwatch 取消watch命令对所有key的监视
     Watch key [key..] 监视一个或多key,在事物【执行】前,key被其他命令改动,那么事物停止。也就是被监视到执行事物之间,
     
标记开始事物,那么之后的命令操作都会被添加进一个队列里,不许加塞命令

Redis对事物的支持是部分支持
      标记了事物开始时,如果是命令出错,语法等出错,那么在此次事物中,所有操作是无效的,
      但是如果命令没有出错,也就是将命令加入队列中时没有报错,而执行命令时报错,
      那么该事物内该条错误命令不会影响到其他的命令。类似于java的编译阶段和运行阶段。
      该进入队列的命令错误无法执行,不会影响队列的其他命令,其他命令正常执行
      那么也就正好说明了,redis不具有【原子性】

消息订阅

常用命令

Psubscribe  a*     支持通配符,  【订阅】所有a开头的 键
Subscribe  键名1  键名2   可多个
Publish  键名  值    给订阅了改键的订阅费【推送】消息
其余命令看图

主从复制

说明


  主机数据更新后根据配置和策略,
  自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主

本次demo,说的是一主二从,非集群环境
本次非多个redis,而是多个配置文件 *.conf

步骤:   
   修改配置文件细节操作
   拷贝多个redis.conf文件
   开启daemonize yes
   Pid文件名字
   指定端口
   Log文件名字
   Dump.rdb名字

 也就是一个reids开启不同的端口提供服务

 注意:启动服务时,要找到对应的*.conf文件

   ./redis-server *.conf
  ./redis-cli  -p  端口号    注意,要加端口号,否则无法进入,端口是对应服务的配置文件配置的端口
  
  默认开启的reids是master,读写权限都要  ,通过info replication查看

本次demo ,开启了三个redis后,都是master
如何实现一主二从:
首先自己选一个redis服务作为主机,
其余的服务使用命令:
   slaveof  主库IP 主库端口  来访问主机
   此时在使用  info  replication可以查看到使用了该命令的服务机变成了slave,只能读,而不能修改
   读的数据是从主机上获取的,而主机下面则管了两个从机

这样划分,主机写数据,从机读数据,叫做读写分离,减缓了服务器的压力,提高了性能


情况1: 
  当主机宕机后,两台从机原来的slave 读模式,不会更改,他会等待主机重新上线,然后重写连接,重新更新数据

情况2:
  当从机宕机后,不影响其他的从机,和主机,当在次启动后,从机的模式变成了master 写模式,需要重新连接主机
  但也可以在该服务的配置文件里,将主机的信息配置进配置文件里,使得重新启动后自动连接
  
     

注意: 上面我们说的是主机连上其他的主机将会变成从机,只有读的权限,
           其实从机也可以连从机
           Redis的slave可以被其他的slave连接,但是他依然是slave,
           也就是说每一个slave都可以成为下一个slave的master,但他的状态是
           Slave,   就像是一条链一样,减轻了主机的压力,

反客为主:
         上面我们说,当主机宕机后,其余从机将不会成为master,依然是slave模式,会等待主机重启
         从机可以使用命令:
                    slaveof no one 使自己成为master,   那么另外一台从机将会自动的连接到新的主机上,更新新主机的数据到本地
                    此时,如果原来的主机宕机后重新上线,那么状态是master,也就是互不干扰,



哨兵模式

说白了哨兵模式就是反客为主的自动版,外加选举
说明:  
    能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库,
    如果票数相同,则选举失败,重新选举
     
使用:
   在bin下创建新建sentinel.conf文件,名字绝不能错 
  配置文件的内容:
  sentinel monitor 被监控数据库名字(自定义)  127.0.0.1 6379  1          
        主机的ip和端口号
      上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,
      得票数多少后成为主机 
      
配置好后,需要启动哨兵模式,
bin目录下
./edis-sentinel  sentinel.conf   


他会监控主机,当主机宕机后,在从机里面选取新的主机
当选举结束后,其他的从机无需重新连接,就已经连上了新的主机

当原来的主机重新上线后,那么他会被哨兵检测到,从master变为
Slave,而那个master是新选举的主机
之前没有使用哨兵模式,就一直是master

## redis集群
上面说了,是一主多从的一种结构,
那么主机宕机后,会有哨兵监视,会有从机替补,但哨兵的选举也需要时间,那么在这期间,访问主机是不可行的,这就引入了集群的概念
集群有效的减轻了redis的压力,提高了性能


步骤:
   备工作:将 redis 源码包上传到 linux 系统 ,解压 redis 源码包到 /usr/local 目录中

   安装gcc :   yum install gcc-c++

   使用 yum 命令安装 ruby

   yum install rubygems

   编译 redis 源码 ,进入 redis-3.0.0 源码文件夹 
       make 
   
   创建目录/usr/local/redis-cluster 目录
  
  安装 6 个 redis 实例,
  
  第一个 redis 实例为例
  make install PREFIX=/usr/local/redis-cluster/redis-1 
  安装多个 如redis-2,redis-3等
  
  将 /redis-3.0.0/redis.conf 复制到 redis 下的 bin 目录下
   
 修改每个 redis 节点的配置文件 redis.conf
并将 cluster-enabled yes 前的注释去掉(632)表示使用集群  【】

 
 然后启动实例
./redis-server redis.conf   到对应的文件里执行


上传 redis-3.0.0.gem
gem install redis-3.0.0.gem  任意目录

 
进入 redis-3.0.0 源码目录中的 src 目录

./redis-trib.rb create --replicas 1 192.168.137.128:7001 192.168.137.128:7002 
192.168.137.128:7003 192.168.137.128:7004 192.168.137.128:7005 192.168.137.128:7006【】

注意:这里的ip是你们自己对应的redis服务的所在机器上的ip,而端口则是在配置文件中配置好的端口

此时集群环境已经搭建好了


./redis-cli  -p  端口   进入客户端
但是访问不到集群环境的数据


需要加个参数  -c 

注意配置好集群环境后,存入的值有可能不在进入的这个redis数据库里,有可能到了其他的数据库哪里,那是因为我们使用了-c 参数,如果没有则会报错,
添加了该参数后,他会帮我们重定向到对应的数据库上

那为什么在这台数据库上存的值,会在另一个数据库上呢,那是因为,集群环境下,会分配一些插槽,这些插槽是存放key的,通过一些算法,存入的数据
都会在配置好的集群里面的其中一个存储,当我们从一台redis上存的数据,计算出的插槽不在当前的redis里,那么就会重定向到其他的redis数据库里
 ......
.......

其中本次demo是6个服务,
redis自动的将前三个作为主机,后三个作为从机。三主三从
如 7001 7002 7003 7004 7005 7006
 123是主机  456是从机
 而且他们主机从机的对应关系也是顺序对应的
 1 - 4   2 -  5    3 - 6
当主机宕机后,从机会顶替上来,成为新的主机
当从机也全部宕机后,保存在该节点的数据将访问不到,




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值