目录
一、入门
1、定义
Redis(REmote DIctionary Server远程字典服务)是一个开源的、高性能、基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同场景下的缓存与存储需求。
2、启动
redis-server
3、停止
redis-cli SHUTDOWN
4、配置
(1)启动前静态配置
redis-server /path/to/redis.conf
(2) 启动后动态配置
CONFIG SET
二、数据类型
1、键的操作
(1)获得符合规则的键名列表
KEYS pattern
(2)判断键是否存在
EXISTS key
(3)删除键
DEL key [key ...]
(4)获得键值的数据类型
TYPE key
2、字符串
(1)赋值
SET key value
(2)取值
GET key
(3)数字键值操作
//数字递增
INCR key
//增加指定的整数
INCRBY key increment
//数字递减
DECR key
//减少指定的整数
DECR key increment
//增加指定浮点数
INCRBYFLOAT key increment
(4)字符串键值操作
//向尾部追加值
APPEND key value
//获取字符串长度
STRLEN key
(5)同时获得/设置多个键值
MGET key [key ...]
MSET key value [key value ...]
(6)位操作
GETBIT key offset
SETBIT key offset value
BITCOUNT key [start] [end]
BITOP operation destkey key [keys ...]
3、散列
(1)赋值
HSET key field value
HMSET key field value [field value ...]
(2)取值
HGET key field
HMGET key field [field ...]
HGETALL key
(3)判断字段是否存在
HSETNX key field value
(4)当字段不存在时赋值
HEXISTS key field
(5)增加数字
HINCRBY key field increment
(6)删除字段
HDEL key field [field ...]
4、列表
【链表实现】
(1)向列表两端增加元素
LPUSH key value [value ...]
RPUSH key value [value ...]
(2)从列表两端弹出元素
LPOP key
RPOP key
(3)获取列表中元素的个数
LLEN key
(4)获得列表片段
LRANGE key start stop
(5)删除列表中指定的值
LREM key count value
(6)获得/设置指定索引的元素值
LINDEX key index
LSET key index value
(7)向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
(8)将元素从一个列表转到另一个列表
RPOPLPUSH source destination
5、集合
(1)增加/删除元素
SADD key member [member ...]
SREM key member [member ...]
(2)获得集合中的所有元素
SMEMBERS key
(3)判断元素是否在集合中
SISMEMBER key member
(4)集合间运算
SDIFF key [key ...]
SINTER key [key ...]
SUNION key [key ...]
(5)获得集合中元素个数
SCARD key
(6)进行集合运算并将结果存储
SDIFFSTORE destination key [key ...]
SINTERSTORE destination key [key ...]
SUNIONSTORE destination key [key ...]
(7)随机获得集合中的元素
SRANDMEMBER key [count]
(8)从集合中弹出一个元素
SPOP key
6、有序集合
【散列表和跳表实现】
(1)增加元素
ZADD key score member [score member ...]
(2)获得元素分数
ZSCORE key member
(3)获得排名在某个范围的元素列表
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
(4)获得指定分数范围的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
(5)增加某个元素的分数
ZINCRBY key increment member
(6)获得集合中元素的数量
ZCARD key
(7)获得指定分数范围内的元素个数
ZCOUNT key min max
(8)删除一个或多个元素
ZREM key member [member ...]
(9)按照排名范围删除元素
ZREMRANGEBYRANK key start stop
(10)按照分数范围删除元素
ZREMRANGEBYSCORE key min max
(11)获得元素的排名
ZRANK key member
ZREVRANK key member
(12)计算有序集合的元素
三、进阶
1、事务
(1)Redis中的事务是一组命令的集合。
redis> MULTI
ok
redis> SADD "user:1:following" 2
QUEUED
redis> SADD "user:1:following" 1
QUEUED
redis> EXEC
1) (integer) 1
2) (integer) 1
(2)Redis事务错误的处理方式
- 语法错误:具有事务的原子性特征
- 运行错误:不具有事务的原子性特征,不能回滚
(3)WATCH命令可以监控一个或多个键,一旦其中有一个键被修改或删除,之后的事务就不会被执行,一直持续到EXEC命令。
WATCH命令的作用知识当被监控的键值被修改之后阻止后一个事务的执行,而不能保证其他客户端不修改这一键值。
2、过期时间
(1)设置过期时间
EXPIRE key seconds
(2)查看剩余生存时间
TTL key
(3)取消键的过期时间设置(将键恢复成永久)
PERSIST key
3、排序
(1)SORT:对列表类型、集合类型、有序集合类型键值进行排序。
(2)BY:根据参考键排序。
(3)GET:使SORT命令的返回结果不再是元素自身的值,而是GET参数中的指定键值。
(4)STORE:把SORT排序后的结果保存到sort.result键中。
4、消息通知
四、脚本
五、持久化
1、RDB
【定义】
RDB方式的持久化是通过快照完成的,当符合一定条件是Redis会自动将内存中的所有数据生成一份副本并存储在硬盘上,这个过程即为快照。
【四种数据快照情况】
(1)自动快照
时间窗口M内更改的键数大于改动键数N时,进行自动快照
SAVE time keycount
(2)SAVE或BGSAVE命令
同步快照
SAVE
异步快照
BGSAVE
(3)FLUSHALL命令
清除数据库所有数据,只要自动快照条件不为空,就执行一次快照。
FLUSHALL
(4)执行复制
主从模式下,Redis会在复制初始化时进行自动快照。
【快照原理】
快照过程如下:
(1)Redis使用fork函数复制一份当前进程(父进程)的副本(子进程);
(2)父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘的临时文件;
(3)当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成。
2、AOF
【定义】
Redis在存储非临时数据时,一般需要打开AOF持久化来降低进程中止导致的数据丢失。AOF可以将Redis执行的每一条写命令追加到硬盘文件中,但是会降低Redis部分性能。
【使用】
(1)开启AOF
appendonly yes
(2)AOF重写条件
# 当目前的AOF文件大小超过上一次重写时(或启动时)的AOF文件大小的百分比时进行重写
auto-aof-rewrite-percentage 100
# 限制了允许重写的最小AOF文件大小
auto-aof-rewrite-min-size 64mb
(3)同步硬盘数据
# appendfsync always
appendfsync everysec
# appendfsync no
六、集群
1、复制
(1)目的
当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。
(2)原理过程
- 当一个从数据库启动后,会向主数据库发送SYNC命令;
- 同时主数据库接收到SYNC命令会开始在后台保存快照(即RDB持久化),并将保存快照期间接收到的命令缓存起来;
- 快照完成后,Redis会将快照文件和所有缓存的命令发送给从数据库;
- 从数据库收到后,会载入快照文件并执行收到的缓存的命令;
- 复制初始化后,主数据库每当收到写命令时就会将命令同步给从数据库,从而保证主从数据库数据一致;
- 断线重连时,由于Redis2.8能够支持有条件的增量数据传输,主数据库只需要将短线期间执行的命令传送给从数据库。
2、哨兵
(1)定义
监控Redis系统的运行状况,主要功能包括:
- 监控主数据库和从数据库是否正常运行
- 主数据库出现故障时自动将从数据库转换为主数据库
(2)原理
(3)故障恢复
首先领头哨兵将从停止服务的主数据库的从数据库中挑选一个充当新的主数据库:
- 在所有在线的从数据库中,选择优先级最高的从数据库;
- 如果有多个最高优先级的从数据库,则复制的命令偏移量越大越优先;
- 如果以上条件都一样,则选择运行ID较小的从数据库。
选出一个从数据库后,领头哨兵将向从数据库发送SLAVEOF NO ONE 命令使其升格为主数据库;
而后领头哨兵向其他从数据库发送SLAVEOF命令来使其成为新主数据库的从数据库;
最后异步则是更新内部的记录,将已经停止服务的旧的主数据库更新为新的主数据库的从数据库,使其当期恢复服务时自动以从数据库的身份继续服务。
3、集群
(1)集群方式
- 主从模式
- Sentinel模式(哨兵)
- Cluster模式(动态扩容)
(2)节点增加
(3)插槽分配