Redis的五个基本类型(2)

Redis 的五个基本类型

Redis-key
命令 说明
SET 设置 key
GET 查看 key 的值
EXPIRE 设置 key 的过期时间
TTL 查看 key 剩余的时间
EXISTS 判断当前的 key 是否存在
KEYS * 查看当前所有的 key
DEL key 删除当前的 key
TYPE 查看 key 存储的 value 的类型
字符串 string
set get

设置值和获取值:

  • 格式:set key valueget key

    127.0.0.1:6379> set key1 v1 #设置值
    OK
    127.0.0.1:6379> get key1 #获得值
    "v1"

exists

判断 key 是否存在,格式:exists key

复制代码
127.0.0.1:6379> EXISTS key1  #判断key是否存在
(integer) 1
append

追加字符串,如果 key 不存在,相当于 set 命令,格式:append key value

复制代码
127.0.0.1:6379> APPEND key1 hello  #追加字符串,如果当前key不存在,相当于set命名
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
strlen

获取字符串的长度,格式:strlen key

复制代码
127.0.0.1:6379> STRLEN key1  #获得字符串的长度
(integer) 7
127.0.0.1:6379> append key1 wang
(integer) 11
127.0.0.1:6379> strlen key1
(integer) 11
127.0.0.1:6379> get key1
"v1hellowang"
incr decr

对 value 进行自增 1 和自减 1 操作,格式:incr keydecr key

复制代码
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> INCR views  # i++操作
(integer) 1
127.0.0.1:6379> INCR views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> DECR views  # i--操作
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> DECR views
(integer) 0
127.0.0.1:6379> get views
"0"
incrby decrby

设置加减的步长,格式:incrby key numdecrby key num

复制代码
127.0.0.1:6379> INCRBY views 10  # 设置自增的步长
(integer) 10
127.0.0.1:6379> INCRBY views 10
(integer) 20
127.0.0.1:6379> get views
"20"
127.0.0.1:6379> DECRBY views 5   # 设置自减的步长
(integer) 15
127.0.0.1:6379> DECRBY views 5
(integer) 10
127.0.0.1:6379> get views
"10"
getrange

获取给定范围的字符串值,格式:getrange key start stop

复制代码
127.0.0.1:6379> set key1 hello,wang
OK
127.0.0.1:6379> get key1
"hello,wang"
127.0.0.1:6379> GETRANGE key1 0 3  # 查看给定范围的字符串
"hell"
127.0.0.1:6379> GETRANGE key1 0 -1  # 类似于 get 命令,查看所有的字符串
"hello,wang"
setrange

从指定位置开始替换字符串的值,格式:setrange key offset value

复制代码
127.0.0.1:6379> GETRANGE key1 0 -1
"hello,wang"
127.0.0.1:6379> SETRANGE key1 2 xxx  # 替换指定位置开始的字符串
(integer) 10
127.0.0.1:6379> GETRANGE key1 0 -1
"hexxx,wang"
setex ttl

设置过期时间,查看剩余时间,格式:setex key seconds valuettl key

复制代码
127.0.0.1:6379> setex key2 30 v2
OK
127.0.0.1:6379> TTL key2
(integer) 21
127.0.0.1:6379> TTL key2
(integer) 20
127.0.0.1:6379> TTL key2
(integer) 18
setnx

如果 key 不存在则设置,负责失败,格式:setnx key value

复制代码
#setnx 如果当前值不存在,则设置(在分布式锁中经常使用)
127.0.0.1:6379> setnx mykey redis  #如果值不存在,则创建成功
OK
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379> setnx mykey mongodb  #如果值存在,则创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"
mset mget

同时设置或者获取多个值,格式:mset key1 value1 key2 value2 ...mget key1 key2...

复制代码
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> mset key1 v1 key2 v2 key3 v3  #同时设置多个值
OK
127.0.0.1:6379> keys *
1) "key3"
2) "key2"
3) "key1"
127.0.0.1:6379> mget key1 key2 key3  #同时获取多个值
1) "v1"
2) "v2"
3) "v3"
getset

先 get 再 set,如果不存在,则返回 nil;如果存在,获取原来的值,并设置新的值

复制代码
#getset 先get在set
127.0.0.1:6379> getset db redis  #如果不存在,则返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb #如果存在,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"
小结

String 类似的使用场景:value 除了是字符串也可以是数字!

  • 计数器
  • 统计多单位的数量
  • 对象缓存存储

列表 list

在 Redis 中,我们可以把 list 完成栈、队列、阻塞队列。

所有的 list 命令都是用 l 开头的。

lpush rpush lrange

从 list 的左边或者右边插入值,格式:lpush key valuerpush key valuelrange 获取指定范围的值,格式:lrange key start stop

复制代码
127.0.0.1:6379> LPUSH list one     # 将一个值或者多个值,插入到列表头部(左)
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1  # 获取 list 中的值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LRANGE list 0 1    # 通过区间获取具体的值
1) "three"
2) "two"
127.0.0.1:6379> RPUSH list right   # 将一个值或者多个值,插入到列表尾部(右)
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
lpop rpop

从列表的左边或者右边移除值,格式:lpop keyrpop key

复制代码
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> LPOP list  #移除 list 的第一个元素
"three"
127.0.0.1:6379> RPOP list  #移除 list 的最后一个元素
"right"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
lindex

获取指定下标的值,格式:lindex key index

复制代码
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LINDEX list 0 #通过下标获取一个值
"two"
127.0.0.1:6379> LINDEX list 1
"one"
llen

获取列表中的元素个数,格式:llen key

复制代码
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LLEN list
(integer) 2
ltrim

通过下标截取指定的长度,这个 list 已经改变了,截断了只剩下截取的元素,格式:ltrim key start stop

复制代码
127.0.0.1:6379> LPUSH list hello hellol hello2 hello3
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "hello3"
2) "hello2"
3) "hellol"
4) "hello"
127.0.0.1:6379> LTRIM list 1 2  # 通过下标截取指定的长度,这个 list 已经改变了,截断了只剩下截取的元素!
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "hello2"
2) "hellol"
rpoplpush

移除列表中最后一个元素,将它添加到另一个列表中,格式:rpoplpush key1 key2

复制代码
127.0.0.1:6379> LRANGE list 0 -1
1) "hello2"
2) "hellol"
127.0.0.1:6379> RPOPLPUSH list list2  # 移除列表的最后一个元素,将它移动到新的列表中
"hellol"
127.0.0.1:6379> LRANGE list 0 -1     # 查看原来的列表
1) "hello2"
127.0.0.1:6379> LRANGE list2 0 -1    # 查看目标列表,确实存在该值
1) "hellol"
lset

根据下标替换列表中的值,格式:lset key index value

复制代码
#LSET 将列表中指定下标的值替换为另外一个值,相当于更新操作
127.0.0.1:6379> LRANGE list 0 -1
1) "hello2"
127.0.0.1:6379> LSET list 0 world # 将0号下标的值替换为world
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "world"
127.0.0.1:6379> LSET list 1 other  # 修改不存在的下标,报错
(error) ERR index out of range
linsert

在列表中插入值,格式:linsert key before|after value new_value

复制代码
#LINSERT 将某个具体的value插入到列表中某个值的前面或后面
127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> LINSERT list before world other
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> LINSERT list after world "new"
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"
小结
  • 他实际上是一个链表,before or after, left, right 都可以插入值
  • 如果 key 不存在,创建新的链表
  • 如果 key 存在,新增内容
  • 如果移除了所有的值,空链表,也代表不存在
  • 在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点

队列LPOP RPUSH
LPOP LPUSH

集合 set

set 中的值是不能重复的。

sadd

给 set 中添加值,格式:sadd key value1 value2 ...

复制代码
127.0.0.1:6379> sadd myset hello  #set集合中添加值
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 1
127.0.0.1:6379> sadd myset wang
(integer) 1
127.0.0.1:6379> sadd myset hello  #设置重复值时,失败
(integer) 0
smembers

获取 set 中的所有值,格式:smembers key

复制代码
127.0.0.1:6379> SMEMBERS myset  #获取set的所有值
1) "hello"
2) "world"
3) "wang"

哈希 hash

可以将哈希看成是一个 Map 集合,key-value 中的 value 是一个 map 集合。

hset hget

设置或者获取一个 hash 的值:

  • 格式:hset key field1 value1hget key field

    127.0.0.1:6379> hset myhash field1 wang #设置一个hash的值
    (integer) 1
    127.0.0.1:6379> hget myhash field1 #获取一个hash的值
    "wang"

hmset hmget

设置或者获取 hash 的值(多个字段):

  • 格式:hmset key field1 value1 field2 value2 ...hmget key field1 field2...

    127.0.0.1:6379> hmset myhash field2 chen field3 hello #同时设置多个hash的值
    OK
    127.0.0.1:6379> hmget myhash field1 field2 field3 #同时获取多个hash值

    1. "wang"
    2. "chen"
    3. "hello"
hgetall

获取 hash 中的所有值:

复制代码
127.0.0.1:6379> hgetall myhash  #获取hash中的所有的键值对
1) "field1"
2) "wang"
3) "field2"
4) "chen"
5) "field3"
6) "hello"
hdel

删除指定 field 的 hash 键值对:

  • 格式:hdel key field

    127.0.0.1:6379> hdel myhash field2 #删除指定的hash值,对应的value值也就删除了
    (integer) 1
    127.0.0.1:6379> hgetall myhash

    1. "field1"
    2. "wang"
    3. "field3"
    4. "hello"
hlen

获取 hash 的键值对的个数:

  • 格式:hlen key

    127.0.0.1:6379> hgetall myhash

    1. "field1"
    2. "wang"
    3. "field3"
    4. "hello"
      127.0.0.1:6379> hlen myhash #获取hash的键值对的个数
      (integer) 2
hexists

判断 hash 中的字段是否存在:

  • 格式:hexists key field

    127.0.0.1:6379> hgetall myhash

    1. "field1"
    2. "wang"
    3. "field3"
    4. "hello"
      127.0.0.1:6379> HEXISTS myhash field1 #判断hash中指定的字段是否存在
      (integer) 1
      127.0.0.1:6379> HEXISTS myhash field2
      (integer) 0
      127.0.0.1:6379> HEXISTS myhash field3
      (integer) 1
hkeys hvals

获取 hash 中所有的字段或者值:

  • 格式:hkeys keyhvals

    127.0.0.1:6379> hkeys myhash #获取hash中所有的字段

    1. "field1"
    2. "field3"
      127.0.0.1:6379> hvals myhash #获取hash中所有的值
    3. "wang"
    4. "hello"
hincrby

给 hash 中指定字段的值加上一个增量:

复制代码
127.0.0.1:6379> hset myhash field4 5
(integer) 1
127.0.0.1:6379> HINCRBY myhash field4 2  #给hash的值一个增量
(integer) 7
127.0.0.1:6379> HINCRBY myhash field4 -1 #给hash的值一个减量
(integer) 6
hsetnx

如果不存在,则添加;如果存在,则失败:

  • 格式:hsetnx key field value

    127.0.0.1:6379> hkeys myhash

    1. "field1"
    2. "field3"
    3. "field4"
      127.0.0.1:6379> hsetnx myhash field5 zhang #如果不存在,则添加
      (integer) 1
      127.0.0.1:6379> hsetnx myhash field5 yang #如果存在,则不能添加
      (integer) 0
hash 的应用

hash 中存储经常变更的值(比如用户信息:user: name-value, age-value, sex-value),更适合对象的存储;而 String 更适合字符串存储。


有序集合 zset

有序集合 zset 中的元素带有 分数(score),可按分数排序。

zadd

添加一个值(可批量添加):

  • 格式:zadd key scores value

    127.0.0.1:6379> zadd myset 1 wang #添加一个值
    (integer) 1
    127.0.0.1:6379> zadd myset 2 yang 3 zhang #添加多个值
    (integer) 2

zrange

获取 zset 中一个范围的值:

  • 格式:zrange key start stop

    127.0.0.1:6379> ZRANGE myset 0 -1 #获取zset中的所有元素

    1. "wang"
    2. "yang"
    3. "zhang"
zrangebyscore

zset 中的值按照 score 从小到大排序输出:

  • 格式:zrangebyscore key min max

    127.0.0.1:6379> ZRANGEBYSCORE myset -inf +inf #按照从小到大排序

    1. "wang"
    2. "yang"
    3. "zhang"
      127.0.0.1:6379> ZRANGEBYSCORE myset -inf +inf withscores #排序并显示scores
    4. "wang"
    5. "1"
    6. "yang"
    7. "2"
    8. "zhang"
    9. "3"
zrem

移除 zset 中指定的元素:

  • 格式:zrem key value

    127.0.0.1:6379> ZRANGE myset 0 -1

    1. "wang"
    2. "yang"
    3. "zhang"
      127.0.0.1:6379> zrem myset yang #移除zset中指定的元素
      (integer) 1
      127.0.0.1:6379> zrange myset 0 -1
    4. "wang"
    5. "zhang"
zcard

查看 zset 中的元素个数:

  • 格式:zcard key

    127.0.0.1:6379> ZRANGE myset 0 -1

    1. "wang"
    2. "yang"
    3. "zhang"
      127.0.0.1:6379> ZCARD myset #查看set中有几个元素
      (integer) 3

根据 score 的值统计在给定区间的元素个数:

  • 格式:zcount key min max

    127.0.0.1:6379> zrange myset 0 -1

    1. "yang"
    2. "zhang"
    3. "wang"
      127.0.0.1:6379> zcount myset 1 3 #统计scores在1 到 3 区间内元素的个数
      (integer) 3
      127.0.0.1:6379> zcount myset 1 2 #统计scores在1 到 2 区间内元素的个数
      (integer) 2
相关推荐
lhxcc_fly2 小时前
Mysql系列--9、事务
数据库·mysql·事务
Narutolxy4 小时前
DMZ层Nginx TLS 终止与安全接入配置实战20250829
redis·nginx·安全
冰糖雪梨dd4 小时前
SQL注入
数据库·sql
XYiFfang5 小时前
【mysql】SQL 中 IS 与 = 的区别:一个 NULL 值引发的思考
数据库·sql·mysql
one year.6 小时前
MySQL表的约束
数据库·mysql
only_Klein7 小时前
mysql双机热备(主主模式)
数据库·mysql·adb
三贝7 小时前
Java面试实战:Spring Boot微服务在电商场景的技术深度解析
spring boot·redis·微服务·分布式事务·java面试·电商系统·技术面试
共享家95278 小时前
MySQL-内置函数
数据库·mysql
得意霄尽欢8 小时前
MySQL底层数据结构与算法浅析
数据库·mysql