redis十大类型命令之经典白学

103 阅读13分钟

什么是redis?

基于k v键值对的内存数据库,配备持久化的磁盘

 String ,bitmap ,bigfield ,hash, list set ,sorted set,stream,geospatial地理空间,hyperloglog基数统计

  1. string 二进制安全的
  2. list string类型字符串列表 双端链表 左右头尾都可以添加元素
  3. hash 一个field一个value
  4. set string类型的无序集合,无重复  intset  hashtable  时间复杂度o1
  5. zset 可排序集合,不同的每个元素都会关联一个double类型的分数
  6. geo 存储地理坐标  经纬度信息
  7. hyperloglog 基数(不重复的数字)统计算法
  8. bitmap 位图 由0 1 状态表现的二进制位的bit数组  
  9. bitfield  比特位域
  10. stream   流  主要用于redis的发布订阅  实现消息队列功能  类似  消息中间件

为什么需要redis?

分布式缓存,挡在mysql前的带刀护卫,所有查询先去查redis,没有再去查mysql,然后将数据再写进redis

 redis可以将数据写进硬盘同时不影响服务(持久化)   redis和mysql不是竞争关系,他们是配合使用

redis有几种模式?

  • 单机
  • 主从
  • 哨兵
  • 集群

redis缓存存在的问题?

  • 穿透
  • 击穿
  • 雪崩

redis分布式锁?

redis队列 

redis优势?

  • 性能极高速度快
  • 持久化
  • 数据类型丰富  list set zset hash string
  • 支持数据库备份 maset-slave

redis常见数据类型的操作命令?

(key)相关的操作命令:

  1. SET key value:设置指定键的值。

  2. GET key:获取指定键的值。

  3. DEL key:删除指定键及其对应的值。

  4. EXISTS key:检查指定键是否存在。

  5. KEYS pattern:返回匹配给定模式的所有键。

  6. EXPIRE key seconds:设置键的过期时间,以秒为单位。

  7. TTL key:获取键的剩余生存时间(Time To Live)。

  8. PERSIST key:移除键的过期时间,使其永久保存。

  9. TYPE key:返回键的数据类型。

  10. INCR key:将键的值递增1。

  11. DECR key:将键的值递减1。

  12. INCRBY key increment:将键的值递增指定的增量。

  13. DECRBY key decrement:将键的值递减指定的减量。

  14. APPEND key value:将值追加到键的当前值的末尾。

  15. STRLEN key:返回键对应值的长度。

"SET key value" 

  1. EX seconds:设置键的过期时间,以秒为单位。当使用该参数时,键将在指定的秒数后自动过期。如果值被替换,将不会过期(默认的)

  2. PX milliseconds:设置键的过期时间,以毫秒为单位。与 EX 参数类似,但时间精度更高。

  3. NX:仅在键不存在时设置键的值。如果键已存在,则不执行任何操作。

  4. XX:仅在键已经存在时设置键的值。如果键不存在,则不执行任何操作。

5.keepttl :设置键的过期时间,以秒为单位,如果值被替换 ,过期时间会续接

这些可选参数的作用如下:

  • 过期时间参数(EX 和 PX)允许在设置键时指定一个持续时间,使键在一定时间后自动过期并被删除。可以根据具体的需求设置合适的过期时间,以便控制键的生命周期。

  • NX 和 XX 参数用于控制 SET 操作的条件。NX 表示仅在键不存在时才设置键的值,用于实现分布式锁等场景。XX 表示仅在键已经存在时才设置键的值,用于更新已有键的值。

示例用法:


SET key value EX 3600      # 设置键的值,并将过期时间设置为 3600SET 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)相关的命令用于对存储在集合中的元素进行操作。以下是常用的集合命令:

  1. SADD:向集合中添加一个或多个元素。

   ```

   SADD key member [member ...]

   ```

  1. SMEMBERS:返回集合中的所有成员。

   ```

   SMEMBERS key

   ```

  1. SCARD:返回集合中的成员数量。

   ```

   SCARD key

   ```

  1. SISMEMBER:判断指定成员是否存在于集合中。

   ```

   SISMEMBER key member

   ```

  1. SREM:从集合中移除一个或多个成员。

   ```

   SREM key member [member ...]

   ```

  1. SPOP:随机移除并返回集合中的一个元素。

   ```

   SPOP key [count]

   ```

  1. SRANDMEMBER:随机返回集合中的一个或多个元素。

   ```

   SRANDMEMBER key [count]

   ```

  1. SINTER:返回给定集合之间的交集。

   ```

   SINTER key [key ...]

   ```

  1. SUNION:返回给定集合之间的并集。

   ```

   SUNION key [key ...]

   ```

  1. SDIFF:返回给定集合之间的差集。

    ```

    SDIFF key [key ...]

    ```

  1. SMOVE:将指定成员从一个集合移动到另一个集合。

    ```

    SMOVE source destination member

    ```

应用场景:猜你喜欢 ,可能认识的人,微信抽奖小程序,微信好友点赞展示

zset命令:

在 Redis 中,ZSET(有序集合,Sorted Set)是一种特殊类型的数据结构,它与普通的集合不同之处在于,每个集合成员都关联着一个分数(score),并且集合成员按照分数从小到大排序。以下是常用的有序集合命令:

  1. ZADD:向有序集合中添加一个或多个成员,以及对应的分数。

   ```

   ZADD key score member [score member ...]

   ```

  1. ZRANGE:返回有序集合中指定范围内的成员,按照分数从小到大排序。

   ```

   ZRANGE key start stop [WITHSCORES]

   ```

  1. ZREVRANGE:返回有序集合中指定范围内的成员,按照分数从大到小排序。

   ```

   ZREVRANGE key start stop [WITHSCORES]

   ```

  1. ZRANK:返回有序集合中指定成员的排名,按照分数从小到大排序(排名从 0 开始)。

   ```

   ZRANK key member

   ```

  1. ZREVRANK:返回有序集合中指定成员的排名,按照分数从大到小排序(排名从 0 开始)。

   ```

   ZREVRANK key member

   ```

  1. ZSCORE:返回有序集合中指定成员的分数。

   ```

   ZSCORE key member

   ```

  1. ZREM:从有序集合中移除一个或多个成员。

   ```

   ZREM key member [member ...]

   ```

  1. ZCOUNT:返回有序集合中指定分数范围内的成员数量。

   ```

   ZCOUNT key min max

   ```

  1. ZINCRBY:将指定成员的分数增加指定的增量值。

   ```

   ZINCRBY key increment member

   ```

这些命令可以用于向有序集合中添加、删除、查询成员,以及根据分数进行范围查询等操作。通过利用有序集合的特性,可以实现一些高级的数据结构和算法,例如排行榜、计数器等。

bitmap命令:

在 Redis 中,BITMAP 是一种位图数据结构,它将指定的键(key)映射为一个由二进制位(bit)组成的数组,并提供了一些位操作命令

  1. SETBIT:设置位图中指定偏移量上的位值。

   ```

   SETBIT key offset value

   ```

  1. GETBIT:获取位图中指定偏移量上的位值。

   ```

   GETBIT key offset

   ```

  1. BITCOUNT:计算位图中指定范围内的位值为 1 的个数。

   ```

   BITCOUNT key [start end]

   ```

  1. BITOP:对多个位图执行逻辑操作,将结果保存到目标位图中。

   ```

   BITOP operation destkey key [key ...]

   ```

   - operation 可以是 AND、OR、XOR、NOT 等操作符。

   - destkey 是存放操作结果的目标位图。

   - key 是需要进行操作的源位图。

  1. BITPOS:查找位图中第一个设置为给定值的位的偏移量。

   ```

   BITPOS key bit [start] [end]

   ```

   - bit 可以是 0 或者 1。

   - startend 是查询位的起始和结束偏移量范围。

  1. 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 是一种基数估计算法,用于统计元素的去重数量。它通过使用固定长度的数据结构来估算输入集合的基数,并且具有很小的内存占用和高效的计数性能。

  1. PFADD:向 HyperLogLog 中添加一个或多个元素。

   ```

   PFADD key element [element ...]

   ```

  1. PFCOUNT:返回 HyperLogLog 的基数估计值。

   ```

   PFCOUNT key [key ...]

   ```

  1. PFMERGE:将多个 HyperLogLog 合并为一个 HyperLogLog。

   ```

   PFMERGE destkey sourcekey [sourcekey ...]

   ```

这些命令用于创建、操作和查询 HyperLogLog 数据结构。通过使用 PFADD 命令将元素添加到 HyperLogLog 中,可以估计集合中不重复元素的数量;使用 PFCOUNT 命令获取基数估计值;使用 PFMERGE 命令将多个 HyperLogLog 合并为一个新的 HyperLogLog。

需要注意的是,虽然 HyperLogLog 提供了高效的去重计数功能,但它仅提供了基数的估计值,并且随着元素数量增加,估计误差也会增加。因此,在需要精确计数的场景中,可能需要考虑其他的数据结构或算法。

GEO地理空间命令zset的子类(redis-cli --raw  解决中文乱码):

当使用Redis的Geo命令时,可以通过以下示例来说明它们的用法:

  1. GEOADD:

   ```

   GEOADD cities 13.361389 38.115556 "Rome" 2.352222 48.856614 "Paris" -0.127625 51.507222 "London"

   ```

   这个示例将三个城市以及它们的经纬度信息添加到名为"cities"的key中。

  1. GEODIST:

   ```

   GEODIST cities Rome Paris km

   ```

   这个示例计算了"Rome"和"Paris"之间的距离,并以千米为单位返回结果。

  1. GEOHASH:

   ```

   GEOHASH cities London

   ```

   这个示例获取了"London"的地理位置的Geohash值。

  1. GEOPOS:

   ```

   GEOPOS cities Rome Paris London

   ```

   这个示例获取了"Rome"、"Paris"和"London"的地理位置的经度和纬度。

  1. GEORADIUS:

   ```

   GEORADIUS cities 0 0 2000 km WITHCOORD

   ```

   这个示例在以经度0和纬度0为中心、搜索半径为2000千米范围内,返回符合条件的地理位置成员,并包含其坐标信息。

  1. GEORADIUSBYMEMBER:

   ```

   GEORADIUSBYMEMBER cities London 100 km COUNT 2

   ```

   这个示例在以"London"为中心、搜索半径为100千米范围内,返回最多两个符合条件的地理位置成员。

这些示例只是展示了Redis Geo命令的一小部分功能。根据您的需求,可以使用不同的参数组合来查询、搜索和操作地理位置数据。

redis流 stream命令:

Redis流(Stream)是Redis 5.0及更高版本中引入的一种数据结构,用于处理事件流和消息传递。以下是一些常用的Redis Stream命令:

  1. XADD key ID field value [field value ...]

   向指定key的流中添加一个新的消息,通过ID来唯一标识。

  1. XLEN key

   获取指定流中的消息数量。

  1. XRANGE key start end [COUNT count]

   按照范围获取指定流中的消息。可以使用startend参数来指定范围,并可以通过可选参数COUNT来限制返回的消息数量。

  1. XREVRANGE key end start [COUNT count]

   按照逆序范围获取指定流中的消息。与XRANGE类似,但是返回结果按照消息ID的逆序排列。

  1. XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]

   从一个或多个流中读取消息。可以使用可选参数COUNT来限制每个流返回的消息数量,使用BLOCK来指定阻塞时间,直到有新消息到达。

  1. XDEL key ID [ID ...]

   删除指定流中的一个或多个消息。

  1. XACK key group ID [ID ...]

   确认消费者已成功处理指定组中的消息,并将其从待处理的消息列表中移除。

  1. XGROUP CREATE key groupname id-or-$ [MKSTREAM]

   创建一个消费者组,并将指定的流关联到该组。可以选择使用MKSTREAM选项来创建不存在的流。

  1. XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]

   从消费者组中的一个或多个流中读取消息。相比于XREAD命令,XREADGROUP命令支持进行分组消费。

  1. XGROUP SETID key groupname id

    设置消费者组的最后已经被确认处理的消息ID。这个命令主要用于恢复消费者组的状态。

  1. XGROUP DESTROY key groupname

    删除指定的消费者组及其相关的状态信息。

  1. XGROUP DELCONSUMER key groupname consumer

    从消费者组中移除指定的消费者,并将其相关的状态信息删除。

  1. XINFO STREAM key

    获取有关流的相关信息,包括近似长度、第一个和最后一个消息的ID等。

  1. XINFO GROUPS key

    获取与指定流相关的所有消费者组的信息,包括消费者组的名称、消费者数量和待处理消息数量等。

  1. XINFO CONSUMERS key groupname

    获取指定消费者组中的所有消费者的信息,包括消费者的名称和待处理消息的数量等。

  1. XTRIM key MAXLEN [~] count

    截断指定流中的消息,以使其最多保留指定数量的消息。可以使用~作为可选前缀,使count参数解释为相对于当前长度的增量。

这只是Redis Stream命令的一小部分,还有其他命令和选项可用。您可以参考Redis官方文档以获取更详细的信息和示例:redis.io/commands#st…