Redis从入门到精通
redis是用C语言开发的一个基于内存的、高性能key-value键值对的、开源nosql数据库。目前,redis的key是字符串类型的,但value支持多种数据类型:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(sortedset),通过提供多种键值数据类型来适应不同场景下的存储需求。
介绍几种常见的应用:
1.构建队列系统
3.计数器应用
1.基于内存存储,数据访问速度快,性能好
根据官方提供的测试数据:50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s【数据仅供参考,根据服务器配置会有不同结果】
目前支持APF和RDB两种持久化机制,下文会详细阐述
注意:Redis3.X开始才支持集群模式
这一点是相比其他缓存工具如memcache比较鲜明的优势
下面详细介绍一下redis的value目前支持的数据类型:
操作redis的string类型数据常用命令:
set(设置)、get(获取)、getset(获取并设置)、del(删除)
一次性插入或者获取多条数据:
MGET key1 key2
MSET key1 value1 key2 value2 …..
在插入一条string类型数据的同时为它指定一个存活期限:
incr:将指定的key的value原子性的递增1。如果该key不存在,其初始值为0,在incr之后其值为1
decr:将指定的key的value原子性的递减1。如果该key不存在,其初始值为0,在decr之后其值为-1
incrby key increment:将指定的key的value原子性增加increment。如果该key不存在,其初始值为0,在incrby之后,该值为increment
decrby key decrement:将指定的key的value原子性减少decrement,如果该key不存在,其初始值为0,在decrby之后,该值为decrement。
注意:
笔者强调一点:redis中list底层是双端链表结构,这个在面试中经常会问。redis为什么这么快,其实不仅仅是因为基于内存存储,底层还多了很多的优化,这只是其中之一,下图是对双端链表的一个图形描述:
lpush:从头部(左边)插入数据
rpush:从尾部(右边)插入数据
lrange key start end:读取list中指定范围的values。start、end从0开始计数;也可为负数,若为-1则表示链表尾部的元素,-2则表示倒数第二个,依次类推…
lpop:从头部弹出一个元素
rpop:从尾部弹出一个元素
rpoplpush:从一个list的尾部弹出一个元素插入到另一个list。原子性操作,没有key2会创建key2,一旦key1的list元素被取完,key1会被清除
1.生产者将生产的任务lpush进task-queue中
2.消费者通过rpoplpush将taks-queue中取任务并暂存任务到tmp-queue中
3.如果任务处理成功,tmp-queue通过rpop清除相应任务;任务处理失败,则rpoplpush将任务从tmp-queue中清除并存入task-queue中
4.为了避免消费者程序在处理任务失败之后没有及时将rpoplpush失败的任务时就已经挂掉,可以加入一个管理tmp-queque的角色,以便在这种情况时也能将处理失败的任务lpush进task-queue中。
redis中的hash类型可以看成具有map容器,适合存储值对象的信息。如username、password等。
常用命令:
hset key field value:为指定的key设定field/value对(键值对)
hmset key field value [field2 value2 …]:设置key中的多个filed/value
hincrby key field increment:设置key中filed的值增加increment
sdiff、sunion、sinter:差集、并集、交集
sortedset中的每一个元素都会有一个分数与之关联,redis正是通过分数来为集合中的元素进行排序,默认正序。注意:sortedset中的数据不能重复,但分数却可以重复。
常用命令:
首先强调一点,redis2.X是弱事务,redis3.X无事务。
1.在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,redis不会再为其它客户端的请求提供任何服务,从而保证了事物中的所有命令被原子的执行
1.save
redis会先阻塞所有客户端的请求,然后将数据同步保存到磁盘
2.bgsave
将数据异步保存到磁盘。通过fork出子进程,父进程继续处理请求,子进程将数据异步保存到磁盘
3.lastsave
返回上次成功将数据保存到磁盘的时间戳
4.shundown
将数据同步保存到磁盘,然后关闭服务
AOF
可以通过在客户端执行命令bgrewriteaof,将冗余命令进行删除
4.启动 ./redis-server redis.conf,查看启动状态 ps -ef | grep redis
5.输入命令 ll,出现appendonly.aof文件
通过上述的介绍会发现,AOF相对RDB持久化更安全,但效率稍微低一些,恢复慢
Redis主从配置
1)master不需要修改
2)slave修改以下标签
如:#slaveof <masterip> <masterport>
启动服务器时先启动master,通过info命令查看主从服务状态命令。实际生产环境中,仅仅如此配置主从还不行,还要考虑单点故障问题,实现主从容错自动切换,这需要用到哨兵模式。
Redis主从灾难恢复策略
步骤:
a)修改主从配置文件:redis.conf中的daemonize no改为yes
b)使用命令:redis-cli -p 端口号==》slaveof NO ONE(关掉主从,转为主服务器)
启动服务器后,将备份服务器最新的AOF备份拷贝到master端,启动master,一切完成后,再启动slave(否则在master没有完全启动时启动slave,slave发现master数据比自身还少,会删除掉自身携带的”多余”的数据)
哨兵模式
哨兵通过监控master,如果master无法心跳回应,哨兵进行投票从slave中(如果多个)选出一个master,然后进行容错切换。
sentinel.conf:redis哨兵模式配置文件
redis-sentinel:哨兵启动脚本
启动:./redis-sentinel /usr/local/redis-cluster/sentinel.conf
#当前机器监测master名字及端口号,2:当有几台哨兵监控到主机出错后执行主从切换(sentinel做决策的时候需要投赞同票的最少的sentinel的数量) #当哨兵对master执行ping操作时,超过指定时间没有回应即认为master处于(s_down状态)subjectively #down默认30秒 #sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败 #在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步 #sentinel auth-pass mymaster 123456#如果你的redis集群有密码 logfile "/usr/local/log/sentinel.log" #当前哨兵模式存放的日志文件 (哨兵模式一旦启动,会在后台修改sentinel.conf文件,所以此时不要去手动修改配置文件了) |
哨兵作用
4.哨兵为客户端提供服务发现,客户端链接哨兵,哨兵提供当前master的地址然后提供服务,如果出现切换,也就是master挂了,哨兵会提供客户端一个新地址 |
Redis安全性
redis.conf文件中添加:requirepass 密码,以后在客户端登录的时候必须得给出密码:./redis-cli.sh 密码。一般公司环境都会设置密码
Redis数据迁移
介绍几种常用的方式:
1.RDB方式
注意:这种方式必须修改redis.conf文件中appendonly yes改为no
2.使用第三方工具进行数据恢复或者迁移
先安装 yum install ruby rubygems ruby-devel gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ gem install redis-dump -V 命令(直接在linux命令行输入): redis-dump -u mini1:6379 > dump.json #将dump.rdb文件拷贝成一份dump.json < dump.json redis-load -u mini1:6379然后重新进入客户端查看数据是否迁移成功 |
Redis回收策略
可以通过配置redis回收策略,淘汰redis中的冷数据,保持redis中是经常用到的热数据。配置文件redis.conf,#maxmemory <bytes> (redis当前缓存的最大内存数);#maxmemory-policy volatile-lru(移除超过生命周期的key)
maxmemory-policy: 1) volatile-lru 2) volatile-ttl 3) volatile-random 4) allkeys-lru 5) allkeys-random 6) no-enviction 禁止驱逐数据 |