生命不息,奋斗不止!(送给也曾迷茫的你)
目録
1. Redis 配置
Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf(Windows 名为
redis.windows.conf
),可以通过 CONFIG 命令查看或设置配置项。
*****************************************************************
・【GRAMMAR】查看配置信息
CONFIG GET CONFIG_SETTING_NAME -- 获取指定配置信息
CONFIG GET * -- 获取所有
................................................................
・【GRAMMAR】编辑配置信息
CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
*****************************************************************
・【DEMO】示例
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
*****************************************************************
- 参数说明
配置项 | 说明 |
---|---|
daemonize no | Redis 默认不是以守护进程的方式运行,可以通过该配置项修改,使用 yes 启用守护进程(Windows 不支持守护线程的配置为 no ) |
pidfile /var/run/redis.pid | 当 Redis 以守护进程方式运行时,Redis 默认会把 pid 写入 /var/run/redis.pid 文件,可以通过 pidfile 指定 |
port 6379 | 指定 Redis 监听端口,默认端口为 6379 |
bind 127.0.0.1 | 绑定的主机地址 |
timeout 300 | 当客户端闲置多长秒后关闭连接,如果指定为 0 ,表示关闭该功能 |
loglevel notice | 指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning,默认为 notice |
logfile stdout | 日志记录方式,默认为标准输出,如果配置 Redis 为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给 /dev/null |
databases 16 | 设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id |
save <seconds> <changes> | 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合 |
rdbcompression yes | 指定存储至本地数据库时是否压缩数据,默认为 yes,Redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大 |
dbfilename dump.rdb | 指定本地数据库文件名,默认值为 dump.rdb |
dir ./ | 指定本地数据库存放目录 |
slaveof <masterip> <masterport> | 设置当本机为 slave 服务时,设置 master 服务的 IP 地址及端口,在 Redis 启动时,它会自动从 master 进行数据同步 |
masterauth <master-password> | 当 master 服务设置了密码保护时,slav 服务连接 master 的密码 |
requirepass foobared | 设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH 命令提供密码,默认关闭 |
maxclients 128 | 设置同一时间最大客户端连接数,默认无限制,Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息 |
maxmemory <bytes> | 指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis 新的 vm 机制,会把 Key 存放内存,Value 会存放在 swap 区 |
appendonly no | 指定是否在每次更新操作后进行日志记录,Redis 在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis 本身同步数据文件是按上面 save 条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为 no |
appendfilename appendonly.aof | 指定更新日志文件名,默认为 appendonly.aof |
appendfsync everysec | 指定更新日志条件,共有 3 个可选值:no:表示等操作系统进行数据缓存同步到磁盘(快);always:表示每次更新操作后手动调用 fsync() 将数据写到磁盘(慢,安全);everysec:表示每秒同步一次(折中,默认值) |
vm-enabled no | 指定是否启用虚拟内存机制,默认值为 no,简单的介绍一下,VM 机制将数据分页存放,由 Redis 将访问量较少的页即冷数据 swap 到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析 Redis 的 VM 机制) |
vm-swap-file /tmp/redis.swap | 虚拟内存文件路径,默认值为 /tmp/redis.swap,不可多个 Redis 实例共享 |
vm-max-memory 0 | 将所有大于 vm-max-memory 的数据存入虚拟内存,无论 vm-max-memory 设置多小,所有索引数据都是内存存储的(Redis 的索引数据 就是 keys),也就是说,当 vm-max-memory 设置为 0 的时候,其实是所有 value 都存在于磁盘。默认值为 0 |
vm-page-size 32 | Redis swap 文件分成了很多的 page,一个对象可以保存在多个 page 上面,但一个 page 上不能被多个对象共享,vm-page-size 是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page 大小最好设置为 32 或者 64bytes;如果存储很大大对象,则可以使用更大的 page,如果不确定,就使用默认值 |
vm-pages 134217728 | 设置 swap 文件中的 page 数量,由于页表(一种表示页面空闲或使用的 bitmap)是在放在内存中的,,在磁盘上每 8 个 pages 将消耗 1byte 的内存。 |
vm-max-threads 4 | 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4 |
glueoutputbuf yes | 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启 |
hash-max-zipmap-entries 64 hash-max-zipmap-value 512 | 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法 |
activerehashing yes | 指定是否激活重置哈希,默认为开启(后面在介绍 Redis 的哈希算法时具体介绍) |
include /path/to/local.conf | 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件 |
2. Redis 数据结构
Redis 支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
- String(字符串)
string 类型是二进制安全的,最大能存储 512MB。意思是 redis 的 string 可以包含任何数据,比如 jpg 图片或者序列化的对象。
*****************************************************************
・【DEMO】示例
127.0.0.1:6379> set ItGodRoad "IT.God.Road"
OK
127.0.0.1:6379> get ItGodRoad
"IT.God.Road"
*****************************************************************
- Hash(哈希)
hash 是一个键值(key=>value)对集合,即编程语言中的Map类型, 适合存储、读取、修改用户对象属性。
*****************************************************************
・【DEMO】示例 -- HMGET 和 HGET 返回的结果有区别
127.0.0.1:6379> del ItGodRoad
(integer) 1
127.0.0.1:6379> hmset ItGodRoad field1 "IT.God.Road" field2 "Happy.New.Year"
OK
127.0.0.1:6379> hmget ItGodRoad field1
1) "IT.God.Road"
127.0.0.1:6379> hget ItGodRoad field2
"Happy.New.Year"
*****************************************************************
- List(列表)
list 是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边),增删快,提供了操作某一段元素的API。最多可存储 232 - 1 元素 (4294967295,每个列表可存储40多亿)。
*****************************************************************
・【DEMO】示例
127.0.0.1:6379> del ItGodRoad
(integer) 1
127.0.0.1:6379> lpush ItGodRoad IT
(integer) 1
127.0.0.1:6379> lpush ItGodRoad God
(integer) 2
127.0.0.1:6379> lpush ItGodRoad Road
(integer) 3
127.0.0.1:6379> lrange ItGodRoad 0 10
1) "Road"
2) "God"
3) "IT"
*****************************************************************
- Set(集合)
set 是 string 类型的无序集合,是通过哈希表实现的,所以元素不会重复,添加,删除,查找的复杂度都是 O(1)。
*****************************************************************
・【DEMO】示例
127.0.0.1:6379> del ItGodRoad
(integer) 1
127.0.0.1:6379> sadd ItGodRoad IT
(integer) 1
127.0.0.1:6379> sadd ItGodRoad God
(integer) 1
127.0.0.1:6379> sadd ItGodRoad Road
(integer) 1
// 实例中 Road添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
127.0.0.1:6379> sadd ItGodRoad Road
(integer) 0
127.0.0.1:6379> smembers ItGodRoad
1) "Road"
2) "God"
3) "IT"
*****************************************************************
- zset(sorted set:有序集合)
和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数,redis 正是通过分数来为集合中的成员进行从小到大的排序。zset 的成员是唯一的,但分数可以重复。
*****************************************************************
・【DEMO】示例
127.0.0.1:6379> del ItGodRoad
(integer) 1
127.0.0.1:6379> zadd ItGodRoad 0 IT
(integer) 1
127.0.0.1:6379> zadd ItGodRoad 1 God
(integer) 1
127.0.0.1:6379> zadd ItGodRoad 2 Road
(integer) 1
127.0.0.1:6379> zrange ItGodRoad 0 5
1) "IT"
2) "God"
3) "Road"
127.0.0.1:6379> zrangebyscore ItGodRoad 0 5
1) "IT"
2) "God"
3) "Road"
*****************************************************************
3. Redis 基本命令
Redis 命令用于在 redis 服务上执行操作,语法格式:
COMMAND KEY_NAME
。如果需要恢复数据,只需将备份文件 (dump.rdb
) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用 CONFIG 命令,CONFIG GET dir
。
- 系统命令
命令 | 说明 |
---|---|
ping | 检测 redis 服务是否启动 |
select index | 切换到指定的数据库 |
redis-cli | 启动 redis 客户端 |
redis-cli -h host -p port -a password | 远程启动 redis 客户端 |
auth password | 验证密码是否正确 |
echo message | 打印字符串 |
save | 在 redis 安装目录中创建dump.rdb文件 |
bgsave | 在后台异步保存当前数据库的数据到磁盘 |
quit | 关闭当前连接 |
- Key 命令
命令 | 说明 |
---|---|
DEL key | key 存在时删除 key |
DUMP key | 序列化给定 key ,并返回被序列化的值 |
EXISTS key | 检查给定 key 是否存在 |
EXPIRE key seconds | 为给定 key 设置过期时间,以秒计 |
EXPIREAT key timestamp | 为给定 key 设置过期时间,以UNIX 时间戳(unix timestamp)秒计 |
PEXPIRE key milliseconds | 为给定 key 设置过期时间,以毫秒计 |
PEXPIREAT key milliseconds-timestamp | 为给定 key 设置过期时间,以UNIX 时间戳(unix timestamp)毫秒计 |
KEYS pattern | 查找所有符合给定模式(pattern)的 key |
MOVE key db | 将当前数据库的 key 移动到给定的数据库 db 当中 |
PERSIST key | 移除 key 的过期时间,key 将持久保持 |
PTTL key | 以毫秒为单位返回 key 的剩余的过期时间 |
TTL1 key | 以秒为单位,返回给定 key 的剩余生存时间 |
RANDOMKEY | 从当前数据库中随机返回一个 key |
RENAME key newkey | 修改 key 的名称 |
RENAMENX key newkey | 仅当 newkey 不存在时,将 key 改名为 newkey |
SCAN cursor [MATCH pattern] [COUNT count] | 迭代数据库中的数据库键 |
TYPE key | 返回 key 所储存的值的类型 |
- String 命令(20)
命令 | 说明 |
---|---|
SET key value | 设置指定 key 的值 |
GET key | 获取指定 key 的值 |
GETRANGE key start end | 返回 key 中字符串值的子字符 |
GETSET key value | 将给定 key 的值设为 value ,并返回 key 的旧值 |
GETBIT key offset | 对 key 所储存的字符串值,获取指定偏移量上的位 |
MGET key1 [key2…] | 获取所有(一个或多个)给定 key 的值 |
SETBIT key offset value | 对 key 所储存的字符串值,设置或清除指定偏移量上的位 |
SETEX key seconds value | 将值 value 关联到 key ,并将 key 的过期时间设为 seconds |
SETNX key value | 只有在 key 不存在时设置 key 的值 |
SETRANGE key offset value | 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始 |
STRLEN key | 返回 key 所储存的字符串值的长度 |
MSET key value [key value …] | 同时设置一个或多个 key-value 对 |
MSETNX key value [key value …] | 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在 |
PSETEX key milliseconds value | 将值 value 关联到 key ,并将 key 的过期时间设为 milliseconds |
INCR key | 将 key 中储存的数字值增一 |
INCRBY key increment | 将 key 所储存的值加上给定的增量值 |
INCRBYFLOAT key increment | 将 key 所储存的值加上给定的浮点增量值 |
DECR key | 将 key 中储存的数字值减一 |
DECRBY key decrement | key 所储存的值减去给定的减量值 |
APPEND key value | 如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值的末尾 |
- Hash 命令(14)
命令 | 说明 |
---|---|
HDEL key field1 [field2] | 删除一个或多个哈希表字段 |
HEXISTS key field | 查看哈希表 key 中,指定的字段是否存在 |
HGET key field | 获取存储在哈希表中指定字段的值 |
HGETALL key | 获取在哈希表中指定 key 的所有字段和值 |
HINCRBY key field increment | 为哈希表 key 中的指定字段的整数值加上增量 increment |
HINCRBYFLOAT key field increment | 为哈希表 key 中的指定字段的浮点数值加上增量 increment |
HKEYS key | 获取所有哈希表中的字段 |
HLEN key | 获取哈希表中字段的数量 |
HMGET key field1 [field2] | 获取所有给定字段的值 |
HMSET key field1 value1 [field2 value2 ] | 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
HSET key field value | 将哈希表 key 中的字段 field 的值设为 value |
HSETNX key field value | 只有在字段 field 不存在时,设置哈希表字段的值 |
HVALS key | 获取哈希表中所有值 |
HSCAN key cursor [MATCH pattern] [COUNT count] | 迭代哈希表中的键值对 |
- List 命令(17)
命令 | 说明 |
---|---|
BLPOP key1 [key2 ] timeout | 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
BRPOP key1 [key2 ] timeout | 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
BRPOPLPUSH source destination timeout | 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
LINDEX key index | 通过索引获取列表中的元素 |
LINSERT key BEFORE | AFTER pivot value |
LLEN key | 获取列表长度 |
LPOP key | 移出并获取列表的第一个元素 |
LPUSH key value1 [value2] | 将一个或多个值插入到列表头部 |
LPUSHX key value | 将一个值插入到已存在的列表头部 |
LRANGE key start stop | 获取列表指定范围内的元素 |
LREM key count value | 移除列表元素 |
LSET key index value | 通过索引设置列表元素的值 |
LTRIM key start stop | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除 |
RPOP key | 移除列表的最后一个元素,返回值为移除的元素 |
RPOPLPUSH source destination | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
RPUSH key value1 [value2] | 在列表中添加一个或多个值 |
RPUSHX key value | 为已存在的列表添加值 |
- Set 命令(15)
命令 | 说明 |
---|---|
SADD key member1 [member2] | 向集合添加一个或多个成员 |
SCARD key | 获取集合的成员数 |
SDIFF key1 [key2] | 返回第一个集合与其他集合之间的差异 |
SDIFFSTORE destination key1 [key2] | 返回给定所有集合的差集并存储在 destination 中 |
SINTER key1 [key2] | 返回给定所有集合的交集 |
SINTERSTORE destination key1 [key2] | 返回给定所有集合的交集并存储在 destination 中 |
SISMEMBER key member | 判断 member 元素是否是集合 key 的成员 |
SMEMBERS key | 返回集合中的所有成员 |
SMOVE source destination member | 将 member 元素从 source 集合移动到 destination 集合 |
SPOP key | 移除并返回集合中的一个随机元素 |
SRANDMEMBER key [count] | 返回集合中一个或多个随机数 |
SREM key member1 [member2] | 移除集合中一个或多个成员 |
SUNION key1 [key2] | 返回所有给定集合的并集 |
SUNIONSTORE destination key1 [key2] | 所有给定集合的并集存储在 destination 集合中 |
SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代集合中的元素 |
- zset 命令(20)
命令 | 说明 |
---|---|
ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
ZCARD key | 获取有序集合的成员数 |
ZCOUNT key min max | 计算在有序集合中指定区间分数的成员数 |
ZINCRBY key increment member | 有序集合中对指定成员的分数加上增量 increment |
ZINTERSTORE destination numkeys key [key …] | 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中 |
ZLEXCOUNT key min max | 在有序集合中计算指定字典区间内成员数量 |
ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合指定区间内的成员 |
ZRANGEBYLEX key min max [LIMIT offset count] | 通过字典区间返回有序集合的成员 |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] | 通过分数返回有序集合指定区间内的成员 |
ZRANK key member | 返回有序集合中指定成员的索引 |
ZREM key member [member …] | 移除有序集合中的一个或多个成员 |
ZREMRANGEBYLEX key min max | 移除有序集合中给定的字典区间的所有成员 |
ZREMRANGEBYRANK key start stop | 移除有序集合中给定的排名区间的所有成员 |
ZREMRANGEBYSCORE key min max | 移除有序集合中给定的分数区间的所有成员 |
ZREVRANGE key start stop [WITHSCORES] | 返回有序集中指定区间内的成员,通过索引,分数从高到低 |
ZREVRANGEBYSCORE key max min [WITHSCORES] | 返回有序集中指定分数区间内的成员,分数从高到低排序 |
ZREVRANK key member | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
ZSCORE key member | 返回有序集中,成员的分数值 |
ZUNIONSTORE destination numkeys key [key …] | 计算给定的一个或多个有序集的并集,并存储在新的 key 中 |
ZSCAN key cursor [MATCH pattern] [COUNT count] | 迭代有序集合中的元素(包括元素成员和元素分值) |
4. Redis 客户端命令
Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接,当一个连接建立后,Redis 内部会进行以下一些操作:
首先,客户端 socket 会被设置为非阻塞模式,因为 Redis 在网络事件处理上采用的是非阻塞多路复用模型;
然后为这个 socket 设置 TCP_NODELAY 属性,禁用 Nagle 算法;
然后创建一个可读的文件事件用于监听这个客户端 socket 的数据发送。
命令 | 说明 |
---|---|
CLIENT LIST | 返回连接到 redis 服务的客户端列表 |
CLIENT SETNAME | 设置当前连接的名称 |
CLIENT GETNAME | 获取通过 CLIENT SETNAME 命令设置的服务名称 |
CLIENT PAUSE | 挂起客户端连接,指定挂起的时间以毫秒计 |
CLIENT KILL | 关闭客户端连接 |
5. Redis 发布订阅命令
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
Redis 客户端可以订阅任意数量的频道。
- 订阅模型
- 发布模型
- 发布订阅命令
命令 | 说明 |
---|---|
PSUBSCRIBE pattern [pattern …] | 订阅一个或多个符合给定模式的频道 |
PUBSUB subcommand [argument [argument …]] | 查看订阅与发布系统状态 |
PUBLISH channel message | 将信息发送到指定的频道 |
PUNSUBSCRIBE [pattern [pattern …]] | 退订所有给定模式的频道 |
SUBSCRIBE channel [channel …] | 订阅给定的一个或多个频道的信息 |
UNSUBSCRIBE [channel [channel …]] | 指退订给定的频道 |
- 发布订阅测试
1.开启本地 Redis 服务,开启两个 redis-cli 客户端。
2.在第一个 redis-cli 客户端输入subscribe ItGodRoad
,意思是订阅 ItGodRoad 频道。
3.在第二个 redis-cli 客户端输入publish ItGodRoad "Hello ITGod"
往 ItGodRoad 频道发送消息,这个时候在第一个 redis-cli 客户端就会看到由第二个 redis-cli 客户端发送的测试消息。
6. Redis 事务命令
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
命令 | 说明 |
---|---|
multi | 标记一个事务块的开始 |
discard | 取消事务,放弃执行事务块内的所有命令 |
exec | 执行所有事务块内的命令 |
watch key [key …] | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断 |
unwatch | 取消 WATCH 命令对所有 key 的监视 |
【每日一面】
如何设置 Redis 密码
命令行设置:
查看密码命令:config get requirepass
设置密码命令:config set requirepass yourpassword
验证密码命令:auth password
配置文件设置:
本地配置文件:redis.windows.conf
服务器配置文件:redis.windows-service.conf
找到# requirepass foobared
行在下面加上一行配置信息,注意前面不要有空格
requirepass yourpassword
TTL:time to live ↩︎