Redis 学习笔记
1、如果通过Redis实现分布式锁
解决的问题:互斥性、安全性、死锁、容错。
使用SETNX 实现,SETNX key value:如果key不存在,则创建。时间复杂度为O(1).
expire key seconds 设置过期时间
setnx 和 expire 融合在一起执行
EX seconds 过期时间为秒
PX millisecond 毫秒
NX 只有键不存在时,才对键进行设置操作
XX: 只有键存在时才对键进行设置操作。
2、如何实现异步队列
1)使用Redis中的List作为队列
lpush ,lpop
缺点:LPOP 不会等待队列中有值之后再消费,而是直接进行消费
弥补:可以通过引用层引入Sleep机制去调用lpop重试
2)使用BLPOP key[key....] timeout 阻塞直到队列有消息或者超时。
缺点:生产的数据只能提供单一消费者消费。能否实现生产一次可供多个消费者消费呢?
3)Pub/Sub:主题订阅者模式
缺点:消息的发布是无状态的,无法保证到达。对于发送者来说,消息是“即发即失"的。
此时如果某个消费者在生产者发布消息时下线,重新上线之后,无法接收该消息的,要解决该问题需要使用专业的消息列队,如kafka。
3、Redis持久化
1)什么是持久化?
持久化,即数据持久储存,而不因断电或其他各种复杂外部环境影响数据的完整性。
2)Redis如果做持久化
Redis目前有二种方式做持久化,即RDB 和 AOF,
RDB:是通过保存某个时间点的全量数据快照实现数据持久化,当恢复数据时,直接通过RDB文件中的快照,将数据恢复。
1: RDB的创建于载入:SAVE、BGSAVE.
2: 自动化出发RDB持久化方式。
方式:
1、根据redis.conf配置里面的SAVE m n 定时触发(实际上使用的是BGSAVE)。
2、主从复制时,主节点自动触发。
3、执行 Debug Reload。
4、执行ShutDown 且没有开启AOF 持久化。
3:BGSAVE原理:
4:缺点:
>内存数据全量同步,数据量大的情况下,会由于I/O而言之影响性能。
>可能会因为Redis宕机而丢失从当前至最近一次快照间的数据。
AOF持久化:保存写状态。
。AOF 记录除了查询以外的所有变更数据库状态指令。
。以增量的形式追加保存到AOF文件中。
1、开启AOF持久化
2、日志重写解决AOF文件不断增大
AOF和RDB的优缺点:
1、RDB优点:全量数据快照,为减小,恢复快。
2、RDB缺点:无法保存最近一次快照之后的数据。
1、AOF优点:可读性高,适合保存增量数据,数据不易丢失。
2、AOF缺点:文件体积大,恢复时间长。
RDB 和 AOF 混合持久化方式:
在此种方式下的持久化文件,前半段是RDB格式的全量数据,后半段是AOF格式的增量数据。此种方式是目前较为推荐的一种方式。
4、Redis数据恢复
PipelIne 可以批量执行指令。
5、Redis 的同步机制
1、主从同步原理
2、Redis Sentinel(哨兵)
generic #一般命令组,对大多数类型适用
string #字符串类型命令组,使用所有字符串类型
list #列表类型命令组
set #集合类型命令组
sorted_set #有序集合命令组
hash #hash操作命令组
pubsub #发布命令组
transactions #事务操作命令组
connection #连接相关命令组
server #服务器相关命令组
scripting #lua 脚本命令组
hyperloglog #hyperloglog类型命令组,redis在 2.8.9 版本添加了 HyperLogLog 结构
cluster #集群相关命令组
geo #经纬度相关命令组,适用于3.2.0以后的版本
key操作
常用:
DEL key #删除某个key
KEYS pattern #查看符合正则的所有key
EXISTS key [key …] #判断某个key是否存在,可支持多个,返回存在的个数
EXPIRE key seconds #刷新某个key过期时间
MOVE key db #移动key到某个数据库
string操作
字符串操作中需要注意的是,redis中的整型也当作字符串处理。
常用:
SET key value [EX seconds] [PX milliseconds] [NX|XX] #设置key为指定的字符串值。
#参数:
#EX seconds – 设置键key的过期时间,单位时秒
#PX milliseconds – 设置键key的过期时间,单位时毫秒
#NX – 只有键key不存在的时候才会设置key的值
#XX – 只有键key存在的时候才会设置key的值
APPEND key value #如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 APPEND 将类似于 SET 操作。
GET key #获取key值,不存在则返回nil
GETRANGE key start end #获取指定key值的索引开始位置和结束位置所对应的值,索引从0开始
GETSET key value #设置新的key值,并获取设置之前的值,如果key不存在则设置,并返回nil
MGET key [key …] #批量获取key的值
MSET key value [key value …] #批量设置key的值
DECR key #数字类型的key自减操作,key类型不是数字则报错
INCR key #数字类型key 自加操作,与DECR相反
DECRBY key decrement #数字类型key指定减少数值
INCRBY key increment #数字类型key指定增加数值,与DECRBY相反
STRLEN key #获取key长度
示例:
list操作
列表中的元素索引从0开始,倒数的元素可以用“-”+倒数位置表示,如-2,代表倒数第二个元素,-1则代表最后一个元素。
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边。
一个列表最多可以包含 2 32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
常用:
LPUSH key value [value …] #从列表左边放入一个或者多个元素
LPUSHX key value #当列表存在时,从左边放入一个元素
RPUSH key value [value …] #从列表右边放入一个或者多个元素
RPUSHX key value #当列表存在时,从右边放入一个元素
LSET key index value #根据索引设置列表中元素的值,当list不存在是报错
LINDEX key index #根据列表索引获取元素值,索引从0开始
LINSERT key BEFORE|AFTER pivot value #在列表中,基于某个基准点插入值,pivot代表基准点
LLEN key #获取列表长度
LRANGE key start stop #根据索引获取列表中的元素,列表索引最后一个可以使用-1
LREM key count value #从存于 key 的列表里移除前 count 次出现的值为 value 的元素
#count > 0: 从头往尾移除值为 value 的元素
#count < 0: 从尾往头移除值为 value 的元素
#count = 0: 移除所有值为 value 的元素
LPOP key #从列表左边删除一个元素
RPOP key #从列表右边删除一个元素
RPOPLPUSH source destination #删除source列表中的删除最后一个元素将其追加到destination列表
LTRIM key start stop #根据索引start和stop保留列表元素
示例:
hash操作
hash操作所有命令都以H开头。
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 2 32 - 1 键值对(40多亿)。
常用:
HDEL key field [field …] #删除hash表中一个或多个字段
HEXISTS key field #判断hash表中字段是否存在
HGET key field #获取hash表中字段的值
HGETALL key #获取hash表中所有字段
HSET key field value # 设置hash表中字段的值
HSETNX key field value #只有当字段不存在时候才设置hash表中字段值,
HLEN key #获取hash表中字段个数
HVALS key #获取hash表中所有字段的值
HKEYS key #获取hash表中所有的字段
HSTRLEN key field #获取hash表中指定字段的值的长度
HMSET key field value [field value …] #批量设置hash表中字段的值
HMGET key field [field …] #批量获取hash表中字段的值
示例:
集合set操作
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 2 32 - 1 (4294967295, 每个集合可存储40多亿个成员)。
常用:
SADD key member [member …] #添加一个或多个元素到集合中
SREM key member [member …] #删除一个或多个集合中的元素
SCARD key #获取集合中元素数量
SMEMBERS key #返回集合中所有的元素
SINTER key [key …] #获取两个或两个以上集合的交集
SUNION key [key …] #获取两个或两个以上集合的并集
SDIFF key [key …] #获取两个或者两个以上集合的差集
SISMEMBER key member #判断元素是否是在指定集合中
SMOVE source destination member #移动一个集合中的元素到另一个集合
SPOP key [count] #移除count个集合中元素,count可选参数,默认为1,即移除一个
有序集合操作
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2 32 - 1 (4294967295, 每个集合可存储40多亿个成员)。
常用:
ZADD key [NX|XX] [CH] [INCR] score member [score member …] #向一个有序集合添加成员(元素)
#参数:
#XX: 仅仅更新存在的成员,不添加新成员。
#NX: 不更新存在的成员。只添加新成员。
#CH: 修改返回值为发生变化的成员总数,原始是返回新添加成员的总数 (CH 是 changed 的意思)。更改的元素是新添加的成员,已经存在的成员更新分数。 所以在命令中指定的成员有相同的分数将不被计算在内。注:在通常情况下,ZADD返回值只计算新添加成员的数量。
#INCR: 当ZADD指定这个选项时,成员的操作就等同ZINCRBY命令,对成员的分数进行递增操作。
ZCARD key #获取有序集合中元素个数
ZCOUNT key min max #指定分数范围的元素个数
ZINCRBY key increment member #为有序集的元素的score值加上增加指定的increment
ZRANGE key start stop [WITHSCORES] #根据有序集合中分数区间获取集合中的元素
ZRANGE key start stop [WITHSCORES] #获取有序集合中元素的排名
ZREM key member [member …] #删除有序集合中一个或多个元素
ZSCORE key member #设置元素在集合中的分数
GEO类型操作
Redis的GEO是 3.2 版本的新特性,对GEO(地理位置)的支持。这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作。
geo类型命令不多,总共6个所以这里全部列举出来了。
GEOADD key longitude latitude member [longitude latitude member …] #将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
GEODIST key member1 member2 [unit] #返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。指定单位的参数 unit 必须是以下单位的其中一个:
#m 表示单位为米
#km 表示单位为千米
#mi 表示单位为英里
#ft 表示单位为英尺
GEOPOS key member [member …] #从key里返回所有给定位置元素的位置(经度和纬度)
GEOHASH key member [member …] #返回一个或多个位置元素的 Geohash 表示。通常使用表示位置的元素使用不同的技术,使用Geohash位置52点整数编码。由于编码和解码过程中所使用的初始最小和最大坐标不同,编码的编码也不同于标准。此命令返回一个标准的Geohash
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
#以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
#范围可以使用以下其中一个单位:
#m 表示单位为米。
#km 表示单位为千米。
#mi 表示单位为英里。
#ft 表示单位为英尺。
#在给定以下可选项时, 命令会返回额外的信息:
#WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
#WITHCOORD: 将位置元素的经度和维度也一并返回。
#WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
#命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:
#ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
#DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。
#在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT 选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT 选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。
#返回值:
#在没有给定任何 WITH 选项的情况下, 命令只会返回一个像 [“New York”,”Milan”,”Paris”] 这样的线性(linear)列表。
#在指定了 WITHCOORD 、 WITHDIST 、 WITHHASH 等选项的情况下, 命令返回一个二层嵌套数组, 内层的每个子数组就表示一个元素
#在返回嵌套数组时, 子数组的第一个元素总是位置元素的名字。 至于额外的信息, 则会作为子数组的后续元素, 按照以下顺序被返回:
#以浮点数格式返回的中心与位置元素之间的距离, 单位与用户指定范围时的单位一致。
#geohash 整数。
#由两个元素组成的坐标,分别为经度和纬度。
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
#这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的。
操作示例:
五、发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
下图代表其发布订阅之间的关系
5806



被折叠的 条评论
为什么被折叠?



