User-Profile-Image
hankin
  • 5
  • Java
  • Kotlin
  • Spring
  • Web
  • SQL
  • MegaData
  • More
  • Experience
  • Enamiĝu al vi
  • 分类
    • Zuul
    • Zookeeper
    • XML
    • WebSocket
    • Web Notes
    • Web
    • Vue
    • Thymeleaf
    • SQL Server
    • SQL Notes
    • SQL
    • SpringSecurity
    • SpringMVC
    • SpringJPA
    • SpringCloud
    • SpringBoot
    • Spring Notes
    • Spring
    • Servlet
    • Ribbon
    • Redis
    • RabbitMQ
    • Python
    • PostgreSQL
    • OAuth2
    • NOSQL
    • Netty
    • MySQL
    • MyBatis
    • More
    • MinIO
    • MegaData
    • Maven
    • LoadBalancer
    • Kotlin Notes
    • Kotlin
    • Kafka
    • jQuery
    • JavaScript
    • Java Notes
    • Java
    • Hystrix
    • Git
    • Gateway
    • Freemarker
    • Feign
    • Eureka
    • ElasticSearch
    • Docker
    • Consul
    • Ajax
    • ActiveMQ
  • 页面
    • 归档
    • 摘要
    • 杂图
    • 问题随笔
  • 友链
    • Spring Cloud Alibaba
    • Spring Cloud Alibaba - 指南
    • Spring Cloud
    • Nacos
    • Docker
    • ElasticSearch
    • Kotlin中文版
    • Kotlin易百
    • KotlinWeb3
    • KotlinNhooo
    • 前端开源搜索
    • Ktorm ORM
    • Ktorm-KSP
    • Ebean ORM
    • Maven
    • 江南一点雨
    • 江南国际站
    • 设计模式
    • 熊猫大佬
    • java学习
    • kotlin函数查询
    • Istio 服务网格
    • istio
    • Ktor 异步 Web 框架
    • PostGis
    • kuangstudy
    • 源码地图
    • it教程吧
    • Arthas-JVM调优
    • Electron
    • bugstack虫洞栈
    • github大佬宝典
    • Sa-Token
    • 前端技术胖
    • bennyhuo-Kt大佬
    • Rickiyang博客
    • 李大辉大佬博客
    • KOIN
    • SQLDelight
    • Exposed-Kt-ORM
    • Javalin—Web 框架
    • http4k—HTTP包
    • 爱威尔大佬
    • 小土豆
    • 小胖哥安全框架
    • 负雪明烛刷题
    • Kotlin-FP-Arrow
    • Lua参考手册
    • 美团文章
    • Java 全栈知识体系
    • 尼恩架构师学习
    • 现代 JavaScript 教程
    • GO相关文档
    • Go学习导航
    • GoCN社区
    • GO极客兔兔-案例
    • 讯飞星火GPT
    • Hollis博客
    • PostgreSQL德哥
    • 优质博客推荐
    • 半兽人大佬
    • 系列教程
    • PostgreSQL文章
    • 云原生资料库
    • 并发博客大佬
Help?

Please contact us on our email for need any support

Support
    首页   ›   SQL   ›   NOSQL   ›   Redis   ›   正文
Redis

Redis笔记—五种数据类型

2020-03-29 22:53:35
741  0 1
参考目录 隐藏
1) 1.String
2) String命令:
3) BIT 命令:
4) 2.List
5) 3.Set
6) 4.Hash
7) 5.ZSet
8) key 相关的命令
9) DEL 命令
10) DUMP 命令
11) EXISTS 命令
12) TTL 命令
13) EXPIRE 命令
14) PERSIST 命令
15) PEXPIRE 命令
16) PTTL 命令
17) KEYS 命令
18) 补充

阅读完需:约 9 分钟

redis 中的数据都是以 key/value 的形式存储的,五大数据类型主要是指 value 的数据类型

  1. String
  2. List
  3. Hash
  4. Set
  5. Zset

1.String

String 是 Redis 里边最最简单的一种数据结构。在 Redis 中,所有的 key 都是字符串,但是,不同的 key 对应的 value 则具备不同的数据结构,我们所说的五种不同的数据类型,主要是指 value 的数据类型不同。

Redis 中的字符串是动态字符串,内部是可以修改的,像 Java 中的 StringBuffer,它采用分配冗余空间的方式来减少内存的频繁分配。在 Redis 内部结构中,一般实际分配的内存会大于需要的内存,当字符 串小于 1M 的时候,扩容都是在现有的空间基础上加倍,扩容每次扩 1M 空间,最大 512M。

String命令:

  • set
    set 就是给一个 key 赋值的。
  • append
    使用 append 命令时,如果 key 已经存在,则直接在对应的 value 后追加值,否则就创建新的键值对。
  • decr
    可以实现对 value 的减 1 操作(前提是 value 是一个数字),如果 value 不是数字,会报错,如果 value 不存在,则会给一个默认的值为 0,在默认值的基础上减一。
  • decrby
    和 decr 类似,但是可以自己设置步长,该命令第二个参数就是步长。
  • get
    get 用来获取一个 key 的 value。
  • getrange
    getrange 可以用来返回 key 对应的 value 的子串,这有点类似于 Java 里边的 substring。这个命令第 二个和第三个参数就是截取的起始和终止位置,其中,-1 表示最后一个字符串,-2 表示倒数第二个字符 串,以此类推…
  • getset
    获取并更新某一个 key。
  • incr
    给某一个 key 的 value 自增。
  • incrby
    给某一个 key 的 value 自增,同时还可以设置步长。
  • incrbyfloat
    和 incrby 类似,但是自增的步长可以设置为浮点数。
  • mget 和 mset
    批量获取和批量存储
  • ttl
    查看 key 的有效期
  • setex
    在给 key 设置 value 的同时,还设置过期时间。
  • psetex
    和 setex 类似,只不过这里的时间单位是毫秒
  • setnx
    默认情况下, set 命令会覆盖已经存在的 key,setnx 则不会。
  • msetnx
    批量设置。
  • setrange
    覆盖一个已经存在的 key 的value
  • strlen
    查看字符串长度

BIT 命令:

在 Redis 中,字符串都是以二进制的方式来存储的。例如 set k1 a,a 对应的 ASCII 码是 97,97 转为 二进制是 01100001,BIT 相关的命令就是对二进制进行操作的。

  • getbit
    key 对应的 value 在 offset 处的 bit 值。
  • setbit
    修改 key 对应的 value 在 offset 处的 bit 值
  • bitcount
    统计二进制数据中 1 的个数。

2.List

LIST 是一个简单的字符串列表,按照插入顺序进行排序,我们可以从 LIST 的头部 (LEFT) 或者尾部 (RIGHT) 插入一个元素,也可以从 LIST 的头部(LEFT)或者尾部 (RIGHT) 弹出一个元素。

  • lpush
    lpush 表示将 value 的值从左到右依次插入表头位置。
  • lrange
    返回列表指定区间内的元素。
  • rpush
    这个和 lpush 功能基本类似,不同的是 rpush 是从右往左依次插入表头位置。
  • rpop
    移除并返回列表的尾元素。
  • lpop
    移除并返回列表的头元素。
  • lindex
    返回列表中,下标为 index 的元素。
  • ltrim
    ltrim 可以对一个列表进行修剪。
  • blpop
    阻塞式的弹出,相当于 lpop 的阻塞版。

3.Set

SET 是 String类型的无序集合,不同于 LIST ,SET 中的元素不可以重复。

  • sadd
    添加元素到一个 key 中
  • smembers
    获取一个 key 下的所有元素
  • srem
    移除指定的元素
  • sismemeber
    返回某一个成员是否在集合中
  • scard
    返回集合的数量
  • srandmember
    随机返回一个元素
  • spop
    随机返回并且出栈一个元素。
  • smove
    把一个元素从一个集合移到另一个集合中去。
  • sdiff
    返回两个集合的差集。
  • sinter
    返回两个集合的交集。
  • sdiffstore
    这个类似于 sdiff ,不同的是,计算出来的结果会保存在一个新的集合中
  • sinterstore
    类似于 sinter,只是将计算出来的交集保存到一个新的集合中。
  • sunion
    求并集。
  • sunionstore
    求并集并且将结果保存到新的集合中。

4.Hash

HASH 类似于 Java 中的 Map ,是一个键值对集合,在 redis 中可以用来存储对象。

在 hash 结构中,key 是一个字符串,value 则是一个 key/value 键值对。

  • hset
    添加值。
  • hget
    获取值
  • hmset
    批量设置
  • hmget
    批量获取
  • hdel
    删除一个指定的 field
  • hsetnx
    默认情况下,如果 key 和 field 相同,会覆盖掉已有的 value,hsetnx 则不会。
  • hvals
    获取所有的 value
  • hkeys
    获取所有的 key
  • hgetall
    同时获取所有的 key 和 value
  • hexists
    返回 field 是否存在
  • hincrby
    给指定的 value 自增
  • hincrbyfloat
    可以自增一个浮点数
  • hlen
    返回 某一个 key 中 value 的数量
  • hstrlen
    返回某一个 key 中的某一个 field 的字符串长度

5.ZSet

ZSET 和 SET 一样,也是 STRING 类型的元素的集合,不同的是 ZSET 中的每个元素都会关联一个 double 类型的分数,ZSET 中的成员都是唯一的,但是所关联的分数可以重复。

  • zadd
    将指定的元素添加到有序集合中。
  • zscore
    返回 member 的 score 值
  • zrange
    返回集合中的一组元素。
  • zrevrange
    返回一组元素,但是是倒序。
  • zcard
    返回元素个数
  • zcount
    返回 score 在某一个区间内的元素。 zrangebyscore 按照 score 的范围返回元素。
  • zrank
    返回元素的排名(从小到大
  • zrevrank
    返回元素排名(从大到小
  • zincrby
    score 自增
  • zinterstore
    给两个集合求交集。
  • zrem
    弹出一个元素
  • zlexcount
    计算有序集合中成员数量
  • zrangebylex
    返回指定区间内的成员。

key 相关的命令

由于五大数据类型的数据结构本身有差异,因此对应的命令也会不同,但是有一些命令不管对于哪种数据类型都是存在的,我们今天就先来看看这样一些特殊的命令。

DEL 命令

看到 OK 表示插入成功。通过 DEL 命令我们可以删除一个已经存在的 key,如下:

1
2
127.0.0.1:6379> DEL k1
(integer) 1

看到 (integer) 1 表示数据已经删除成功。

DUMP 命令

DUMP 命令可以序列化给定的 key,并返回序列化之后的值:

1
2
127.0.0.1:6379> DUMP k1
“\x00\x02v1\b\x00\xe6\xc8\\\xe1bI\xf3c”

EXISTS 命令

EXISTS 命令用来检测一个给定的 key 是否存在,如下:

1
2
3
4
5
127.0.0.1:6379> EXISTS k1
(integer) 1
127.0.0.1:6379> EXISTS k2
(integer) 0
127.0.0.1:6379>

上面的运行结果表示 k1 存在而 k2 不存在。

TTL 命令

TTL 命令可以查看一个给定 key 的有效时间:

1
2
3
4
127.0.0.1:6379> TTL k1
(integer) -1
127.0.0.1:6379> TTL k2
(integer) -2

-2 表示 key 不存在或者已过期;-1 表示 key 存在并且没有设置过期时间(永久有效)。当然,我们可以通过下面的命令给 key 设置一个过期时间:

EXPIRE 命令

EXPIRE 命令可以给 key 设置有效期,在有效期过后,key 会被销毁。

1
2
3
4
5
127.0.0.1:6379> EXPIRE k1 30
(integer) 1
127.0.0.1:6379> TTL k1
(integer) 25
127.0.0.1:6379>

30 表示 30 秒,TTL k1 返回 25 表示这个 key 的有效期还剩 25 秒。

PERSIST 命令

PERSIST 命令表示移除一个 key 的过期时间,这样该 key 就永远不会过期:

1
2
3
4
5
6
7
8
127.0.0.1:6379> EXPIRE k1 60
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 57
127.0.0.1:6379> PERSIST k1
(integer) 1
127.0.0.1:6379> ttl k1
(integer) -1

PEXPIRE 命令

PEXPIRE 命令的功能和 EXPIRE 命令的功能基本一致,只不过这里设置的参数是毫秒:

1
2
127.0.0.1:6379> PEXPIRE k1 60000
(integer) 1

PTTL 命令

PTTL 命令和 TTL 命令基本一致,只不过 PTTL 返回的是毫秒数:

1
2
127.0.0.1:6379> PTTL k1
(integer) 25421

KEYS 命令

KEYS 命令可以获取满足给定模式的所有 key,比如:

1
2
3
4
127.0.0.1:6379> KEYS *
1) “k3”
2) “k2”
3) “k1”

KEYS * 表示获取所有的 KEY, * 也可以是一个正则表达式。

补充

  1. 四种数据类型(list/set/zset/hash),在第一次使用时,如果容器不存在,就自动创建一个
  2. 四种数据类型(list/set/zset/hash),如果里边没有元素了,那么立即删除容器,释放内存。

更多的命令参考官方文档:

http://www.redis.cn/commands.html#

如本文“对您有用”,欢迎随意打赏作者,让我们坚持创作!

1 打赏
Enamiĝu al vi
不要为明天忧虑.因为明天自有明天的忧虑.一天的难处一天当就够了。
543文章 68评论 292点赞 582213浏览

随机文章
Java—事件驱动进行代码解耦(EventBus)
3年前
MybatisPlus—QueryWrapper、QueryChainWrapper、LambdaQueryWrapper以及LambdaQueryChainWrapper
5年前
SpringMVC—Web九大组件之ViewResolver
3年前
Kotlin-函数进阶—集合变换和序列(十七)
4年前
SpringBoot—三种跨域场景总结
4年前
博客统计
  • 日志总数:543 篇
  • 评论数目:68 条
  • 建站日期:2020-03-06
  • 运行天数:1904 天
  • 标签总数:23 个
  • 最后更新:2024-12-20
Copyright © 2025 网站备案号: 浙ICP备20017730号 身体没有灵魂是死的,信心没有行为也是死的。
主页
页面
  • 归档
  • 摘要
  • 杂图
  • 问题随笔
博主
Enamiĝu al vi
Enamiĝu al vi 管理员
To be, or not to be
543 文章 68 评论 582213 浏览
测试
测试
看板娘
赞赏作者

请通过微信、支付宝 APP 扫一扫

感谢您对作者的支持!

 支付宝 微信支付