redis笔记

命令目录: cd /usr/local/bin

启动redis:

   1)加载配置文件  redis-server redis.conf(daemonize yes设置后台启动)

   2 ) 启动: redis-cli -p 6379

需要密码登录的时候: auth password

安装目录:cd /opt/redis

redis.conf正常使用最少配置:

daemonize yes设置后台启动

# 默认只有本机可以连接,如果需要其他机器连接,可以将下面配置注释掉~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 127.0.0.1

#安全模式 yes开启 no 关闭
#开启情况下不管是否配置了密码、bind,都仅本机(127.0.0.1)可以访问
protected-mode yes

 

redis-cli

需要密码登录的时候: auth password

select 0  redis默认有16个数据库,默认是在0号库,通过这个命令可以切换

flushall 清除所有的数据库   

flushdb 清除当前库

查内存使用情况:info memory

监控:monitor

 

-----------key(所有类型的的变量名都为key,通用的命令)------------

info replication 查看当前redis的一些信息

keys * 查询当前库所有key

exists k1  判断k1是否存在

move k1 1 将当前数据库中的k1移除至1号数据库

expire k1 7  设置k1的过期时间为7秒

 ttl k1 查看k1还有多少秒过期,-1表示永不过期,-2表示已过期

type k1 查看k1是什么类型

---------String-----------

set k1 v1  设置一个key为k1,值为 v1,如果要修改,继续设置,如:set k1 v11

mset k1 v1 k2 v2  设置多个key

msetnx k1 v1 k2 v2 设置多个key,当k1或者k2有存在的话,命令不生效,只有当k1、k2都不存在,有效;mset就覆盖

get k1 获取单个key的值

mget k1 k2 获取多个key的值

del  k1 k2 删除多个key,也可以删除单个key

append k1 java 在k1对应的value值后面加字符串:java

strlen k1  k1对应的value值的长度

getrange k1 0 -1 获取k1对应的value值

getrange k1 0 2 获取k1对应的value值,显示value值的下标为:0到2的值,如123456显示123

setrange k1 1 xxxx  设置k1的值,下标为1开始用xxxx代替,如1234变为1xxxx

setex k2 10 v2 定义key的时候设置过期时间为10秒,expire是先定义好,在设置

setnx k1 v11 当k1不存在的时候,这个命令才有效,如果存在,则无效

getset k1 v11  将k1 的值设为 v11 ,并返回 k1 的旧值(old value)。

 

给balance减10,如果不为数字,不成功

decrby  balance 10

incrby  balance 10    加10

decr  balance   减1

incr  balance  加1

watch balance   监控

unwatch 放弃监控

---------------list---------------------

lpush list01 1 2 3 4 5   先进后出

rpush list02 1 2 3 4 5 先进先出

lrange list01 0 -1  将list01全部输出

lpop list01 将list01栈顶的数据移除(下标为0) 即 1

rpop list01 将list01栈尾的数据移除 即 5

lindex list01 2 获取下标为2的值

llen list01 获取list01长度

lrem list01 2 3  删除list01中的元素,即删除2个3

ltrim list01 0 3 截取list01下标为[0, 3]的元素然后赋值给list01

rpoplpush list01 list02  将list01栈尾的元素移除至list02的栈首

 lset list01  1 x  将list01下标为1的值改为x

 linsert list01  before  x java  在list01中值为x的元素前面加一个java元素

 linsert list01  after  x java  在list01中值为x的元素后面加一个java元素

------set-----

 sadd set1 1 2 3  创建一个set为set1 有三个元素:1 2 3

smembers set1  获取set1中所有的元素

 scard set1  获取集合里面的元素个数

 srem set1  1    删除 set1 集合中元素 1

------事务-------

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

一个队列中,一次性、顺序性、排他性的执行一系列命令

multi  标记一个事务块的开始

discard 取消事务,放弃执行事务块内的所有命令

exec 执行所有事务块内的命令

watch 监视一个或多个key,如果在事务执行之前监控的key被其他命令所改动,事务将被打断

unwatch  取消watch命令对所有key的监视

case1:正常执行    一个事务内都是正常的命令,则正常执行

Case2:放弃事务  也就是使用discard命令,在一个事务内,发现又不要了,可以放弃事务

Case3:全体连坐   在一个事务中,如果有一条错误的命令(即输入命令后按enter键,提示错误),即事务内的所有操作无效

Case4:冤头债主  在一个事务中,如果有一条潜在的错误命令(即当时不报错,可以理解为编译的时候不报错,执行的时候报错,比如说incr  balance,但是set balance a,加1操作就会在执行时报错),即事务内的其他操作有效,该错误操作无效

所以说redis是支持部分事务:

单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

没不存在隔离性:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,
也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题

不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚(冤头债主)

--------Redis的复制(Master/Slave)---------

行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主.当在从机上进行写的操作,不成功(报错),即读写分离,

复制原理:

slave启动成功连接到master后会发送一个sync命令

Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,
在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步

全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。(即第一次是全量)

增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步(之后是增量)

但是只要是重新连接master,一次完全同步(全量复制)将被自动执行

复制缺点:由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

一主二仆:

从库配置:slaveof 主库IP 主库端口,执行改命令既可,如 slaveof  127.0.0.1 6379,马上将6379的数据同步过来了

6380> slaveof  127.0.0.1 6379

6381> slaveof  127.0.0.1 6379

info replication  查看当前库的基本信息,是主库还是从库,有从库的信息,主库的信息

当主机死了,怎么办:当前配置下,主机死了,从机依然是从机,原地待命,不会上位,当主机回来了,当做什么事也没发生,继续遵循主从复制

当6380死了,在重新启动后,跟6379没有关系了,info replication显示自己是主机,需要从新用命令slaveof连接上主机,除非你配置进redis.conf文件,如果要在配置文件中配置:

#
# slaveof <masterip> <masterport>

slaveof  127.0.0.1 6379    #在这个位置上加上即可

# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the slave to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the slave request.
 

薪火相传:

上一个Slave可以是下一个slave的Master,Slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力

6380> slaveof  127.0.0.1 6379

6381> slaveof  127.0.0.1 6380

6380本质上还是从库,只不过他连接了一个6381,所以在6380上进行写的操作还是会报错,当主机或者从机死了,情况跟一主二仆是一样的

反客为主:

当主机6379挂了,指定一个从机6380为主机,即6380数据库停止与其他数据库的同步,转成主数据库

6380> SLAVEOF no one     6380变成主机

6381> slaveof  127.0.0.1 6380    这个时候6381还在等着6379回来,所以用这个命令让6381跟着6380混

如果6379回来了,则6379自成一个体系,跟6381和6380无关

哨兵模式(sentinel):简单来说就是反客为主的升级版

反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

一组sentinel能同时监控多个Master

使用步骤:

1)自定义的/myredis目录下新建sentinel.conf文件,名字绝不能错

2) sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6379 1  (如:sentinel monitor host6379 127.0.0.1 6379)

 上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多少后成为主机

3)启动哨兵:redis-sentinel /myredis/sentinel.conf 

当6379挂了后,会自动投票将一个从库变成主库(设为:6380),并且6381自动跟着6380,当6379回来后,自动跟着6380,即回来后也变成从库了

 

redis的持久化:

rdb:(RDB默认是启动的)

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

rdb 保存的是dump.rdb文件,有其触发的规则如:save命令或bgsave、flushall,都会产生该文件

优势:

适合大规模的数据恢复、对数据完整性和一致性要求不高

劣势:

在一定间隔时间做一次备份,所以如果redis意外down掉的话,就
会丢失最后一次快照后的所有修改

fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑

aof:

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

Aof保存的是appendonly.aof文件,默认是关闭的,要手动开启

优势:

每修改同步:appendfsync always   同步持久化 每次发生数据变更会被立即记录到磁盘  性能较差但数据完整性比较好

每秒同步:appendfsync everysec    异步操作,每秒记录   如果一秒内宕机,有数据丢失

劣势:

相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb

aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

使用建议:如果只做缓存,可以都不用配置,使用默认。如果存储数据,建议都开启,rdb在slave上持久化,15分钟就行,开启aof,把重写的基础大写默认值64m改掉,为5g以上,因为重写的代价是带来持续的io,会阻塞。具体可以看文档。

 

rdb是默认开启,fork一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件

aof是把每次事物操作的命令记录以日志的方式记录起来。

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值