中间件-Redis学习笔记

软件介绍

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

  • 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询
  • 位图(bitmaps), 基数统计(hyperloglogs) 和 地理空间(geospatial) 索引半径查询

命令汇总

Cluster

  • CLUSTER ADDSLOTS slot [slot …] 说明: 指派一个新的哈希槽位去接收节点
  • CLUSTER BUMPEPOCH - 说明: Advance the cluster config epoch
  • CLUSTER COUNT-FAILURE-REPORTS node-id 说明: Return the number of failure reports active for a given node
  • CLUSTER COUNTKEYSINSLOT slot 说明: Return the number of local keys in the specified hash slot
  • CLUSTER DELSLOTS slot [slot …] 说明: Set hash slots as unbound in receiving node
  • CLUSTER FAILOVER [FORCE|TAKEOVER] 说明: Forces a replica to perform a manual failover of its master.
  • CLUSTER FLUSHSLOTS - 说明: Delete a node’s own slots information
  • CLUSTER FORGET node-id 说明: Remove a node from the nodes table
  • CLUSTER GETKEYSINSLOT slot count 说明: Return local key names in the specified hash slot
  • CLUSTER INFO - 说明: Provides info about Redis Cluster node state
  • CLUSTER KEYSLOT key 说明: Returns the hash slot of the specified key
  • CLUSTER MEET ip port 说明: Force a node cluster to handshake with another node
  • CLUSTER MYID - 说明: Return the node id
  • CLUSTER NODES - 说明: Get Cluster config for the node
  • CLUSTER REPLICAS node-id 说明: List replica nodes of the specified master node
  • CLUSTER REPLICATE node-id 说明: Reconfigure a node as a replica of the specified master node
  • CLUSTER RESET [HARD|SOFT] 说明: Reset a Redis Cluster node
  • CLUSTER SAVECONFIG - 说明: Forces the node to save cluster state on disk
  • CLUSTER SET-CONFIG-EPOCH config-epoch 说明: Set the configuration epoch in a new node
  • CLUSTER SETSLOT slot IMPORTING|MIGRATING|STABLE|NODE [node-id] 说明: Bind a hash slot to a specific node
  • CLUSTER SLAVES node-id 说明: List replica nodes of the specified master node
  • CLUSTER SLOTS - 说明: Get array of Cluster slot to node mappings

Connection

1
2
3
4
5
6
7
8
9
10
11
12
13
Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
-h <hostname> Server hostname (default: 127.0.0.1).
-p <port> Server port (default: 6379).
-s <socket> Server socket (overrides hostname and port).
-a <password> Password to use when connecting to the server.
You can also use the REDISCLI_AUTH environment
variable to pass this password more safely
(if both are used, this argument takes precedence).
--user <username> Used to send ACL style 'AUTH username pass'. Needs -a.
--pass <password> Alias of -a for consistency with the new --user option.
--askpass Force user to input password with mask from STDIN.
If this argument is used, '-a' and REDISCLI_AUTH
environment variable will be ignored.
  • ping 检测redis server是否正常响应,正常回应pong
  • select切换数据,如select 0(redis默认带16个数据编号为0-15)

GeO

地理位置相关

  • GEOADD key longitude latitude member [longitude latitude member …] 添加一个或多个地理空间位置到sorted set
  • GEOHASH key member [member …] 返回一个标准的地理空间的Geohash字符串
  • GEOPOS key member [member …] 返回地理空间的经纬度
  • GEODIST key member1 member2 [unit] 返回两个地理空间之间的距离
  • GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] 查询指定半径内所有的地理空间元素的集合。
  • GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] 查询指定半径内匹配到的最大距离的一个地理空间元素。

Hashes

哈希相关操作

  • HDEL key field [field ...] 删除一个或多个Hash的field
  • HEXISTS key field 判断field是否存在于hash中
  • HGET key field 获取hash中field的值
  • HGETALL key 从hash中读取全部的键和值
  • HINCRBY key field increment 将hash中指定域的值增加给定的数字
  • HINCRBYFLOAT key field increment 将hash中指定域的值增加给定的浮点数
  • HKEYS key 获取hash的所有字段
  • HLEN key 获取hash里所有字段的数量
  • HMGET key field [field ...] 获取hash里面指定多个字段的值
  • HMSET key field value [field value ...]设置hash字段值
  • HSET key field value 设置hash里面一个字段的值
  • HSETNX key field value 设置hash的一个字段,只有当这个字段不存在时有效
  • HSTRLEN key field 获取hash里面指定field的长度
  • HVALS key 获得hash的所有值
  • HSCAN key cursor [MATCH pattern] [COUNT count] 迭代hash里面的元素

HyperLogLog

HyperLogLog常用于大数据量的统计,比如页面访问量统计或者用户访问量统计。

  • PFADD key element [element …] 将指定元素添加到HyperLogLog
  • PFCOUNT key [key …] 返回HyperLogLog在键处观察到的集合的近似基数。
  • PFMERGE destkey sourcekey [sourcekey …] 将N个不同的HyperLogLog合并为一个。

案例

1
2
3
4
1、将访问指定页面的每个用户 ID 添加到 HyperLogLog 中。
PFADD PAGE_1:UV USER1 USER2 ...... USERn
2、统计指定页面的 UV。
PFCOUNT PAGE_1:UV

Keys

key操作

  • DEL key [key ...] 删除指定的key(一个或多个)
  • DUMP key 导出key的值
  • EXISTS key [key ...] 查询一个key是否存在
  • EXPIRE key seconds 设置一个key的过期的秒数
  • EXPIREAT key timestamp设置一个UNIX时间戳的过期时间
  • KEYS pattern查找所有匹配给定的模式的键
  • MIGRATE host port key destination-db timeout [COPY] [REPLACE]原子性的将key从redis的一个实例移到另一个实例
  • MOVE key db移动一个key到另一个数据库
  • OBJECT subcommand [arguments [arguments ...]]检查内部的再分配对象
  • PERSIST key移除key的过期时间
  • PEXPIRE key milliseconds设置key的有效时间以毫秒为单位
  • PEXPIREAT key milliseconds-timestamp设置key的到期UNIX时间戳以毫秒为单位
  • PTTL key获取key的有效毫秒数
  • RANDOMKEY返回一个随机的key
  • RENAME key newkey将一个key重命名
  • RENAMENX key newkey重命名一个key,新的key必须是不存在的key
  • RESTORE key ttl serialized-value [REPLACE] Create a key using the provided serialized value, previously obtained using DUMP.
  • SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]对队列、集合、有序集合排序
  • TTL key获取key的有效时间(单位:秒)
  • TYPE key获取key的存储类型
  • WAIT numslaves timeout Wait for the synchronous replication of all the write commands sent in the context of the current connection
  • SCAN cursor [MATCH pattern] [COUNT count] 增量迭代key

Lists

列表操作

  • BLPOP key [key …] timeout删除,并获得该列表中的第一元素,或阻塞,直到有一个可用
  • BRPOP key [key …] timeout删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用
  • BRPOPLPUSH source destination timeout弹出一个列表的值,将它推到另一个列表,并返回它;或阻塞,直到有一个可用
  • LINDEX key index 获取一个元素,通过其索引列表
  • LINSERT key BEFORE|AFTER pivot value 在列表中的另一个元素之前或之后插入一个元素
  • LLEN key 获得队列(List)的长度
  • LPOP key 从队列的左边出队一个元素
  • LPUSH key value [value …]从队列的左边入队一个或多个元素
  • LPUSHX key value当队列存在时,从队到左边入队一个元素
  • LRANGE key start stop 从列表中获取指定返回的元素
  • LREM key count value 从列表中删除元素
  • LSET key index value 设置队列里面一个元素的值
  • LTRIM key start stop 修剪到指定范围内的清单
  • RPOP key 从队列的右边出队一个元
  • RPOPLPUSH source destination 删除列表中的最后一个元素,将其追加到另一个列表
  • RPUSH key value [value …] 从队列的右边入队一个元素
  • RPUSHX key value 从队列的右边入队一个元素,仅队列存在时有效

Pub/Sub

发布订阅

  • PSUBSCRIBE pattern [pattern …]Listen for messages published to channels matching the given patterns
  • PUBSUB subcommand [argument [argument …]]Inspect the state of the Pub/Sub subsystem
  • PUBLISH channel message发布一条消息到频道
  • PUNSUBSCRIBE [pattern [pattern …]]停止发布到匹配给定模式的渠道的消息听
  • SUBSCRIBE channel [channel …]监听频道发布的消息
  • UNSUBSCRIBE [channel [channel …]]停止频道监听

Scripting

执行脚本

  • EVAL script numkeys key [key …] arg [arg …]在服务器端执行 LUA 脚本
  • EVALSHA sha1 numkeys key [key …] arg [arg …]在服务器端执行 LUA 脚本
  • SCRIPT DEBUGYES|SYNC|NOSet the debug mode for executed scripts.
  • SCRIPT EXISTS script [script …]Check existence of scripts in the script cache.
  • SCRIPT FLUSH删除服务器缓存中所有Lua脚本。
  • SCRIPT KILL杀死当前正在运行的 Lua 脚本。
  • SCRIPT LOADscript从服务器缓存中装载一个Lua脚本。

Server

服务器操作

  • BGREWRITEAOF异步重写追加文件命令
  • BGSAVE异步保存数据集到磁盘上
  • CLIENT KILL[ip:port] [ID client-id] [TYPE normal|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]关闭客户端连接
  • CLIENT LIST获得客户端连接列表
  • CLIENT GETNAME获得当前连接名称
  • CLIENT IDReturns the client ID for the current connection
  • CLIENT PAUSEtimeout暂停处理客户端命令
  • CLIENT REPLYON|OFF|SKIPInstruct the server whether to reply to commands
  • CLIENT SETNAMEconnection-name设置当前连接的名字
  • CLIENT UNBLOCKclient-id [TIMEOUT|ERROR]Unblock a client blocked in a blocking command from a different connection
  • COMMANDGet array of Redis command details
  • COMMAND COUNTGet total number of Redis commands
  • COMMAND GETKEYSExtract keys given a full Redis command
  • COMMAND INFOcommand-name [command-name …]Get array of specific Redis command details
  • CONFIG GETparameter获取配置参数的值
  • CONFIG REWRITE从写内存中的配置文件
  • CONFIG SETparameter value设置配置文件
  • CONFIG RESETSTAT复位再分配使用info命令报告的统计
  • DBSIZE返回当前数据库里面的keys数量
  • DEBUG OBJECTkey获取一个key的debug信息
  • DEBUG SEGFAULT使服务器崩溃命令
  • FLUSHALL清空所有数据库命令
  • FLUSHDB清空当前的数据库命令
  • INFO[section]获得服务器的详细信息
  • LASTSAVE获得最后一次同步磁盘的时间
  • MEMORY DOCTOROutputs memory problems report
  • MEMORY HELPShow helpful text about the different subcommands
  • MEMORY-MALLOC-STATSShow allocator internal stats
  • MEMORY-PURGEAsk the allocator to release memory
  • MEMORY-STATSShow memory usage details
  • MEMORY-USAGEkey [SAMPLES count]Estimate the memory usage of a key
  • MONITOR实时监控服务器
  • REPLICAOFhost portMake the server a replica of another instance, or promote it as master.
  • ROLEReturn the role of the instance in the context of replication
  • SAVE同步数据到磁盘上
  • SHUTDOWN[NOSAVE] [SAVE]关闭服务
  • SLAVEOFhost port指定当前服务器的主服务器
  • SLOWLOGsubcommand [argument]管理再分配的慢查询日志
  • SYNC用于复制的内部命令
  • TIME返回当前服务器时间

Sets

集合

  • SADD key member [member …]添加一个或者多个元素到集合(set)里
  • SCARD key获取集合里面的元素数量
  • SDIFF key [key …]获得队列不存在的元素
  • SDIFFSTORE destination key [key …]获得队列不存在的元素,并存储在一个关键的结果集
  • SINTER key [key …]获得两个集合的交集
  • SINTERSTOREdestination key [key …]获得两个集合的交集,并存储在一个关键的结果集
  • SISMEMBER key member确定一个给定的值是一个集合的成员
  • SMEMBERS key获取集合里面的所有元素
  • SMOVE source destination member移动集合里面的一个元素到另一个集合
  • SPOPkey [count]删除并获取一个集合里面的元素
  • SRANDMEMBER key [count]从集合里面随机获取一个元素
  • SREM key member [member …]从集合里删除一个或多个元素
  • SUNION key [key …]添加多个set元素
  • SUNIONSTORE destination key [key …]合并set元素,并将结果存入新的set里面
  • SSCANkey cursor [MATCH pattern] [COUNT count]迭代set里面的元素

Sorted Sets

有序集合

  • ZADDkey [NX|XX] [CH] [INCR] score member [score member …]添加到有序set的一个或多个成员,或更新的分数,如果它已经存在
  • ZCARDkey获取一个排序的集合中的成员数量
  • ZCOUNTkey min max返回分数范围内的成员数量
  • ZINCRBYkey increment member增量的一名成员在排序设置的评分
  • ZINTERSTOREdestination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]相交多个排序集,导致排序的设置存储在一个新的关键
  • ZLEXCOUNTkey min max返回成员之间的成员数量
  • ZPOPMAXkey [count]Remove and return members with the highest scores in a sorted set
  • ZPOPMINkey [count]Remove and return members with the lowest scores in a sorted set
  • ZRANGEkey start stop [WITHSCORES]根据指定的index返回,返回sorted set的成员列表
  • ZRANGEBYLEXkey min max [LIMIT offset count]返回指定成员区间内的成员,按字典正序排列, 分数必须相同。
  • ZREVRANGEBYLEXkey max min [LIMIT offset count]返回指定成员区间内的成员,按字典倒序排列, 分数必须相同
  • ZRANGEBYSCOREkey min max [WITHSCORES] [LIMIT offset count]返回有序集合中指定分数区间内的成员,分数由低到高排序。
  • ZRANKkey member确定在排序集合成员的索引
  • ZREMkey member [member …]从排序的集合中删除一个或多个成员
  • ZREMRANGEBYLEXkey min max删除名称按字典由低到高排序成员之间所有成员。
  • ZREMRANGEBYRANKkey start stop在排序设置的所有成员在给定的索引中删除
  • ZREMRANGEBYSCOREkey min max删除一个排序的设置在给定的分数所有成员
  • ZREVRANGEkey start stop [WITHSCORES]在排序的设置返回的成员范围,通过索引,下令从分数高到低
  • ZREVRANGEBYSCOREkey max min [WITHSCORES] [LIMIT offset count]返回有序集合中指定分数区间内的成员,分数由高到低排序。
  • ZREVRANKkey member确定指数在排序集的成员,下令从分数高到低
  • ZSCOREkey member获取成员在排序设置相关的比分
  • ZUNIONSTOREdestination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]添加多个排序集和导致排序的设置存储在一个新的关键
  • ZSCANkey cursor [MATCH pattern] [COUNT count]迭代sorted sets里面的元素

Streams

流处理

  • XACKkey group ID [ID …]Marks a pending message as correctly processed, effectively removing it from the pending entries list of the consumer group. Return value of the command is the number of messages successfully acknowledged, that is, the IDs we were actually able to resolve in the PEL.
  • XADDkey ID field string [field string …]Appends a new entry to a stream
  • XCLAIMkey group consumer min-idle-time ID [ID …] [IDLE ms] [TIME ms-unix-time] [RETRYCOUNT count] [FORCE] [JUSTID]Changes (or acquires) ownership of a message in a consumer group, as if the message was delivered to the specified consumer.
  • XDELkey ID [ID …]Removes the specified entries from the stream. Returns the number of items actually deleted, that may be different from the number of IDs passed in case certain IDs do not exist.
  • XGROUP[CREATE key groupname id-or-$] [SETID key id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername]Create, destroy, and manage consumer groups.
  • XINFO[CONSUMERS key groupname] [GROUPS key] [STREAM key] [HELP]Get information on streams and consumer groups
  • XLENkeyReturn the number of entires in a stream
  • XPENDINGkey group [start end count] [consumer]Return information and entries from a stream consumer group pending entries list, that are messages fetched but never acknowledged.
  • XRANGEkey start end [COUNT count]Return a range of elements in a stream, with IDs matching the specified IDs interval
  • XREAD[COUNT count] [BLOCK milliseconds] STREAMS key [key …] ID [ID …]Return never seen elements in multiple streams, with IDs greater than the ones reported by the caller for each stream. Can block.
  • XREADGROUPGROUP group consumer [COUNT count] [BLOCK milliseconds] STREAMS key [key …] ID [ID …]Return new entries from a stream using a consumer group, or access the history of the pending entries for a given consumer. Can block.
  • XREVRANGEkey end start [COUNT count]Return a range of elements in a stream, with IDs matching the specified IDs interval, in reverse order (from greater to smaller IDs) compared to XRANGE
  • XTRIMkey MAXLEN [] countTrims the stream to (approximately if ‘‘ is passed) a certain size

Strings

字符串

  • APPEND key value追加一个值到key上
  • BITCOUNT key [start end]统计字符串指定起始位置的字节数
  • BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL] 对字符串执行任意位字段整数操作
  • BITOP operation destkey key [key ...] 在字符串之间执行按位操作
  • BITPO Skey bit [start] [end] 查找字符串中的第一个位集或清除
  • DECR key 整数原子减1
  • DECRBY key decrement 原子减指定的整数
  • GET key返回key的value
  • GETBIT key offset返回位的值存储在关键的字符串值的偏移量。
  • GETRANGE key start end获取存储在key上的值的一个子字符串
  • GETSETkey value设置一个key的value,并获取设置前的值
  • INCRkey执行原子加1操作
  • INCRBYkey increment执行原子增加一个整数
  • INCRBYFLOATkey increment执行原子增加一个浮点数
  • MGETkey [key …]获得所有key的值
  • MSETkey value [key value …]设置多个key value
  • MSETNXkey value [key value …]设置多个key value,仅当key存在时
  • PSETEXkey milliseconds valueSet the value and expiration in milliseconds of a key
  • SETkey value [EX seconds] [PX milliseconds] [NX|XX]设置一个key的value值
  • SETBIT key offset valueSets or clears the bit at offset in the string value stored at key
  • SETEX key seconds value设置key-value并设置过期时间(单位:秒)
  • SETNX key value设置的一个关键的价值,只有当该键不存在
  • SETRANGE key offset valueOverwrite part of a string at key starting at the specified offset
  • STRLEN key获取指定key值的长度

Transactions

事务

  • DISCARD 丢弃所有 MULTI 之后发的命令
  • EXEC执行所有 MULTI 之后发的命令
  • MULTI标记一个事务块开始
  • UNWATCH取消事务命令
  • WATCHkey [key ...]锁定key直到执行了 MULTI/EXEC 命令

相关特点

redis为什么会这么快

1、采用高效的优化过的数据结构(C语言实现),在几种基础的数据结构上,redis 做了大量优化,性能极高;
2、完全基于内存操作;
3、单线程运行,省去了上下文切换成本;
4、使用非阻塞的 IO 多路复用机制;
5、惰性删除机制;

相关概念

缓存穿透(缓存和数据库都没有)

缓存穿透(cache penetration)是用户访问的数据既不在缓存当中,也不在数据库中。出于容错的考虑,如果从底层数据库查询不到数据,则不写入缓存。这就导致每次请求都会到底层数据库进行查询,缓存也失去了意义。当高并发或有人利用不存在的Key频繁攻击时,数据库的压力骤增,甚至崩溃,这就是缓存穿透问题。

造成原因:

  • 数据库数据被删除
  • 恶意攻击

解决方案:

  • 及时进行监控预警,如果是数据库数据被删及时补上
  • 允许缓存中存在null值,需要业务逻辑的配合
  • 如果是恶意攻击可以设置黑白名单

缓存击穿(单个热点key失效)

缓存击穿(Cache Breakdown)是单个热点key,在不停的扛着大并发,在这个key失效的瞬间,持续的大并发请求就会击破缓存,直接请求到数据库,好像蛮力击穿一样。

解决方案:

  • 设置key永远不过期,或者主动的去更新key(可能需要进行加锁)

缓存雪崩(大面积key同时失效)

缓存雪崩(Cache Avalanche)是在使用缓存时,通常会对缓存设置过期时间,一方面目的是保持缓存与数据库数据的一致性,另一方面是减少冷缓存占用过多的内存空间。
但当缓存中大量热点缓存采用了相同的实效时间,就会导致缓存在某一个时刻同时实效,请求全部转发到数据库,从而导致数据库压力骤增,甚至宕机。从而形成一系列的连锁反应,造成系统崩溃等情况。

造成原因:

  • 大量热点key同时过期
  • 缓存服务故障

解决方案:

  • 通常的解决方案是将key的过期时间后面加上一个随机数(比如随机1-5分钟),让key均匀的失效。
  • 热点数据可以考虑不失效,后台异步更新缓存,适用于不严格要求缓存一致性的场景。
  • 双key策略,主key设置过期时间,备key不设置过期时间,当主key失效时,直接返回备key值。
  • 构建缓存高可用集群(针对缓存服务故障情况)。
  • 当缓存雪崩发生时,服务熔断、限流、降级等措施保障。

设计原理

zset底层设计

zset本身是一个有序不重复的集合,底层数据结构采用

skiplist底层设计

持久存储

redis支持的两种持久化方式,分别是aof和rdb方式

AOF

RDB

事务处理

redis同样支持事务

事务的原理是将一个事务范围内的若干命令发送给Redis,然后再让Redis依次执行这些命令。
事务的生命周期:

  1. 使用MULTI开启一个事务
  2. 在开启事务的时候,每次操作的命令将会被插入到一个队列中,同时这个命令并不会被真的执行
  3. EXEC命令进行提交事务

一个事务范围内某个命令出错不会影响其他命令的执行,不保证原子性:

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> multi 
OK
127.0.0.1:6379> set a 1 QUEUED
127.0.0.1:6379> set b 1 2 QUEUED
127.0.0.1:6379> set c 3 QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR syntax error
3) OK

相关资料

官网:https://redis.io/
命令:http://www.redis.cn/commands.html
书籍:Redis设计与实现.pdf


中间件-Redis学习笔记
https://mikeygithub.github.io/2021/05/09/yuque/中间件篇-Redis学习笔记/
作者
Mikey
发布于
2021年5月9日
许可协议