基础操作
- redis是以单进程模型来处理客户端的请求,对读写等时间响应是通过epoll函数的包装来做到
- redis 默认有16个库,可以通过select + 数字来切换redis库 例:select 2 意为切换到下标为2的数据库
- dbsize查看数据库key的数量,输入keys *查看各个key名
- flushdb清除当前库的所有键。flushall清除redis库的键
- exists key :判断某key是否存在 .
- move key db:移动键至另外的redis库,当前库就没有了.例:move k1 2 (将key为k1的键移动至index为2的redis库里)
- ttl key(查看key还有几秒过期),-1表示永不过期,-2表示已过期(过期之后表示生命周期已终结,会被移除redis内存)
- expire key 秒钟:为给定的key设置过期时间
- type key 查看key是什么类型
数据类型
- 五大数据类型:String(字符串),Hash(哈希),List(列表),Set(集合),Zset(sorted set:有序集合)
- redis 的string可以包含任何数据,比如jpg图片或者序列化的对象。
- string是redis最基本的数据类型,一个redis中字符串value最多可以是512M
String
- string类型常见操作函数
函数 | 含义 |
---|---|
set key value | 设置值(已有key会将其覆盖) |
get key | 获取key的值 |
del key | 删除key |
append key value | 在key值后面添加value值 |
strlen | 返回key值的长度 |
Incr/decr key | 加1/减1 |
incrby/decrby key value | 对key值进行加/减 value |
getrange key start end | 获取指定区间范围的值 |
setrange key start value | 设置指定区间范围的值 格式:setrange key值 起始下标 设置的值value |
setex key time value | 设置值并设置过期时间(秒) |
setnx key value | 判断key是否存在,如果key不存在则设置为value。设置成功返回1,设置失败返回0 |
mget/mset/msetnx | 批量读取,批量设置,msetnx(批量设置,一个失败全部失败) |
list
- list常见操作
函数 | 含义 |
---|---|
lpush/rpush | 创建list(lpush 读取时显示输入相反,先进后出。rpush则存取读取顺序一样,先进先出)例:lpush list01 1 2 3 4 5 |
lrange list start end | 读取列表 格式:lrange 列表名 起始下标 终止下标 |
lpop/rpop | lpop:清除第一个元素(栈顶元素) rpop:清除最后一个元素(栈底元素) |
lindex list index | 按照索引下标获得元素(从上到下)格式:lindex list名 下标 |
len | 获取列表的长度 |
lrem | 删n个value 格式:lrem list名 num value |
ltrim | 截取指定范围的值后再重新赋值给key 格式:ltrim key 开始index 结束index |
- list允许重复,set不允许重复
set
- set常见操作
函数 | 含义 |
---|---|
sadd | 向集合中添加一个或多个成员 |
smembers | 查看集合成员 |
sismember | 判断key是否为set成员。格式:sismember key值 member成员值 |
scard | 获取集合里面的元素个数 |
srem | 删除集合中的元素 格式:srem key值 value值(要删除的值) |
srandmember | 某个整数(随机出几个数)格式:srandmember key值 num(要随机的数目) |
spop | 随机出栈(会返回被删除的成员) |
smove key1 key2 | 将key1里的某个值赋给key2 格式 smove key1值 key2值 key1里的值 |
sdiff | 差集,格式sdiff key1 key2 返回在第一个set里面而不再后面任何一个set里面的项 |
sinter | 交集 ,格式sdiff key1 key2 返回第一个set跟后面set共同拥有的项 |
sunion | 并集 ,格式sdiff key1 key2 返回所有set的项并去重 |
hash
- hash常见操作
函数 | 含义 |
---|---|
hset | 设置hash 格式:hset 哈希表名 key value |
hget | 获取键值 格式:hget 哈希表名 key |
hmset | 批量设值 格式:hmset 哈希表名 key1 value1 key2 value2 |
hmget | 批量获取值 格式:hmget 哈希表名 key1 key2 |
hgetall | 获取整个表 格式:hgetall 哈希表名 |
hdel | 删除 格式:hdel 哈希表名 key |
hlen | 获取哈希表的长度 |
hexists | 判断key是否存在 格式:hexists 哈希表名 key |
hkeys | 获取哈希表的所有key |
hvals | 获取哈希表的所有value |
hincrby | 对哈希表中的某个值进行增加(整数) 格式:hincrby 哈希表名 key num |
hincbyfloat | 对哈希表中的某个值进行增加(小数) 格式:hincrby 哈希表名 key num |
hsetnx | 如果不存在则设值 |
zset
- zset 是在set的基础上,加一个score值。set是key1 value1 value2 value3。zset是key1 score1 value1 score2 value2
- zset 常见操作
函数 | 含义 |
---|---|
zadd | 向集合里面添加成员 格式:zadd key值 score1值 value1 |
zrange | 获取值,格式:zrange key值 start end (如果加上withscores,则连同分数一起返回) |
zrangebyscore | 获取某个分数范围的值 格式 zrangescore 开始score 结束score(在score前加“(”表示为不包含) |
zrem | 删除元素 |
zcard | 统计key下的元素个数 |
zcount | 统计分数区间内的元素个数。格式:zcount key 开始score 结束score |
zrank | 获取某个键值的下标 格式:zrank key值 value |
zscore | 获取某个值的分数 格式:zrank key值 value |
zrevrank | 逆序获取某个键值的下标 |
zrevrange | 逆序获取值 |
zrevrangebyscore | 逆序获取某个分数范围的值 格式 zrangescore 结束score 开始score |
事务
- redis事务:可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞
- redis事务常见操作
函数 | 含义 |
---|---|
multi | 标记一个事务块的开始 |
exec | 执行所有事务块内的命令 |
discard | 取消事务,放弃执行事务块内的所有命令 |
watch key[key…] | 监视一个(或多个)key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断 |
unwatch | 取消watch命令对所有key的监视 |
- redis事务一旦加入了队列,即使它报错了它也会往下执行,不会影响其他队列的执行。只有在加入队列时报错(即不符合语法的命令),无法加入队列,事务才会整个回滚撤销
- 悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁,传统的关系型数据库库里面就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁
- 乐观锁(Optimistic Lock),顾名思议,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候回判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制,乐观锁适用于多读的应用类型,这样可以提高吞吐量。
- 乐观锁策略:提交版本必须大于当前版本才能执行更新
淘汰策略
- redis默认端口6379
- redis是存在内存的一个缓存服务器
- redis的日志模式分为四个模式,debug,verbose,notice,warning,默认为verbose。
- 开发测试阶段可以将配置里的loglevel改为debug调试模式,上线之后可以将loglevel更改为notice或warning
- 可以通过输入config set requirepass +密码来设置连接redis的密码
- LRU算法,least RecentlyUsed,最近最少使用算法。也就是说默认删除最近最少使用的键。
- redis的过期淘汰策略
规则名称 | 规则说明 |
---|---|
volatile-lru | 使用LRU算法删除一个键(只对设置了生存时间的键) |
allkeys-lru | 使用LRU算法删除一个键 |
volatile-random | 随机删除一个键(只对设置了生存时间的键) |
allkeys-random | 随机删除一个键 |
volatile-ttl | 删除生存时间最近的一个键 |
noeviction | 不删除键,只返回错误 |
持久化
- redis持久化:rdb(Redis DataBase)与aof(Append Only File)
Rdb
- rdb:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是snapshot快照,它恢复时是将快照文件直接读到内存里
- redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件
- 如果需要进行大规模数据的恢复,且对数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效,RDB的缺点就是最后一次持久化后的数据可能丢失
- 可以通过修改配置文件的save指令来制定持久化策略。指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配置。redis默认配置文件中提供了三个条件:save 900 1 save 300 10 save 60 10000 分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
- RDB优点
- RDB是一个非常紧凑的文件
- RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化可以最大化redis的性能
- 与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些
- RDB缺点
- 数据丢失风险大
- RDB需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的进程是非常耗时的,可能会导致redis在一些毫秒级不能响应客户端请求
Aof
- redis默认开启RDB进行数据存储,AOF默认关闭,可以通过修改配置文件里的appendonly改为yes来开启AOF持久化
- AOF:以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将指令从前到后执行一次以完成数据的恢复工作
- AOF与RDB能同时开启,如果AOF开启了则优先加载AOF
- AOF异常修复:先备份被写坏的AOF文件,再执行redis目录下的Redis-check-aof —flx进行语法检查并修复,再重启redis
- AOF采用的是文件追加方式,文件会越来越大,为避免这种情况,它里面新增了重写机制。当AOF文件的大小超过所设定的阈值时,redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集
- AOF重写触发机制:redis会记录上次重写时的AOF的大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发
- AOF优点
- AOF文件时一个只进行追加的日志文件
- Redis可以再AOF文件体积变得过大时,自动地在后台对AOF进行重写
- AOF文件有序地保存了对数据库执行的所有写入操作,这些写入操作以redis协议的格式保存,因此AOF文件的内容非常容易被人读懂,对文件进行分析也很轻松
- AOF缺陷
- 对于相同的数据集来说,AOF文件的体积通常要大于RDB文件的体积
- 根据使用的fsync策略,AOF的速度可能要慢于RDB
文件时一个只进行追加的日志文件
主从复制
- 主从复制:主机数据更新后根据配置跟策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
- 主从复制实现:
- 配从(salve库)不配主(master库)。
- 就是不对主库进行配置,直接在从库的配置里面声明自己是从库身份并指定主库ip
- 从库配置:slaveof 主库ip 主库端口
- 常用三招
- 一主二仆
- 薪火相传:slave库作为另外redis库的主库
- 反客为主: slaveof no one
- info replication:查看自己是slave库还是master库
- slaveof 主库ip 主库端口 :声明自己为从库,指定主库ip
- slaveof no one :身份转为master,不作slave(反客为主)
- 在没配置的情况下,当master库崩掉后,slave库原地待命,等待master库重连
- 当slave库被另外的redis库当成主库时,它的身份依旧是slave
- 复制原理:
- Slave启动成功连接到master后会发送一个sync命令
- Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步(全量复制)
- 全量复制:slave服务在接受到数据文件数据后,将其存盘并加载到内存中
- 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
- 主从复制开始首次加载时全量复制,之后的是增量复制
- 只要是重新连接master,一次完全同步(全量复制)将被自动执行
哨兵模式
- 哨兵模式(反客为主的自动版):通过创建sentinel.conf配置文件输入“redis-sentinel sentinel.conf”启动哨兵来后台监控主机是否故障,如果故障了根据投票数自动将从库转换成主库
- 在哨兵模式下,master一旦故障就会有新的slave身份转换为master,成功上位,即使之前的master重连了,那它的身份也会变成slave。