当前位置: 首页 > news >正文

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 value 、get 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 key 、decr 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 num 、decrby 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 value 、ttl 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 value 、rpush key value ;lrange 获取指定范围的值,格式: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 key 、rpop 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 afterleftright 都可以插入值
  • 如果 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 value1 、hget 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 key 、hvals
127.0.0.1:6379> hkeys myhash  #获取hash中所有的字段
1) "field1"
2) "field3"
127.0.0.1:6379> hvals myhash  #获取hash中所有的值
1) "wang"
2) "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
1) "wang"
2) "1"
3) "yang"
4) "2"
5) "zhang"
6) "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
1) "wang"
2) "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

http://www.dtcms.com/a/320123.html

相关文章:

  • 单页面应用(SPA)和多页面应用(MPA)
  • RP2040下的I2S Slave Out,PIO状态机(三)
  • pybind11 的应用
  • (Python)Python爬虫入门教程:从零开始学习网页抓取(爬虫教学)(Python教学)
  • 腾讯iOA技术指南:实现数据防泄漏与高级威胁防护
  • Spark Memory 内存设计的核心组件、对比Flink内存配置
  • langchain入门笔记02:几个实际应用
  • 生信分析进阶16 - 可准确有效地检测血浆 ccf-mtDNA 突变的分析方法
  • DrissionPage实战案例:小红书旅游数据爬取
  • 串口转ADC/PWM 串口转I2C 串口转GPIO工具
  • c++20--std::format
  • 工业相机使用 YOLOv8深度学习模型 及 OpenCV 实现目标检测简单介绍
  • 计算机视觉CS231n学习(4)
  • jmeter要如何做接口测试?
  • python源码是如何运行起来的
  • HTTPS是如何确保网站安全性的?
  • 【Apache Olingo】全面深入分析报告-OData
  • 使用Ollama本地部署DeepSeek、GPT等大模型
  • C++模拟法超超超详细指南
  • 连续最高天数的销售额(动态规划)
  • 如何让keil编译生成bin文件与反汇编文件?
  • 机器学习:线性回归
  • Win10桌面从默认C盘改到D盘
  • 小红书开源多模态视觉语言模型DOTS-VLM1
  • 深入剖析React框架原理:从虚拟DOM到Fiber架构
  • PCA9541调试记录
  • 软考中级【网络工程师】第6版教材 第2章 数据通信基础(下)
  • ansible 操作家族(ansible_os_family)信息
  • 网页中 MetaMask 钱包钱包交互核心功能详解
  • Redis缓存数据库深度剖析