一,Redis的作用
1.内存存储和持久化
Redis支持异步将内存中的数据些到磁盘上,同时不影响继续服务取最新N个数据的操作。
2.模拟类似HttpSession这种需要设置过期时间的功能
3.发布、订阅消息系统
4.定时器、计数器
二,Redis的安装
1.下载Redis
wget http://download.redis.io/releases/redis-2.8.3.tar.gz
2.解压Redis
tar -zxvf redis文件
3.进入解压后Redis目录
4.输入make命令进行安装
如果安装出现gcc错误,请安装gcc。
能上网:输入yum install gcc-c++。
不能上网:https://jingyan.baidu.com/article/d2b1d102af38ab5c7e37d4e3.html参考
5.安装成功后会出现一句It's a good idea to run ‘make test’。这个可以不用管。
因为会安装TCL一些东西,费时间。
安装好后,文件在usr/local/bin下
三,Redis启动
1.创建一个myredis文件夹
2.将/opt/redis-4.0.6目录下的redis.conf文件复制到myredis文件夹中
3.使用vim命令修改复制过来的redis配置文件
将daemonize 修改为yes
4.启动redis(使用myredis中的配置文件)
在使用远程连接的时候可以使用redis-cli -h ip地址(记的在配置文件中将bind 127.0.0.1注释,同时将protected-mode yes改为protected-mode no)
默认端口是6379,当然也可以在配置文件中修改。
5.判断redis服务是否启动使用ping命令
出现pong则OK。
6.简单键值对
7.关闭使用shutdown
四,数据类型常用命令
1.key
1).keys * :查看所有的key
2).exists key :查看某个key是否存在
3).move key db :将key移动到db,当前库移除
4).expire key 秒 :为给定的key设置过期时间
5).ttl key :查看还有多少秒过期,-1表示永不过期,-2表示已经过期(过期后无法获取)
6).type key :查看key的类型
2.String
string是Redis最基本的类型,一个key对应一个value。也是二进制安全的,一个Redis中字符串value最多可以是512M。
1).set key value :添加一个string类型
2).get key :获得key对应的value
3).append key string :key对应的value后添加string
4).strlen key :获取key对应value的长度
5).incr/decr/incrby/decrby :一定要是数字才行
6).getrange key start end :获取指定区间的值
0到-1表示全部
7).setrange key offset value :从offset位置覆盖value的值
8).setex key 秒 value :设置key-value并设置key的过期时间
9).setnx key value :如果不存在key,则添加key-value,反之不添加。
10).mset/mget/msetnx:m代表more的意思,这里就是批量添加
如果使用msetnx时只有部分的key在Redis中不存在,那么这个语句将执行失败
3.List
1).lpush/rpush/lrange
lpush从左边插入数据,rpush从右边插入数据,lrange查看list元素(用下标)。
2).lpop/rpop
lpop从左边弹出数据,rpop从右边弹出数据。
3).lindex
按照索引下标获得元素
4).llen 获取list的长度
5).lrem key count value 删除count个value
6).ltrim key start end 截取下标的元素覆盖key的数据
7).rpoplpush key1 key2 key1右出key2左进
8).lset key index value 修改key的index下标值为value
9).linsert key before/after value1 value2 在value1的前面或者后面插入value2
4.set
1).sadd/smembers/sismember 添加元素/查询所有元素/查询是否存在某元素
添加重复的会被删除
2).scard 获取set中有多少个元素
3).srem key value 删除set中的元素
4).srandmember key count 从key的集合中随机出count个数
个数不够就出集合的所有元素
5).spop key 随机出栈
6).smove key1 key2 key1中的值
将key1中的值移到key2的集合中
7).数学集合:sdiff(差集)sinter(交集)sunion(并集)
5.Hash
1)hset/hget/hmset/hmget/hgetall/hdel
hset:添加元素。
hget:获取元素。
hmset:添加多个元素。
hmget:获取多个元素。
hgetall:获取全部元素。
hdel:删除元素。
2)hlen 获得长度
3)hexists key 判断key是否存在
4)hkeys/hvals hkeys获取所有key/kval获取所有values
5)hincrby/hincrbyfloat 递增
6)hsetnx 不存在则添加
6.Zset
在set的基础上加了一个score值
1)zadd/zrange
2)zrangebyscore(其中可以是用(表示不等,limit来实现分页)
3)zrem 移除元素
4)zcard/zcount/zrank/zscore
zrank获取下标
zscore获取分数
5)zrevrank 逆序获得下标
6)zrevrange 逆序获得元素
7)zrevrangebyscore 与zrangebyscore相反
五,Redis的配置文件
1.Redis的单位:1k与1kb是有区别的
2.include包含
Redis配置文件也可以通过配置包含其他的Redis文件
3.general通用
daemonize yes: 开启守护进程,默认情况下是no
pidfile: 进程管道id文件
port 6379: 端口,默认是6379
tcp-backlog 511: 默认是511,backlog是一个连接队列,队列的总和=未完成三次握手队列+已完成三次握手队列
bind: ip绑定
timeout N: 客户端空闲N秒后断开连接(0表示不关闭)
tcp-keepalive 0: 单位为秒,如果设置为0,则不进行keepalive检测,建议设置撑60
loglevel notice: 日志级别,包括debug,verbos,notice,warning级别依次增高
logfile "" :日志文件,可以设置文件的路径
syslog-enable no:系统日志是否开启,默认是被注释的
syslog-ident reids:开启系统日志,输出信息以reids开头,默认是被注释的
syslog-facility local0:输出日志的设备,值可以是USER或者(LOCAL0到LOCAL7),默认是被注释的
database 16:数据库个数,默认是16
4.SNAPSHOTTION快照(RDB)
save 秒 写操作次数
默认情况下:
15分钟以内key值发生1次改变
5分钟以内key值发生10次变化
1分钟以内key发生10000次变化
禁用的话设置save “”
可以使用save,bgsave,flushall命令手动进行保存
save:只管保存,其他不管,全部阻塞。
gesave:redis会在后台异步进行快照操作。
flushall:会产生dump.rdb,但是里面是空的,无意义。
stop-writes-on-bgsave-error:当保存出错的时候,前台禁止写操作。默认是yes
rdbcompressio:对于存储到磁盘的快照是否使用LZF算法进行压缩,默认是yes。
rdbchecksum:在存储快照后,redis是否使用CRC64算法进行数据校验,默认是yes。这样做会增加大约10%的性能消耗(无关紧要,一般晚上进行备份)。
dbfilemane:存储的文件名。默认dump.rdb。
dir:文件保存位置。
5.REPLICATION复制
6.SECURITY安全
访问密码的查看,设置,取消。默认是不需要的密码的,redis认为在Linux系统中已经是一个通过安全的环境下。
config dir 查看当前运行路径
config set requirepass设置密码
config get requirepass获取密码
7.LIMITS限制
maxclients:最大连接数,默认10000
maxmemory:最大内存
maxmemory-policy:当达到最大内存时选择过期策略,包括volatile-lru,allkeys-lru,volatile-random,allkeys-random,volatile-ttl,noeviction。默认是noeviction
注:LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的 数据淘汰。
- volatile-lru:使用lru算法移除key,只对设置了过期时间的key。
- allkeys-lru:使用lru算法移除key。
- volatile-random:在过期集合中随机移除key,只对设置了过期时间的key。
- allkeys-random:随机移除key。
- volatile-ttl:移除ttl值最小的key,即最近要过期的key。
- noeviction:不移除key,针对写操作只是返回错误信息。
maxmemory-samples:设置模板的数量,LRU算法和最小TTL算法都不是精确的算法,而是估算值,所以你可以设置模板的大小。
8.APPEND ONLY MODE追加
appendonly:是否开启aof,默认是no,开启是yes。
appendfilename:保存的文件名,默认是appendonly.aof。
appendfsync: 有以下三个值选择
- always:同步持久化,每次发生数据变更会被立即记录到磁盘,性能较差,但是数据完整性比较好。
- everysec:默认推荐,异步操作,每秒记录,如果一秒内宕机有数据丢失。
no-appendfsync-on-rewrite:重写时是否可以运行appendfsync,默认是no即可,保证数据安全性。
auto-aof-rewrite-min-size:设置重写的基准值。
auto-aof-rewrite-percentage:设置重写的基准值。
六,持久化
Redis持久化的两种方式:RDB(redis database)和AOF(append only file)。
1.RDB
在指定的时间间隔内将内存中的数据集快照写入磁盘。(也就是snapshot快照)
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化结束后,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
注意:如果rdb文件损坏出错,那么Redis将启动不起来,此时可以使用命令redis-check-rdb来修复aof文件。
1)默认文件名:dump.rdb
2)配置RDB
默认情况下:
15分钟以内key值发生1次改变
5分钟以内key值发生10次变化
1分钟以内key发生10000次变化
禁用的话设置save “”
可以使用save,bgsave,flushall命令手动进行保存
save:只管保存,其他不管,全部阻塞。
gesave:redis会在后台异步进行快照操作。
flushall:会产生dump.rdb,但是里面是空的,无意义。
3)恢复数据
将dump.rdb文件移动到redis的安装目录并启动redis即可。
4)优点
适合大规模的数据恢复,对数据的完整性和一致性要求不高。
5)缺点
在一定时间间隔做一次备份,所以如果redis意外挂掉,就会丢失掉最后一次快照后的所有修改。(dump.rdb还没来得及记录你的操作)
fork的时候,内存中的数据被克隆一份,大致2倍的膨胀性需要考虑。
2.AOF
以日志的形式记录每一个操作,将Redis所有执行过的写操作记录下来(读操作不记录),只许追加文件不允许改写文件,Redis启动的时候会读取该文件重新构建数据。
默认是关闭状态。
注意:aof和rdb是可以共存的,优先使用aof。如果aof文件损坏出错,那么Redis将启动不起来,此时可以使用命令redis-check-aof --fix 文件名来修复aof文件。
1)默认文件名:appendonly.aof
2)rewrite
因为AOF采用文件追加的形式,文件会变得越来越大,为了避免这种情况增加了重写的机制。当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof。
重写的原理:aof文件持续增长而过大时,会fork出一条新进程来将文件重写(先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的set语句。重写aof文件的操作并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写一个新的aof文件。
触发的机制:Redis会记录上次重写时的aof大小,默认配置是当aof文件大小是上次rewrite后大小的一倍且文件大于64M时触发。
七,事务
可以一次性执行多个命令。在一个事务中的所有命令都会序列化,按照顺序的串行执行而不会被其他命令插入,不许加塞。
1.关于事务的命令
- DISCARD:取消事务,放弃执行事务块内的所有命令
- EXEC:执行所有事务块的命令
- MULTI:标记一个事务块的开始
- UNWATCH:取消WATCH命令对所有key的监视
- WATCH key[key...]:监视一个(或多个)key,如果在事务执行之前这个(或这些)key被其他命令所修改,那么事务将被打断。
2.正常执行事务
3.放弃事务
4.全体一致
5.谁错找谁
与上面4的区别在于,incr k1的时候是加入队列了,而getse k2在加入队列的时候就已经错误
6.WATCH监控
无人修改的情况
有人修改的情况
在使用WATCH命令后在新终端中修改k1
7.Redis事务的特性
- 单独的隔离操作:事务中所有命令都会按顺序执行,事务在执行的过程中不会被其他客户端发来的命令请求所打断。
- 没有隔离级别的概念:事务中的命令在没有提交(EXEC)前是不会实际运行的。因为事务提交前不会被实际执行,所有也就不存在“事务内的查询要看到事务里的更新,事务外的查询不能看到”。
- 不保证原子性:Redis的一个事务中,如果其中一条命令执行失败,其后的命令仍然会执行,不会回滚。
八,消息订阅
Redis的发布订阅是进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接受消息。
1.命令
- psubscribe pattern[pattern...]:订阅一个或多个频道(可以使用通配符*)
- pubsub subcommand[argument[argument...]]:查看订阅与发布系统状态
- publish channel message:将消息发布到频道上
- punsubscribe [pattern[pattern...]]:退订所有给定模式的频道
- subscribe channel[channel...]:订阅给定的一个或多个频道的消息
- unsubscribe [channel[channel...]]:退订给定频道
九,主从复制
主机(master)数据更新后根据配置和策略自动同步到备机(slaver)。
1.配置方法
1).命令方式: slaveof 主机ip 主机端口
2).配置文件方式
在配置文件中把slaveof 主机ip 主机端口添加进去。
有一个selave no one命令可以是挡墙数据库停止与其他数据库的同步,转成主库
2.原理
slave启动成功连接到master后悔发送一个sync命令,master接到命令启动后台存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕后,master将传送整个数据文件到slave,以完成一次完全的同步。
全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中
增量复制:master继续将新的所有收集到的修改命令依次传给slave,完成同步。只要是重新连接master,一次全量复制将被自动执行。
3.主从复制的模式
1).中心化结构
配置3个端口
6379端口先添加几个key,之后6380和6381设置为从机
6379端口再添加1个key后在从机中试着查看key
注意:
1.从机中是不能写操作的。
2.主机如果宕机,那么从机依然会保留key,但是依然是slaver的角色。
3.如果主机宕机后恢复,那么依然是主机,和没有宕机一样
4.如果从机宕机,那么使用slaveof命令将不能是其恢复成从机。如果是在配置文件中配置从机的属性,那么宕机后仍然是从机。
2).链式结构
3).哨兵模式
如果主机宕机,那么哨兵会监控出来,那么在剩下的从机中投票选择出一个主机。
配置哨兵模式:sentinel monitor 被监控数据库名字 ip 端口 票数
使用redis-sentinel命令启动哨兵
配置主从机
接下来,主机宕机。哨兵会监控到主机宕机,并选出新的主机。
如果此时主机重新上线,那么将会成为新主机的从机。