Redis:Remote Dictionary Server(远程字典服务器)
第1章 简介
1.Redis是一个开源的、高性能的、基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同场景下的缓存与存储需求。
2.键值类型:字符串、散列、列表、集合、有序集合
3.特性:存储结构、内存存储与持久化、功能丰富、简单稳定
第2章 准备
1.可执行文件说明
redis-server Redis服务器
redis-cli Redis命令行客户端
2.启动和停止
启动:redis-server --port 6379
停止:redis-cli SHUTDOWN / kill
3.客户端命令
redis-cli -h 127.0.0.1 -p 6379
4.命令返回值
状态回复:如PING
错误回复:如不存在的命令
整数回复:如INCR
字符串回复:如GET
多行字符串回复:如KEYS *
5.配置
redis-server /etc/redis.conf
或动态修改配置:
CONFIG SET loglevel warning / CONFIG GET loglevel
第3章 入门
1.命令
KEYS pattern:获得符合规则的键名列表。但是需要遍历所有键,性能较差,不建议生产中使用。
pattern支持glob风格通配符格式。
? 匹配一个字符
* 匹配任意个字符
[] 匹配括号间的任一字符,可以使用“-”符号表示一个范围
\x 转义符号
EXISTS key:判断一个键是否存在。存在返回整型1,否则返回0
DEL key [key ...]:删除键,可以删除一个或多个键,返回值是删除的键的个数
DEL命令不支持通配符,但是可以:redis-cli DEL `redis-cli KEYS "user:*"`
TYPE key:获得键值的数据类型
2.字符串类型
赋值与取值:
SET key hello
GET key //不存在时返回空结果
INCR key //递增数字。如果key不是整型,将会报错
INCRBY key increment //增加指定的increment
DECR key //递减
DECRBY key decrement //减少指定的整数
INCRBYFLOAT key increment //增加指定浮点数
APPEND key value //向键值的末尾增加value。返回值是追加后字符串的总长度
STRLEN key //返回键值长度
MGET key [key ...] //同时获得多个键值
MSET key value [key value ...] //同时设置多个键值
位操作:
GETBIT key offset
SETBIT key offset value
BITCOUNT key [start] [end] //获得key中值是1的二进制位个数
BITPOS key bit [start] [end] //获得指定键的第一个位值是0或1的位置
BITOP operation destkey key [key ...]
3.散列类型
赋值与取值:
HSET key field value
HGET key field
HMSET key field value [field value ...]
HMGET key field [field ...]
HGETALL key
HEXISTS key field //判断字段是否存在
HSETNX key field value //当字段不存在时赋值。如果存在,则不赋值
HINCRBY key field increment //增加数字
HDEL key field [field ...] //删除字段
HKEYS key //获取字段名
HVALS key //获取字段值
HLEN key //获取字段数量
4.列表类型
向列表两端增加元素:
LPUSH key value [value ...]
RPUSH key value [value ...]
从列表两端弹出元素:
LPOP key
RPOP key
LLEN key //获取列表中元素的个数,复杂度O(1)
LRANGE key start stop //获取列表片段,包含两端元素
LREM key count value //删除列表中指定的值
当count > 0时,从列表左边开始删除前count个值为value的元素
当count < 0时,从列表右边开始删除前|count|个值为value的元素
当count = 0时,删除所有值为value的元素
获得/设置指定索引的元素值:
LINDEX key index
LSET key index value
LTRIM key start end //只保留列表指定片段
LINSERT key BEFORE|AFTER pivot value //向列表中插入元素。在列表中从左到右查找值为pivot的元素,根据第二个参数BEFORE还是AFTER决定将value插入到该元素的前面还是后面。
RPOPLPUSH source destination //将元素从一个列表转到另一个列表
5.集合类型
增加/删除元素:
SADD key member [member ...] //返回值为成功加入的元素数量
SREM key member [member ...] //返回值为成功删除的元素数量
SMEMBERS key //获得集合中的所有元素
SISMEMBER key member //判断元素是否在集合中
集合间运算:
SDIFF key [key ...] //对多个集合执行差集运算
SINTER key [key ...] //对多个集合执行交集运算
SUNION key [key ...' //对多个集合执行并集运算
SCARD key //获得集合中元素个数
集合运算并将结果存储:
SDIFFSTORE destination key [key ...] //将结果存储在destination中
SINTERSTORE destination key [key ...]
SUNIONSTORE destination key [key ...]
SRANDMEMBER key [count] //随机获得集合中的元素
当count为正数时,会随机从集合获得count个不重复的元素
当count为负数时,会随机从集合获得|count|个元素,这些元素可能相同
SPOP key //从集合中弹出一个元素
6.有序集合类型:使用散列表和跳跃表实现,时间复杂度是O(log(N))
ZADD key score member [score member ...] //增加元素
ZSCORE key member //获得元素的分数
获得排名在某个范围内的元素列表
ZRANGE key start stop [WITHSCORES] //按照元素分数从小到大返回索引,包含两段元素。加上WITHSCORES时返回元素,分数
ZREVRANGE key start stop [WITHSCORES] //按照元素分数从大到小返回索引
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] //获得指定分数范围的元素。包含两端元素。可以在分数前加上"("来不包含端点值
ZINCRBY key increment member //增加某个元素的分数
ZCARD key //获得集合中元素的数量
ZCOUNT key min max //获得指定分数范围内的元素个数
ZREM key member [member ...] //删除一个或多个元素
ZREMRANGEBYRANK key start stop //按照排名范围删除元素
ZREMRANGEBYSCORE key min max //按照分数范围删除元素
获得元素排名:
ZRANK key member //从小到大
ZREVRANK key member //从大到小
计算有序集合的交集:
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] //计算多个有序集合的交集并将结果存储在destination键中,返回值为destination键中的元素个数
第4章 进阶
1.事务:同命令一样是Redis的最小执行单位。一个事务中的命令要么都执行,要么都不执行。
> MULTI
> SADD "user:1:following" 2
> SADD "user:2:following" 1
> EXEC
WATCH key [key ...] //监控一个或多个键,一旦其中有一个键被修改,之后的事务就不会执行。监控一直持续到EXEC命令
UNWATCH //取消监控
2.过期时间
EXPIRE key seconds //seconds标识过期时间,单位秒
TTL key //查看键剩余时间。-1:永久 -2:键不存在
PERSIST key //清除过期时间
EXPIREAT key time //使用Unix时间表示过期时刻,秒
PEXPIREAT key time //毫秒
3.排序
sort key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination] //重点参数:BY/GET/STORE
尽可能减少待排序键中元素的数量;
使用LIMIT参数只获取需要的数据;
如果要排序的数据了较大,尽可能使用STORE参数将结果缓存。
4.消息通知
BRPOP key timeout //timeout为超时时间,单位是秒。当超过时间仍没有新元素时会返回nil
BLPOP key timeout
BRPOP key1 key2 [key3 ...] timeout //可以实现优先级队列
发布/订阅:
SUBSCRIBE channel [channel ...]
UNSUBSCRIBE [channel [channel ...]]
PUBLISH channel message
按照规则订阅:
PSUBSCRIBE pattern [pattern ...]
PUNSUBSCRIBE [pattern [pattern ...]]
5.管道
6.节省空间
精简键名和键值
内部编码优化
可以使用 OBJECT ENCODING key 来查看内部编码方式
第5章 实践
1.PHP与Redis
2.Ruby与Redis
3.Python与Redis
4.Node.js与Redis
第6章 脚本
1.概览
2.Lua语言
3.Redis与Lua
4.深入脚本
第7章 持久化
1.RDB方式:根据指定规则“定时”将内存中的数据存储到硬盘上
根据配置规则进行自动拍照:由用户在配置文件自定义,由时间窗口M和改动的键的个数N两个参数构成。
save 300 10 //300秒内至少有10个键被修改则进行快照
用户执行SAVE或BASAVE命令:
SAVE:在快照执行过程中会阻塞所有来自客户端的请求,尽量避免生产环境使用
BGSAVE:异步进行快照操作。可以使用LASTSAVE获取最近一次成功执行快照的时间
执行FLUSHALL命令:该命令会清楚数据库中所有数据。只要自动快照条件不为空,就会执行一次快照操作。
执行复制时:当设置了主从模式时,会在复制初始化时进行自动快照。
2.AOF方式:每次执行命令后将命令本身记录下来
开启AOF:appendonly yes
auto-aof-rewrite-percentage 100 //当前AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写
auto-aof-rewrite-min-size 64mb //限制允许重写的最小AOF文件大小
同步硬盘数据:
appendsync always/everysec/no //默认采用everysec规则,即每秒执行一次同步操作。always表示每次执行写入都回执行同步。no表示不主动进行同步操作,完全交由操作系统来做(即每30秒一次)
第8章 集群
1.复制
读写分离与一致性:
从数据库持久化:
无硬盘复制:
增量复制:
2.哨兵
哨兵:监控Redis系统的运行情况。
监控主数据库和从数据库是否正常运行
主数据库出现故障时自动将从数据库转换为主数据库
3.集群
第9章 管理
1.安全
2.通信协议
3.管理工具
redis-cli:
SLOWLOG GET //获得当前的耗时命令日志
MONITOR //命令监控
phpRedisAdmin:网页端管理工具,支持以树形结构查看键列表,编辑键值,导入/导出数据库数据,查看数据库信息和查看键信息等功能。
Rdbtools:快照文件解析器