Skip to content

Redis 使用

Redis 就是把数据存储在内存中,这样访问速度快,但是断电后数据会丢失,所以一般用于缓存

Redis 数据结构

Redis 是一个 key-value 存储系统。Redis 中有八种数据结构,分别是字符串(String),哈希(Hash),列表(List),集合(Set),有序集合(Sorted Set),GEO,HyperLogLog,Bitmap

使用最多的就是字符串(String),哈希(Hash),列表(List)

Redis 通用命令

shell
# 选择数据库
select 序号(0-16)
# 查看所有key
keys *
# 查看key是否存在
exists key
# 删除key
del key
# 设置key的过期时间 (单位秒)
expire key seconds
# 查看key的过期时间
ttl key
# 查看key的类型
type key
# 删除当前数据库全部key
flushdb
# 删除所有数据库全部key
flushall

String 结构

String 类型 就是字符串类型,是最常用的数据结构

SET

  • 添加或者修改已经存在的一个 String 类型的键值对
shell

# 设置key的值
set key value
# 设置key的值,如果key存在则不设置
setnx key value
# 设置key的值,并设置过期时间 时间秒
setex key seconds value
# 设置key的值,并设置过期时间 时间毫秒
psetex key milliseconds value

MSET

  • 设置多个 key-value
shell
# 设置多个key-value
mset key1 value1 key2 value2

MGET

  • 获取多个 key 的值
shell
# 获取多个key的值
mget key1 key2

GET

  • 获取一个 String 类型的键值对
shell
# 获取key的值
get key
# 将键key的值为value,并返回设置前的旧值,若没有旧值返回nil
getset key value
# 获取指定中间部分序号的值
getrange key start end

DEL

  • 删除一个 key-value
shell
# 删除key
del key

STRLEN

  • 获取 key 的长度
shell
# 获取key的长度
strlen key

插入

  • 如果键 key 存在并且值是⼀个字符串,则把 value 追加到现有值的末尾。

  • 返回追加 value 之后该 value 的⻓度。

  • 如果 key 不存在,则将 key 的值设置为 value。

shell
APPEND key value

偏移插入

从偏移量 offset 开始⽤ value 字符串覆盖键 key 存储的原字符串。offset 从 0 开始 返回修改后新的 value 字符串的⻓度。

shell
SETRANGE key offset value

让一个 key 值自增或自减

  • 值就是一个数字
shell
# 将key的值加1
incr key
# 将key的值减1
decr key
# 将key的值加n
incrby key n
# 将key的值减n
decrby key n

让一个 keu 值添加指定的值

shell
# 将键key存储的数字值value加上/减去⼀个increment/decrement的量。
# 若key不存在则值先初始化为0再加/减。
# 若key存储的值不能被解释为数字,则返回错误。
# 增加 指定的值
INCRBY key increment
# 减少 指定的值
DECRBY key decrement
# 将键key存储的浮点数值value加上⼀个increment的增量。
# 若key不存在则值先初始化为0再加/减。
# 若key存储的值不能被解释为数字,则返回错误。
# 增加 指定的浮点数
INCRBYFLOAT key increment

LIST 结构

List 类型 是一个数组,可以用来存储列表数据

LPUSH

  • 将一个或多个值插入到列表头部
shell
# 将一个或多个值插入到列表头部
LPUSH key value1 value2 value3 ...

LPUSHX

  • 仅当 key 存在并且是一个列表的时候才执行 LPUSH 操作
shell
LPUSHX key value1 value2 value3 ...

RPUSH

  • 将一个或多个值插入到列表尾部
shell
# 将一个或多个值插入到列表尾部
RPUSH key value1 value2 value3 ...

RPUSHX

  • 仅当 key 存在并且是一个列表的时候才执行 RPUSH 操作
shell
RPUSHX key value1 value2 value3 ...

LPOP

  • 移除并返回列表的第一个元素
shell
# 移除并返回列表的第一个元素
LPOP key

RPOP

  • 移除并返回列表的最后一个元素
shell
# 移除并返回列表的最后一个元素
RPOP key

LINDEX

  • 通过索引获取列表中的元素
shell
# 通过索引获取列表中的元素
LINDEX key index

LLEN

  • 获取列表长度
shell
# 获取列表长度
LLEN key

LREM

  • 移除列表 key 中与 element 相等的 count 个元素,返回被移除的元素的数量
shell
# 移除列表key中与element相等的count个元素,返回被移除的元素的数量
LREM key count value

LTRIM

  • 通过下标截取指定长度
shell
# 通过下标截取指定长度
LTRIM key start stop

RPOPLPUSH

  • 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
shell
# 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
RPOPLPUSH source destination

LSET

  • 通过索引设置列表元素的值
shell
# 通过索引设置列表元素的值
LSET key index value

LINSERT

  • 在列表的元素前或者后插入元素
shell
# 在列表的元素前或者后插入元素
LINSERT key BEFORE|AFTER pivot value

Hash 结构

Hash 类型 是一个哈希表,可以用来存储对象

HSET

  • 设置一个字段的值 Key 是表名,field 是属性名,value 是字段值
shell
# 设置一个字段的值
HSET key field value

HSETNX

  • 设置一个字段的值,如果字段存在则不设置
shell
# 设置一个字段的值,如果字段存在则不设置
HSETNX key field value

HMSET

  • 设置多个字段的值
shell
# 设置多个字段的值
HMSET key field1 value1 field2 value2 ...

HMGET

  • 获取多个字段的值
shell
# 获取多个字段的值
HMGET key field1 field2 ...

HGET

  • 获取一个字段的值
shell
# 获取一个字段的值
HGET key field

HGETALL

  • 获取所有字段的值
shell
# 获取所有字段的值
HGETALL key

HDEL

  • 删除一个或多个字段
shell
HDEL key field1 field2 ...

HEXISTS

  • 判断字段是否存在
shell
# 判断字段是否存在
HEXISTS key field

HLEN

  • 获取字段的数量
shell
# 获取字段的数量
HLEN key

HINCRBY

  • 对一个字段增加指定的值
shell
HINCRBY key field increment

HINCRBYFLOAT

  • 对一个字段增加指定的浮点数
shell
HINCRBYFLOAT key field increment

HKEYS

  • 获取所有字段
shell
# 获取所有字段
HKEYS key

HVALS

  • 获取所有值
shell
HVALS key

Set 结构 (了解)

Set 类型 是一个集合,可以用来存储集合数据

SADD

  • 添加一个或多个元素到集合中
shell
# 添加一个或多个元素到集合中
SADD key member1 member2 ...

SREM

  • 移除一个或多个元素
shell
SREM key member1 member2 ...

SMEMBERS

  • 获取所有元素
shell
# 获取所有元素
SMEMBERS key

SISMEMBER

  • 判断元素是否存在
shell
# 判断元素是否存在
SISMEMBER key member

SCARD

  • 获取集合的元素个数
shell
SCARD key

SPOP

  • 随机移除一个元素
shell
SPOP key

SRANDMEMBER

  • 随机获取一个元素
shell
SRANDMEMBER key

SMOVE

  • 将一个元素从一个集合移动到另一个集合
shell
SMOVE source destination member

SINTER

  • 获取差集
shell
SINTER key1 key2 ...

SUNION

  • 获取并集
shell
SUNION key1 key2 ...

SDIFF

  • 获取交集
shell
SDIFF key1 key2 ...

ZSET 结构 (了解)

ZSet 类型 是一个有序集合,可以用来存储有序数据

ZADD

  • 添加一个或多个元素到有序集合中
shell
# 添加一个或多个元素到有序集合中
ZADD key score1 member1 score2 member2 ...

ZREM

  • 移除一个或多个元素
shell
# 移除一个或多个元素
ZREM key member1 member2 ...

ZRANGE

  • 获取所有元素
shell
# 获取所有元素
ZRANGE key start stop [WITHSCORES]

ZRANGEBYSCORE

  • 获取指定分数范围内的元素
shell
# 获取指定分数范围内的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

ZREVRANGE

  • 获取所有元素,按照分数从大到小排序
shell
# 获取所有元素,按照分数从大到小排序
ZREVRANGE key start stop [WITHSCORES]

ZREVRANGEBYSCORE

  • 获取指定分数范围内的元素,按照分数从大到小排序
shell
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

ZRANK

  • 获取元素的排名
shell
# 获取元素的排名
ZRANK key member

ZREVRANK

  • 获取元素的排名,按照分数从大到小排序
shell
# 获取元素的排名,按照分数从大到小排序
ZREVRANK key member

ZSCORE

  • 获取元素的分数
shell
# 获取元素的分数
ZSCORE key member

ZINCRBY

  • 对元素的分数增加指定的值
shell
# 对元素的分数增加指定的值
ZINCRBY key increment member

ZCARD

  • 获取集合的元素个数
shell
# 获取集合的元素个数
ZCARD key

ZCOUNT

  • 获取指定分数范围内的元素个数
shell
# 获取指定分数范围内的元素个数
ZCOUNT key min max

ZREMRangeByRank

  • 移除指定排名范围内的元素
shell
# 移除指定排名范围内的元素
ZREMRANGEBYRANK key start stop

ZREMRangeByScore

  • 移除指定分数范围内的元素
shell
# 移除指定分数范围内的元素
ZREMRANGEBYSCORE key min max

ZUNIONSTORE

  • 获取并集
shell
# 获取并集
ZUNIONSTORE destination numkeys key1 key2 ...

ZINTERSTORE

  • 获取交集
shell
# 获取交集
ZINTERSTORE destination numkeys key1 key2 ...

流(Streams) (了解)

Redis Streams 是 Redis 5.0 引入的一种新的数据结构,用于处理实时数据流。它提供了一种高效的方式来处理实时数据,例如日志、事件、消息等。

XADD

  • 添加一个或多个元素到流中
shell
# 添加一个或多个元素到流中
XADD key ID * field1 value1 field2 value2 ...

XREAD

  • 从流中读取数据
shell
# 从流中读取数据
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key1 key2 ... ID1 ID2 ...

XREADGROUP

  • 从流中读取数据,并支持消费者组
shell
# 从流中读取数据,并支持消费者组
XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] STREAMS key1 key2 ... ID1 ID2 ...

XACK

  • 确认消息已经被处理
shell
# 确认消息已经被处理
XACK key group ID1 ID2 ...

XPENDING

  • 获取待处理的消息
shell
# 获取待处理的消息
XPENDING key group [start end count]

XDEL

  • 删除一个或多个元素
shell
# 删除一个或多个元素
XDEL key ID1 ID2 ...

XTRIM

  • 修剪流中的元素
shell
# 修剪流中的元素
XTRIM key MAXLEN count

XINFO

  • 获取流的信息
shell
# 获取流的信息
XINFO STREAM key

XINFO GROUPS

  • 获取消费者组的信息
shell
# 获取消费者组的信息
XINFO GROUPS key

XINFO CONSUMERS

  • 获取消费者组中的消费者信息
shell
# 获取消费者组中的消费者信息
XINFO CONSUMERS key group

位图(Bitmaps) (了解)

Redis 提供了位图数据结构,可以用来存储二进制数据。位图是一种紧凑的数据结构,可以用来表示布尔值、计数器等。

SETBIT

  • 设置一个位的值
shell
# 设置一个位的值
SETBIT key offset value

GETBIT

  • 获取一个位的值
shell
GETBIT key offset

BITCOUNT

  • 统计位图中 1 的个数
shell
# 统计位图中1的个数
BITCOUNT key [start end]

BITOP

  • 对多个位图进行位运算
shell
# 对多个位图进行位运算
BITOP operation destkey key1 key2 ...

BITPOS

  • 获取位图中第一个 0 或 1 的位置
shell
# 获取位图中第一个0或1的位置
BITPOS key bit [start end]

HyperLogLog (了解)

Redis 提供了 HyperLogLog 数据结构,可以用来进行基数统计。基数统计是指统计一个集合中不重复的元素个数。

PFADD

  • 添加一个或多个元素到 HyperLogLog 中
shell
# 添加一个或多个元素到 HyperLogLog 中
PFADD key element1 element2 ...

PFCOUNT

  • 获取 HyperLogLog 中的元素个数
shell
# 获取 HyperLogLog 中的元素个数
PFCOUNT key1 key2 ...

PFMERGE

  • 合并多个 HyperLogLog
shell
# 合并多个 HyperLogLog
PFMERGE destkey sourcekey1 sourcekey2 ...

地理位置(Geospatial) (了解)

Redis 提供了地理位置数据结构,可以用来存储地理位置信息,并进行地理位置相关的操作。

GEOADD

  • 添加一个或多个地理位置信息
shell
# 添加一个或多个地理位置信息
GEOADD key longitude latitude member [longitude latitude member ...]

GEOPOS

  • 获取一个或多个地理位置信息
shell
GEOPOS key member [member ...]

GEODIST

  • 获取两个地理位置之间的距离
shell
# 获取两个地理位置之间的距离
GEODIST key member1 member2 [unit]

GEORADIUS

  • 获取指定范围内的地理位置信息
shell
# 获取指定范围内的地理位置信息
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

GEORADIUSBYMEMBER

  • 获取指定范围内的地理位置信息,以某个成员为中心
shell
# 获取指定范围内的地理位置信息,以某个成员为中心
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

GEOHASH

  • 获取地理位置的 geohash 值
shell
# 获取地理位置的 geohash 值
GEOHASH key member [member ...]

位域(Bitfields) (了解)

BITFIELD 是 Redis 5.0 引入的一种新的数据结构,可以用来存储位域数据。位域是一种紧凑的数据结构,可以用来表示布尔值、计数器等。

BITFIELD

  • 对位域进行操作
shell
# 对位域进行操作
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]

BITFIELD_RO

  • 对位域进行只读操作
shell
# 对位域进行只读操作
BITFIELD_RO key [GET type offset] [GET type offset]

Redis 事务

Redis 事务是一组命令的集合,可以保证这些命令在执行时不会被其他命令打断。Redis 事务提供了一种原子性的操作方式,可以用来保证数据的一致性。

MULTI

  • 开始一个事务
shell
# 开始一个事务
MULTI

EXEC

  • 执行事务中的命令
shell
# 执行事务中的命令
EXEC

DISCARD

  • 放弃事务中的命令
shell
# 放弃事务中的命令
DISCARD

WATCH

  • 监视一个或多个键,如果在事务执行之前这些键的值发生了变化,那么事务将被放弃
shell
# 监视一个或多个键,如果在事务执行之前这些键的值发生了变化,那么事务将被放弃
WATCH key1 key2 ...

UNWATCH

  • 取消对键的监视
shell
UNWATCH key1 key2 ...

实例

shell
# 客户端1先执行
127.0.0.1:6379> watch k1
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 100
QUEUED
127.0.0.1:6379> set k2 1000
QUEUED
# 只是入队列,但是不提交事务执行

# 客户端2后执行
127.0.0.1:6379> set k1 200
OK

# 客户端1再执行
127.0.0.1:6379> EXEC
(nil)
127.0.0.1:6379> get k1
"200"
127.0.0.1:6379> get k2
(nil)
# 此时说明事务已经被取消了,这次提交的所有命令都没有执行