什么是redis?
基于k v键值对的内存数据库,配备持久化的磁盘
String ,bitmap ,bigfield ,hash, list set ,sorted set,stream,geospatial地理空间,hyperloglog基数统计
- string 二进制安全的
- list string类型字符串列表 双端链表 左右头尾都可以添加元素
- hash 一个field一个value
- set string类型的无序集合,无重复 intset hashtable 时间复杂度o1
- zset 可排序集合,不同的每个元素都会关联一个double类型的分数
- geo 存储地理坐标 经纬度信息
- hyperloglog 基数(不重复的数字)统计算法
- bitmap 位图 由0 1 状态表现的二进制位的bit数组
- bitfield 比特位域
- stream 流 主要用于redis的发布订阅 实现消息队列功能 类似 消息中间件
为什么需要redis?
分布式缓存,挡在mysql前的带刀护卫,所有查询先去查redis,没有再去查mysql,然后将数据再写进redis
redis可以将数据写进硬盘同时不影响服务(持久化) redis和mysql不是竞争关系,他们是配合使用
redis有几种模式?
- 单机
- 主从
- 哨兵
- 集群
redis缓存存在的问题?
- 穿透
- 击穿
- 雪崩
redis分布式锁?
redis队列
redis优势?
- 性能极高速度快
- 持久化
- 数据类型丰富 list set zset hash string
- 支持数据库备份 maset-slave
redis常见数据类型的操作命令?
(key)相关的操作命令:
-
SET key value:设置指定键的值。
-
GET key:获取指定键的值。
-
DEL key:删除指定键及其对应的值。
-
EXISTS key:检查指定键是否存在。
-
KEYS pattern:返回匹配给定模式的所有键。
-
EXPIRE key seconds:设置键的过期时间,以秒为单位。
-
TTL key:获取键的剩余生存时间(Time To Live)。
-
PERSIST key:移除键的过期时间,使其永久保存。
-
TYPE key:返回键的数据类型。
-
INCR key:将键的值递增1。
-
DECR key:将键的值递减1。
-
INCRBY key increment:将键的值递增指定的增量。
-
DECRBY key decrement:将键的值递减指定的减量。
-
APPEND key value:将值追加到键的当前值的末尾。
-
STRLEN key:返回键对应值的长度。
"SET key value"
-
EX seconds:设置键的过期时间,以秒为单位。当使用该参数时,键将在指定的秒数后自动过期。如果值被替换,将不会过期(默认的)
-
PX milliseconds:设置键的过期时间,以毫秒为单位。与 EX 参数类似,但时间精度更高。
-
NX:仅在键不存在时设置键的值。如果键已存在,则不执行任何操作。
-
XX:仅在键已经存在时设置键的值。如果键不存在,则不执行任何操作。
5.keepttl :设置键的过期时间,以秒为单位,如果值被替换 ,过期时间会续接
这些可选参数的作用如下:
-
过期时间参数(EX 和 PX)允许在设置键时指定一个持续时间,使键在一定时间后自动过期并被删除。可以根据具体的需求设置合适的过期时间,以便控制键的生命周期。
-
NX 和 XX 参数用于控制 SET 操作的条件。NX 表示仅在键不存在时才设置键的值,用于实现分布式锁等场景。XX 表示仅在键已经存在时才设置键的值,用于更新已有键的值。
示例用法:
SET key value EX 3600 # 设置键的值,并将过期时间设置为 3600 秒
SET key value PX 60000 # 设置键的值,并将过期时间设置为 60000 毫秒
SET key value NX # 仅在键不存在时设置键的值
SET key value XX # 仅在键已经存在时设置键的值
string相关命令:
mset k1 v1 k2 v2 批量操作
mget k1 k2
getrange k1 0 4(相当于substring)
setrange k1 1 xxyy (v1:12345678>>1xxyy6789)精准替换
incr k1 (v1 值+1)
decr
decrby k1 5 (v1值-5)
incrby
setnx k1 10过期时间 v1 (不存在时) 分布式锁用到
setex(存在时) 分布式锁用到
getset k1 v1 获得原来的v1 然后设置现在的v1
list相关命令:
lpush list1 123456
rpush list2 123456
lrange list1 0 -1 (下标 全部)
654321
lrange list2
123456
lpop list 删除左边元素
rpop list 删除右边元素
lindex list 0 (下标取值)
llen list 集合值个数
lrem list 3 1 删除3个等于1的值
ltrim list 4 7 保留下标4到7 的集合
rpoplpush list1 list2 (将list1右边元素 从list2的左边加入 命令返回该元素值)
lset list 1 mysql 将下标为1的值替换为mysql
linset list before/after mysql java (在mysql元素 前/后 插入java)
应用场景:公众号订阅发布
hash命令:
hset user:001 id 11 name xt
hget user:001 id
hmset user:001 id 12 name xt user:002 id 13 name xt
hmget user:001 id name
hgetall user:001 获取对象全部()
hexists user:001 name 有没有name字段
hkeys user:001 所有key
hvals user:001 所有value
hsetnx user:001 name xt name不存在新建成功 存在 不做任何操作不会替换name值
hincrby user:001 age 1 年龄加1
hincrbyfloat user:001 age 0.5 加0.5
应用场景:购物车
set命令:
在 Redis 中,有一组与集合(Set)相关的命令用于对存储在集合中的元素进行操作。以下是常用的集合命令:
- SADD:向集合中添加一个或多个元素。
```
SADD key member [member ...]
```
- SMEMBERS:返回集合中的所有成员。
```
SMEMBERS key
```
- SCARD:返回集合中的成员数量。
```
SCARD key
```
- SISMEMBER:判断指定成员是否存在于集合中。
```
SISMEMBER key member
```
- SREM:从集合中移除一个或多个成员。
```
SREM key member [member ...]
```
- SPOP:随机移除并返回集合中的一个元素。
```
SPOP key [count]
```
- SRANDMEMBER:随机返回集合中的一个或多个元素。
```
SRANDMEMBER key [count]
```
- SINTER:返回给定集合之间的交集。
```
SINTER key [key ...]
```
- SUNION:返回给定集合之间的并集。
```
SUNION key [key ...]
```
- SDIFF:返回给定集合之间的差集。
```
SDIFF key [key ...]
```
- SMOVE:将指定成员从一个集合移动到另一个集合。
```
SMOVE source destination member
```
应用场景:猜你喜欢 ,可能认识的人,微信抽奖小程序,微信好友点赞展示
zset命令:
在 Redis 中,ZSET(有序集合,Sorted Set)是一种特殊类型的数据结构,它与普通的集合不同之处在于,每个集合成员都关联着一个分数(score),并且集合成员按照分数从小到大排序。以下是常用的有序集合命令:
- ZADD:向有序集合中添加一个或多个成员,以及对应的分数。
```
ZADD key score member [score member ...]
```
- ZRANGE:返回有序集合中指定范围内的成员,按照分数从小到大排序。
```
ZRANGE key start stop [WITHSCORES]
```
- ZREVRANGE:返回有序集合中指定范围内的成员,按照分数从大到小排序。
```
ZREVRANGE key start stop [WITHSCORES]
```
- ZRANK:返回有序集合中指定成员的排名,按照分数从小到大排序(排名从 0 开始)。
```
ZRANK key member
```
- ZREVRANK:返回有序集合中指定成员的排名,按照分数从大到小排序(排名从 0 开始)。
```
ZREVRANK key member
```
- ZSCORE:返回有序集合中指定成员的分数。
```
ZSCORE key member
```
- ZREM:从有序集合中移除一个或多个成员。
```
ZREM key member [member ...]
```
- ZCOUNT:返回有序集合中指定分数范围内的成员数量。
```
ZCOUNT key min max
```
- ZINCRBY:将指定成员的分数增加指定的增量值。
```
ZINCRBY key increment member
```
这些命令可以用于向有序集合中添加、删除、查询成员,以及根据分数进行范围查询等操作。通过利用有序集合的特性,可以实现一些高级的数据结构和算法,例如排行榜、计数器等。
bitmap命令:
在 Redis 中,BITMAP 是一种位图数据结构,它将指定的键(key)映射为一个由二进制位(bit)组成的数组,并提供了一些位操作命令
- SETBIT:设置位图中指定偏移量上的位值。
```
SETBIT key offset value
```
- GETBIT:获取位图中指定偏移量上的位值。
```
GETBIT key offset
```
- BITCOUNT:计算位图中指定范围内的位值为 1 的个数。
```
BITCOUNT key [start end]
```
- BITOP:对多个位图执行逻辑操作,将结果保存到目标位图中。
```
BITOP operation destkey key [key ...]
```
- operation 可以是 AND、OR、XOR、NOT 等操作符。
- destkey 是存放操作结果的目标位图。
- key 是需要进行操作的源位图。
- BITPOS:查找位图中第一个设置为给定值的位的偏移量。
```
BITPOS key bit [start] [end]
```
- bit 可以是 0 或者 1。
- start 和 end 是查询位的起始和结束偏移量范围。
- BITFIELD:按照指定的位域结构从位图中获取、设置或更新位值。
```
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
```
- type 可以是 u8、u16、u32、i32 等位域类型。
- offset 是位域在位图中的偏移量。
- value 是要设置或增加的值。
这些命令可以用于对位图进行位操作,例如设置、获取、计数、逻辑运算等。位图在处理大量二进制数据、位运算和压缩存储等方面具有优势,可以应用于多种场景,如统计、布隆过滤器、权限管理等。
请注意,在使用上述命令时,需要将 key 替换为实际的位图键名,而 offset 则是指定的位偏移量。
hyperloglog命令:
在 Redis 中,HyperLogLog 是一种基数估计算法,用于统计元素的去重数量。它通过使用固定长度的数据结构来估算输入集合的基数,并且具有很小的内存占用和高效的计数性能。
- PFADD:向 HyperLogLog 中添加一个或多个元素。
```
PFADD key element [element ...]
```
- PFCOUNT:返回 HyperLogLog 的基数估计值。
```
PFCOUNT key [key ...]
```
- PFMERGE:将多个 HyperLogLog 合并为一个 HyperLogLog。
```
PFMERGE destkey sourcekey [sourcekey ...]
```
这些命令用于创建、操作和查询 HyperLogLog 数据结构。通过使用 PFADD 命令将元素添加到 HyperLogLog 中,可以估计集合中不重复元素的数量;使用 PFCOUNT 命令获取基数估计值;使用 PFMERGE 命令将多个 HyperLogLog 合并为一个新的 HyperLogLog。
需要注意的是,虽然 HyperLogLog 提供了高效的去重计数功能,但它仅提供了基数的估计值,并且随着元素数量增加,估计误差也会增加。因此,在需要精确计数的场景中,可能需要考虑其他的数据结构或算法。
GEO地理空间命令zset的子类(redis-cli --raw 解决中文乱码):
当使用Redis的Geo命令时,可以通过以下示例来说明它们的用法:
- GEOADD:
```
GEOADD cities 13.361389 38.115556 "Rome" 2.352222 48.856614 "Paris" -0.127625 51.507222 "London"
```
这个示例将三个城市以及它们的经纬度信息添加到名为"cities"的key中。
- GEODIST:
```
GEODIST cities Rome Paris km
```
这个示例计算了"Rome"和"Paris"之间的距离,并以千米为单位返回结果。
- GEOHASH:
```
GEOHASH cities London
```
这个示例获取了"London"的地理位置的Geohash值。
- GEOPOS:
```
GEOPOS cities Rome Paris London
```
这个示例获取了"Rome"、"Paris"和"London"的地理位置的经度和纬度。
- GEORADIUS:
```
GEORADIUS cities 0 0 2000 km WITHCOORD
```
这个示例在以经度0和纬度0为中心、搜索半径为2000千米范围内,返回符合条件的地理位置成员,并包含其坐标信息。
- GEORADIUSBYMEMBER:
```
GEORADIUSBYMEMBER cities London 100 km COUNT 2
```
这个示例在以"London"为中心、搜索半径为100千米范围内,返回最多两个符合条件的地理位置成员。
这些示例只是展示了Redis Geo命令的一小部分功能。根据您的需求,可以使用不同的参数组合来查询、搜索和操作地理位置数据。
redis流 stream命令:
Redis流(Stream)是Redis 5.0及更高版本中引入的一种数据结构,用于处理事件流和消息传递。以下是一些常用的Redis Stream命令:
- XADD key ID field value [field value ...]
向指定key的流中添加一个新的消息,通过ID来唯一标识。
- XLEN key
获取指定流中的消息数量。
- XRANGE key start end [COUNT count]
按照范围获取指定流中的消息。可以使用start和end参数来指定范围,并可以通过可选参数COUNT来限制返回的消息数量。
- XREVRANGE key end start [COUNT count]
按照逆序范围获取指定流中的消息。与XRANGE类似,但是返回结果按照消息ID的逆序排列。
- XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]
从一个或多个流中读取消息。可以使用可选参数COUNT来限制每个流返回的消息数量,使用BLOCK来指定阻塞时间,直到有新消息到达。
- XDEL key ID [ID ...]
删除指定流中的一个或多个消息。
- XACK key group ID [ID ...]
确认消费者已成功处理指定组中的消息,并将其从待处理的消息列表中移除。
- XGROUP CREATE key groupname id-or-$ [MKSTREAM]
创建一个消费者组,并将指定的流关联到该组。可以选择使用MKSTREAM选项来创建不存在的流。
- XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]
从消费者组中的一个或多个流中读取消息。相比于XREAD命令,XREADGROUP命令支持进行分组消费。
- XGROUP SETID key groupname id
设置消费者组的最后已经被确认处理的消息ID。这个命令主要用于恢复消费者组的状态。
- XGROUP DESTROY key groupname
删除指定的消费者组及其相关的状态信息。
- XGROUP DELCONSUMER key groupname consumer
从消费者组中移除指定的消费者,并将其相关的状态信息删除。
- XINFO STREAM key
获取有关流的相关信息,包括近似长度、第一个和最后一个消息的ID等。
- XINFO GROUPS key
获取与指定流相关的所有消费者组的信息,包括消费者组的名称、消费者数量和待处理消息数量等。
- XINFO CONSUMERS key groupname
获取指定消费者组中的所有消费者的信息,包括消费者的名称和待处理消息的数量等。
- XTRIM key MAXLEN [~] count
截断指定流中的消息,以使其最多保留指定数量的消息。可以使用~作为可选前缀,使count参数解释为相对于当前长度的增量。
这只是Redis Stream命令的一小部分,还有其他命令和选项可用。您可以参考Redis官方文档以获取更详细的信息和示例:redis.io/commands#st…