redis学习笔记
【其它】
1)redis为键值对形式的数据库,全称 REmote DIctionary Server (远程字典服务器);
2)redis支持的数据类型有:字符串、散列、列表、集合、有序集合;
3)redis中的数据类型可以进行一些高级操作,例如求并集、合集、排序等功能;
4)redis是存储在内存中的,因此比存储到硬盘中的数据库要快很多。但它同时也支持数据持久长,异步将数据写入硬盘;
5)redis可以为每个键设置生存时间,生存时间到期后键会自动被删除。这个特性很适合用来做session,不用手动定期清除相关文件;
6)redis可以限定数据占用的最大内存空间,在数据达到空间限制后可以按照一定的规则自动淘汰不需要的键;
7)redis可以实现队列,并且支持阻塞式读取;
8)redis支持“发布/订阅”的消息模式;
9)启动redis服务器。redis默认使用6379端口,可以通过--port参数自定义端口号:
redis-server
redis-server --port 6380
10)停止redis服务器。redis有可能正在将内存中的数据同步到硬盘,所以正确的关闭方式应该是:
redis-cli SHUTDOWN
11)连接redis服务器。redis-cli执行时会自动按照默认配置(服务器地址为127.0.0.1,端口号为6379)连接redis,通过-h和-p参数可以自定义地址和端口号:
redis-cli -h 127.0.0.1 -p 6379
12)redis提供了PING命令来测试客户端和redlis的连接是否正常:
redis-cli PING
13)redis-cli向服务端发送命令有两种方式:第一种是将命令作为参数执行,例如 redis-cli SHUTDOWN,另一种是不带参数直接输入redis-cli,进入交互模式。
14)启动的时候,每次都通过传参会比较麻烦,还可以通过传配置文件的方式启动。redis提供了一个配置文件的模板redis.conf,在源代码目录的根目录中:
redis-server /path/to/redis.conf
15)redis可以有类似关系数据库的database,虽然它是存储大字典,但其实一个redis实例可以存储多个字典,在字典间切换是使用SELECT命令,类似sql语句的use。
redis默认支持16个数据库,可以通过配置参数databases来修改这一数字。
但redis的字典和数据库中的database有区别,首先它只能是数字编号,不能自己命名,其次,数据库与数据库之间并不是完全隔离的,比如FLUSHALL命令可以清空一个redis实例中的所有数据库,另外也不能为每个database单独设置密码。
16)redis对于键的命名没有强制的要求,但比较好的实践是 对象类型 : 对象ID : 对象属性,如 user : 1 : friends来存储ID为1的用户的好友列表。对于多个单词则推荐使用“.”分隔。 redis的数据结构不能互相嵌套,所以它和mongodb那种数据套数据的方式不同,要想实现命名空间,只能在键上做文章,靠命名约定来弥补功能上的不足。所以redis对键的命名没有要求,方便它将命名用到极致。
17)redis不像关系型数据库那样有个自增的id作为主键,如果想实现类似的功能,只能通过命名约定结合INCR命令实现。比如 users:count 这个键可以用来做 user : userID : friends这一组数据的主键,每增加一个user时,users:count INCR一下,返回值作为新user的userID。
18)集合类型和列表类型的区别是,列表类型有有序性,无唯一性,而集合类型有唯一性,无有序性。
【KEY 相关】
1)KEYS pattern 返回所有符合规则的键。
============================
KEYS *
KEYS bar
============================
pattern接受glob风格的通配符(?* [] \x)。
因为KEYS命令需要遍历redis中所有键,不建议在生产环境中使用。
2)EXISTS key 判断一个键是否存在
============================
EXISTS bar
============================
3)DEL key 删除键 (可批量操作)
============================
DEL bar
DEL bar bar2 bar3
============================
可以删除一个或多个键
4)TYPE key 获得键值的数据类型
============================
TYPE foo
============================
返回值有 sting、hash、list、set、zset这5种类型。
【字符串类型】
1)SET key value 赋值
============================
SET name adang
============================
2)GET key 取值
============================
GET name
============================
3)MSET key value key2 value2 key3 value3 同时设置多个键值
============================
MSET key1 v1 key2 v2 key3 v3 key4 v4
============================
4)MGET key key2 key3 同时获得多个键值
============================
MGET key1 key2 key3 key4
============================
5)INCR key 递增
============================
INCR age #1
============================
<3-1> 虽然redis并不支持数字类型,但如果存储的字符串是整数形式时,还是有INCR这种递增方法的。
<3-2> 当操作的键不存在时,默认健值为0,INCR后返回1。
<3-3> 当操作的键不是整数时,会提示错误。
6)INCRBY key increment 增加指定的整数
============================
INCRBY age 3 #4
============================
和INCR相比,更灵活。
7)DECR 递减
============================
DECR age #3
============================
和INCR相反。
8)DECRBY 减少指定的整数
============================
DECRBY age 3 #0
============================
和INCRBY相反。
9)INCRBYFLOAT key increment 增加指定浮点数
============================
INCRBYFLOAT age 2.7 #2.7
============================
和INCRBY的差别是,它可以增加一个双精度浮点数。
10)APPEND key value 向键值key的末尾追加value
============================
SET key hello
APPEND key " world" #hello world
============================
<8-1> 如果键不存在,则将该键的值设置为value,相当于SET key value。
<8-2> 如果value中包括空格,则可以将value包在双引号中。
11)STRLEN key 获取字符串长度
============================
SET key hello
STRLEN key #5
============================
12)GETBIT SETBIT BITCOUNT BITOP AND | OR | XOR | NOT 位操作
【散列类型】
1)HSET key field value 赋值
============================
HSET car price 500
============================
2)HGET key file 取值
============================
HGET car price
============================
3)HMSET key filed1 value1 field2 value2 同时设置多个字段
============================
HMSET car name BMW color red
============================
4)HMGET key field1 field2 同时获取多个字段
============================
HMGET car name color
============================
5)HGETALL 返回所有字段
============================
HGETALL car
============================
6)HEXISTS key field 判断字段是否存在
============================
HEXISTS car price
============================
7)HSETNX key field value 当字段不存在时赋值
============================
HSETNX car model c200
============================
和HSET命令类似,区别在于如果字段已经存在,HSETNX命令将不执行任何操作。
8)HINCRBY key field increment 增加数字
============================
HINCRBY person score 60
============================
散列表类型没有HINCR命令。需要的话,可以使用HINCRBY key field 1实现。
9)HDEL key field 删除字段(可批量操作)
============================
HDEL car price
HDEL car color model
============================
10)HKEYS key 获取字段名
============================
HKEYS car
============================
11)HVALS key 获取字段值
============================
HVALS car
============================
12)HLEN key 获取字段数量
============================
HLEN car
============================
【列表类型】
1)LPUSH key value 向左端增加元素(可批量操作)
============================
LPUSH numbers 1
LPUSH numbers 2 3 4
============================
2)RPUSH key value 向右端增加元素(可批量操作)
============================
RPUSH numbers 5 6 7 8
============================
3)LPOP key 从左端弹出元素
============================
LPOP numbers
============================
4)RPOP key 从右端弹出元素
============================
RPOP numbers
============================
5)LLEN key 获取列表中元素的个数
============================
LLEN numbers
============================
当键不存在时返回0
6)LRANGE key start stop 获得列表片段
============================
LRANGE numbers 0 2
============================
<6-1> 和编程语言中slice不同,LRANGE包含stop这个索引下的值
<6-2> 索引支持负值,-1表示最右边的元素
<6-3> 如果start大于stop,则返回空列表
<6-4> 如果stop大于实际索引的最大值,则按最大值返回
7)LTRIM key start end 只保留列表指定片段
============================
LTRIM numbers 0 2
============================
<7-1> 和LRANGE命令参数相同,但LRANGE只返回指定数据,并不改变列表本身,而LTRIM会修改列表
<7-2> LTRIM命令通常和LPUSH命令一起使用来限制列表中元素的数量
8)LREM key count value 删除列表中指定的值
============================
LREM numbers -1 2
LREM numbers 0 3
============================
<8-1> 当count > 0 时,会从列表左边开始删除前count个值为value的元素
<8-2> 当count < 0 时,会从列表右边开始删除前| count |个值为value的元素
<8-3> 当count = 0 时,会从列表中删除所有值为value的元素
<8-4> LREM的思路和编程中的数组有所区别,数组一般是通过索引进行删除操作的,而redis是通过值进行操作的
9)LINDEX key index 获得指定索引的元素值
============================
LINDEX numbers 1
LINDEX numbers -1
============================
index支持负值
10)LSET key index value 设置指定索引的元素值
============================
LSET numbers 1 7
============================
11)LINSERT key BEFORE | AFTER pivot value 向列表中插入元素
============================
LINSERT numbers AFTER 7 3
LINSERT numbers BEFORE 2 1
============================
<11-1> LINSERT命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前端还是后面
<11-2> LINSERT命令和通常数组中的插入不同,pivot是值,而不是索引。这个思路和LREM是一样的
12)RPOPLPUSH source destination 将元素从一个列表转到另一个列表
============================
RPOPLPUSH numbers numbers2
============================
从source的右边弹出一个元素,从destination左边插入,整个操作是原子的
【集合类型】
1)SADD key member 增加元素(可批量操作)
============================
SADD letters a
SADD letters a b c d
============================
SADD增加的元素,如果已经在集合中存在了,不会重复添加,集合类型中的值具有唯一性
2)SREM key member 删除元素(可批量操作)
============================
SREM letters a
SREM letters a b c
============================
3)SMEMBERS key 获得集合中的所有元素
============================
SMEMBERS letters
============================
4)SCARD key 获得集合中元素个数
============================
SCARD letters
============================
5)SISMEMBER key member 判断元素是否在集合中
============================
SISMEMBER letters a
============================
6)SRANDMEMBER key [count] 随机获得集中中的元素
============================
SRANDMEMBER letters
SRANDMEMBER letters 3
SRANDMEMBER letters -3
============================
<6-1> count可以为空,为空随机从集合中取一个元素
<6-2> count > 0 时,从集合中随机取count个元素,并且保证这些元素不会重复
<6-3> count < 0 时,从集合中随机取count个元素,这些元素有可能重复
7)SPOP key 从集合中弹出一个元素
============================
SPOP letters
============================
和LPOP类似,但集合是无序的,所以是随机弹出的一个元素。和SRANDMEMBER key的区别是,SPOP会删除掉一个元素,而前者不会
8)SDIFF key key2 key3 差集运算
============================
SDIFF setA setB
SDIFF setA setB setC
============================
返回属于A且不属于B的元素。如果有多个键,计算顺序从左往右
9)SINTER key key2 key3 交集运算
============================
SINTER setA setB
SINTER setA setB setC
============================
返回同时属于A和B的元素
10)SUNION key key2 key3 并集运算
============================
SUNION setA setB
SUNION setA setB setC
============================
返回所有属于A或属于B的元素
11)SDIFFSTORE destination key key2 key3 进行差集运算,并将结果存储
============================
SDIFFSTORE mySet setA setB
============================
和SDIFF的区别在于,SDIFFSTORE会将差集运算的结果保存到destination键中
12)SINTERSTORE destination key key2 key3 进行交集运算,并将结果存储
============================
SINTERSTORE mySet setA setB
============================
和SINTER的区别在于,SINTERSTORE会将差集运算的结果保存到destination键中
13)SUNIONSTORE destination key key2 key3 进行差集运算,并将结果存储
============================
SUNIONSTORE mySet setA setB
============================
和SUNION的区别在于,SUNIONSTORE会将差集运算的结果保存到destination键中
【有序集合类型】
1)ZADD key score member 增加元素(可批量操作)
============================
ZADD scoreboard 89 Tom 67 Peter 100 david
ZADD scoreboard 76.5 Peter
============================
<1-1> ZADD命令向有序集合中加入一个元素和该元素的分数。如果该元素已经存在则会用新的分数替换原有的分数
<1-2> 分数不仅可以是整数,还支持双精度浮点数
2)ZSCORE key member 获得元素的分数
============================
ZSCORE scoreboard Tom
============================
3)ZRANGE key start stop [WITHSCORES] 获得排名在某个范围的元素列表(排序从小到大)
============================
ZRANGE scoreboard 0 2
ZRANGE scoreboard 1 -1
============================
<3-1> ZRANGE命令会按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素,包括两端的元素。支持负索引
<3-2> 如果需要同时获得元素的分数的话可以在命令的尾部加上WITHSCORES参数
<3-3> 如果两个元素的分数相同,会按照字典顺序排列
4)ZREVRANGE key start stop [WITHSCORES] 获得排名在某个范围的元素列表(排序从大到小)
和ZRANGE命令相同,只是元素是按分数从大到小的顺序排列的
5)ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 获得指定分数范围的元素(排序从小到大)
============================
ZRANGEBYSCORE scoreboard 80 100
ZRANGEBYSCORE scoreboard 80 (100
ZRANGEBYSCORE scoreboard (80 +inf
ZRANGEBYSCORE scoreboard -inf 100
ZRANGEBYSCORE scoreboard 80 100 WITHSCORES
ZRANGEBYSCORE scoreboard -inf 100 LIMIT 1 3
============================
<5-1> ZRANGE截取的两端是索引,而ZRANGEBYSCORE截取的两端是分数
<5-2> 如果希望分数范围不包含端点值,可以在分数前加上"("
<5-3> min和max还支持无穷大,-inf和+inf分别表示正负无穷大
<5-4> LIMIT类似sql语句的limit 和offset
6)ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] 获得指定分数范围的元素(排序从大到小)
<6-1> 和ZRANGEBYSCORE命令的功能相似,只是排序按分数从大到小排
<6-2> 注意max和min的顺序也变过来了。
7)ZINCRBY key increment member 增加某个元素的分数
============================
ZINCRBY scoreboard 4 Jerry
ZINCRBY scoreboard -4 Jerry
============================
分数支持负值
8)ZCARD key 获得集合中元素的数量
============================
ZCARD scoreboard
============================
9)ZCOUNT key min max 获得指定分数范围内的元素个数
============================
ZCOUNT scoreboard 90 100
ZCOUNT scoreboard (89 +inf
============================
10)ZREM key member 删除一个或多个元素(可批量操作)
============================
ZREM scoreboard Wendy
============================
11)ZREMRANGEBYRANK key start stop 按照排名范围删除元素
============================
ZREMRANGEBYRANK scoreboard 0 2
============================
start和stop是索引值
12)ZREMRANGEBYSCORE key min max 按照分数范围删除元素
============================
ZREMRANGEBYSCORE scoreboard 90 100
ZREMRANGEBYSCORE scoreboard (89 +inf
============================
min和max是分数值
13)ZRANK key member 获得元素的排名 (从小到大)
============================
ZRANK scoreboard Peter
============================
14)ZREVRANK key member 获得元素的排名 (从大到小)
============================
ZREVRANK scoreboard Peter
============================
15)ZINTERSTORE destination numkeys key key2 key3 [WEIGHTS weight weight2 weight3] [AGGREGATE SUM | MIN | MAX] 计算有序集合的交集
============================
ZINTERSTORE sortedSetsResult 2 sortedSets1 sortedSets2
ZINTERSTORE sortedSetsResult 2 sortedSets1 sortedSets2 AGGREGATE MIN
ZINTERSTORE sortedSetsResult 2 sortedSets1 sortedSets2 AGGREGATE MAX
ZINTERSTORE sortedSetsResult 2 sortedSets1 sortedSets2 WEIGHTS 1 0.1
============================
<15-1> 有序集合和集合一样,有差集、并集等操作,与集合不同的是,有序集合的这些操作还要考虑到分值,所以有了AGGREGATE参数,用于决定如何处理分值
<15-2> AGGREGATE的默认值是SUM
<15-3> AGGREGATE值为SUM时,destination的分数是结果集合中所有元素的分数之和
<15-4> AGGREGATE值为MIN时,destination的分数是结果集合中所有元素的分数最小的那个
<15-5> AGGREGATE值为MAX时,destination的分数是结果集合中所有元素的分数最大的那个
<15-6> 当设置了WEIGHTS参数后,每个集合在参与计算时元素的分数都会乘上该集合的权重
16)ZUNIONSTORE destination numkeys key key2 key3 [WEIGHTS weight weight2 weight3] [AGGREGATE SUM | MIN | MAX] 计算有序集合的并集
【事务】
1)MULTI EXEC
============================
MULTI
SADD user:1:following 2
SADD user:2:followers 1
EXEC
============================
<1-1> 使用MULTI命令后,其后的命令将会暂时执行,直到EXEC命令,会一次性执行所有命令
<1-2> MULTI命令不是那么可靠,如果MULTI命令中有语法错误,那么打包的所有命令都不执行,但如果是运行时出现错误,则会将正确的命令全部执行
<1-3> redis的事务不支持回滚
【生存时间】
1)EXPIRE key seconds 设置过期时间(单位为秒)
============================
SET session:29e3d uid1314
EXPIRE session:29e3d 900
============================
<1-1> 只能是整数
<1-2> 重复执行EXPIRE命令,会覆盖掉原来的倒计时,重新再开始倒计时
2)PEXPIRE key 设置生存时间设置(单位为毫秒)
============================
PEXPIRE session:29e3d 9000000
============================
3)TTL key 还有多久会被删除(单位为秒)
============================
TTL session:29e3d
============================
<3-1> 单位是秒
<3-2> 如果键不存在会返回-1
<3-3> 如果键存在,但没有被设置生存时间,也会返回-1
4)PTTL key 还有多久会被删除(单位为毫秒)
============================
TTL session:29e3d
============================
5)PERSIST key 取消生存时间设置(恢复成永久的)
============================
PERSIST session:29e3d
============================
<5-1> 除了PERSIST命令之外,使用SET或GETSET命令为键赋值也会同时清除键的生存时间
<5-2> 其他只对键值进行操作的命令(如INCR、LPUSH、HSET、ZREM)均不会影响键的生存时间
6)EXPIREAT key timestamp 设置到期的具体时间戳(单位为秒)
============================
EXPIREAT session:29e3d 1351858600
============================
7)PEXPIREAT key timestamp 设置到期的具体时间戳(单位为毫秒)
============================
PEXPIREAT session:29e3d 1351858600000
============================
【排序】
1)SORT key [ALPHA] [DESC] [LIMIT offset count] 排序
============================
SORT tag:ruby:posts
SORT myslistalpha ALPHA
SORT tag:ruby:posts DESC
SORT tag:ruby:posts DESC LIMIT 1 2
============================
<1-1> 可以对列表、集合和有序集合这三种类型使用SORT命令进行排序
<1-2> 对有序集合进行排序时,会忽略元素的分数,只针对元素自身的值进行排序
<1-3> 可以带上ALPHA参数,让排序按字母顺序排
<1-4> 如果排序的元素即不是数字,也没有带上ALPHA参数的话,会报错
<1-5> 带上DESC参数,可以让排序从大到小排
<1-6> LIMIT参数,你懂的
2)BY key | map->field 排序规则
============================
SORT sortbylist BY itemscore:* DESC
SORT tag:ruby:posts BY post:*->time
============================
<2-1> 参考键可以是字符串型键或者是散列类型键的某个字段(表示为键名->字段名)
<2-2> 如果提供了BY参数,SORT命令将不再依据元素自身的值进行排序,而是对每个元素的值替换参考键中的第一个"*"并获取其值,然后依据该值对元素排序
<2-3> 当参考键名不包含"*"时(即常量键名,与元素值无关),SORT命令将不会执行排序操作,因为redis认为这种情况是没有意义的
<2-4> 如果几个元素的参考键值相同,则SORT命令会比较元素本身的值来决定元素的顺序
<2-5> 当某个元素的参考键不存在时,会默认参考键的值为0
<2-6> 参数键虽然支持散列类型,但是"*"只能在"->"符号前面(即键名部分)才有用,在"->"后(即字段名部分)会被当成字段名本身而不会作为占位符被元素的值替换,即常量键名
<2-7> 一个SORT命令中只能有一个BY参数
3)GET key | map->field 返回指定值
============================
SORT tag:ruby:posts BY post:*->time DESC GET post:*->title
SORT tag:ruby:posts BY post:*->time DESC GET post:*->title GET post:*->time
SORT tag:ruby:posts BY post:*->time DESC GET post:*->title GET post:*->time GET #
============================
<3-1> GET参数不影响排序,它的作用是使SORT命令的返回结果不再是元素自身的值,而GET参数中指定的键值
<3-2> GET参数和规则和BY参数一样,也支持字符串类型和散列类型的键,并使用"*"作为占位符
<3-3> 在一个SORT命令中可以有多个GET参数(而BY参数只能有一个)
<3-4> GET # 会返回元素自身的值
4)STORE key 将结果保存到指定键
============================
SORT tag:ruby:posts BY post:*->time DESC GET post:*->title GET post:*->time GET # STORE sort.result
============================
<4-1> 默认情况下SORT会直接返回排序结果,如果希望保存排序结果,可以使用STORE参数
<4-2> 保存后的键的类型为列表类型,如果键已经存在则会覆盖它
【消息通知】
1)BRPOP list list2 list3 timeout 阻塞弹出(从右边弹出)
============================
BRPOP queue 300
BRPOP queue 0
BRPOP queue:1 queue:2 queue:3 0
============================
<1-1> BRPOP和RPOP命令相似,最大的区别是当列表中没有元素时BRPOP命令会一直阻塞住连接
<1-2> BRPOP的最后一个参数timeout是超时时间,单位为秒,如果超过了此时间仍然没有新元素的话就会返回nil
<1-3> 但timeout设置为0时,表示不限制等待时间,即如果没有新元素加入列表就会永远阻塞下去
<1-4> BRPOP一般都是用于形成任务队列的,需要起两个客户端,一个往列表里添加任务,另一个阻塞住,监听待处理的任务列表,有任务就立即处理
<1-5> 当list不只一个时,几个list会形成优先级,排在前面的列表优先级优于后面的,一旦前面的列表中有元素了,无论后面的列表中是否还有待处理的元素,都会优先处理前面的列表
<1-6> 当BRPOP获得一个元素后,会返回两个值,分别是键名和元素值
2)BLPOP list list2 list3 timeout 阻塞弹出(从左边弹出)
功能同上
3)PUBLISH channel message 发布消息
============================
PUBLISH channel.1 hi
============================
向指频道推送消息
4)SUBSCRIBE channel channel2 channel3 订阅频道(可批量操作)
============================
SUBSCRIBE channel.1
SUBSCRIBE channel.2 channel.3
============================
<4-1> "发布/订阅"模式和前面的"任务队列"模式有些相似,都是发布者和接收者分开,处在两个或更多客户端进程里,但任务队列是通过LPUSH或RPUSH往一个列表里添加元素,通过BRPOP或BLPOP阻塞住往外拿出元素,如果有多个消费者,可以快速把生产者生产的任务给并行地处理掉,而且,消费者在什么时候加入进来都可以访问到任务队列中的任务,而发布订阅模式不同,每个订阅都都会从发布者那里收到同样的消息,不存在并行处理消息的问题,而且,如果发布者先发布,订阅者之后才订阅的,那么它就收不到之前的消息了
<4-2> 执行SUBSCRIBE命令后客户端会进入订阅状态,处于此状态下客户端不能使用除SUBSCRIBE / UNSUBSCRIBE / PSUBSCRIBE / PUNSUBSCRIBE 这4个属于"发布/订阅"模式的命令之外的命令,否则会报错
<4-3> 进入订阅状态后客户端可能收到三种类型的回复:
[4-3-1] subscribe ,频道名称 ,当前客户端订阅的频道数量
[4-3-2] message , 频道名称 , 消息的内容
[4-3-3] unsubscribe , 频道名称 ,当前客户端订阅的频道数量。当此值为0时客户端会退出订阅状态,之后就可以执行其他非"发布/订阅"模式的命令了
5)UNSUBSCRIBE channel channel2 channel3 取消订阅频道(可批量操作)
============================
UNSUBSCRIBE
UNSUBSCRIBE channel.1
UNSUBSCRIBE channel.2 channel.3
============================
如果不指定频道则会取消订阅所有频道
6)PSUBSCRIBE channel channel2 channel3 使用通配符订阅频道(可批量操作)
============================
PSUBSCRIBE channel.?
PSUBSCRIBE channel.2*
============================
<6-1> 和KEYS命令一样,支持glob风格的通配符(?* [] \x)
<6-2> PSUBSCRIBE命令可以重复订阅频道,比如PSUBSCRIBE channel.? channel.?* 会同时订阅两个频道
<6-3> PSUBSCRIBE命令的返回值比SUBSCRIBE的返回值要多一个参数:订阅时使用的通配符,这个参数会插在第二个参数的位置上
7)PUNSUBSCRIBE channel channel2 channel3 使用通配符取消订阅频道(可批量操作)
============================
PUNSUBSCRIBE
PUNSUBSCRIBE channel.?
PUNSUBSCRIBE channel.2* channel.3?*
============================
<7-1> 如果不指定频道则会取消订阅所有频道
<7-2> 使用PUNSUBSCRIBE命令只能退订PSUBSCRIBE命令订阅的规则,不会影响通过SUBSCRIBE命令订阅的频道。同样UNSUBSCRIBE命令也不会影响通过PSUBSCRIBE命令订阅的频道
<7-3> 容易出错的一点是,PUNSUBSCRIBE命令不会将其中的通配符展开,而是进行严格的字符串匹配,所以PUNSUBSCRIBE * 无法退订channel.* 规则,必须使用PUNSUBSCRIBE channel.*才能退订
【管理】
1)持久化 —— RDB方式
<1-1> redis支持RDB方式和AOF方式,这两种持久化方式。
<1-2> RDB是默认采用的方式,每隔一断时间在子进程中保存一次快照,优点是对性能不会造成太大干扰,缺点是对时间间隔内重启服务,这段间隔内的信息就会丢失掉
<1-3> 进行RDB快照的条件可以由用户在配置文件中自定义,由两人个参数构成:时间和改动的键的个数,当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。在配置文件中已经预置了3个条件:
save 900 1
save 300 10
save 60 10000
save参数指定了快照条件,可以存在多个条件,条件之间是"或"的关系,如上所说,save 900 1的意思是在15分钟(900秒)内有至少一个键被更改则进行快照
<1-4> 如果想禁用自动快照,只需要将所有save参数删除即可
<1-5> redis默认会将快照文件存储在当前目录的dump.rdb文件中,可以通过配置dir和dbfilename两人个参数分别指定快照文件的存储路径和文件名
<1-6> 除了自动快照,还可以手动发送SAVE或BGSAVE命令让redis执行快照。SAVE是由主进程进行快照操作,会阻塞住其它请求,BGSAVE会通过fork子进程进行快照操作
<1-7> redis启动后会读取RDB快照文件,将数据从硬盘载入到内存
2)持久化 —— AOF方式
<2-1> 默认情况下redis没有开启AOF方式的持久化,可以通过appendonly参数开启:appendonly yes
<2-2> 开启AOF持久化后每执行一条会更改redis中的数据的命令,redis就会将该命令写入硬盘中的AOF文件
<2-3> AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过
appendfilename参数修改:appendfilename appendonly.aof
<2-4> redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易。此时重新启动redis后reis会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少
3)复制,主从备份
<3-1> redis提供了复制功能可以实现主从备份自动同步,当主服务器有任何改动,从服务器自动保持同步。如果主机器硬盘坏了,可以快速启动从服务器继续工作
<3-2> 同步后的数据库分为主数据库和从数据库,主数据库可读可写,而从数据库一般为只读的,只接受主数据库同步过来的数据
<3-3> 主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库
<3-4> 在redis中使用复制功能非常容易,只需要在从数据库的配置文件中加入"slaveof 主数据库IP 主数据库端口"即可,主数据库无需进行任何配置
<3-5> 通过在redis-server命令后传入 --slaveof参数也可以启动复制功能:
$ redis-server --port 6380 --slaveof 127.0.0.1 6379
<3-6> 默认情况下从数据库是只读的,如果直接修改从数据库的数据会出现错误。可以通过设置从数据库的配置文件中的slave-read-only为no以使从数据库可写。但是对从数据库的任何更改都不会同步给任何其他数据库,并且一旦主数据库中更新了对应的数据就会覆盖从数据库中的改动
<3-7> 配置多台从数据库的方法也一样,在所有的从数据库的配置文件中都加上slaveof参数指向同一个主数据库即可
<3-8> SLAVEOF NO ONE命令可以使当前数据库停止接收其他数据库的同步转成主数据库
4)安全
<4-1> redis的默认配置会接受来自任何地址发送来的请求。而这是不安全的,我们需要在配置文件中修改bind参数,只允许可靠的ip访问,例如本机:
bind 127.0.0.1
bind参数只能绑定一个地址,如果想更自由地设置访问规则需要通过防火墙来完成
<4-2> 可以通过配置文件的requirepass参数为redis设置一个密码,例如:
requirepass abcdefg
redis客户端连接server的时候,需要通过AUTH命令验证,验证通过后才能正常访问:
redis> AUTH abcdefg
<4-3> 配置redis复制的时候,如果主数据库设置了密码,需要在从数据库的配置文件中通过masterauth参数设置主数据库的密码