📓
Be a Javaer
  • Introduction
  • 第 1 章 Java编程开发入门
    • 第 1 节 Java开发准备
    • 第 2 节 Java基本概念
    • 第 3 节 Java数据类型划分
    • 第 4 节 Java运算符
    • 第 5 节 Java程序逻辑控制
    • 第 6 节 Java方法的定义及使用
  • 第 2 章 Java面向对象编程
    • 第 1 节 类与对象
    • 第 2 节 深入分析类与对象
    • 第 3 节 数组的定义与使用
    • 第 4 节 String类的基本概念
    • 第 5 节 String类的常用方法
    • 第 6 节 this关键字
    • 第 7 节 引用传递
    • 第 8 节 数据表与简单Java类映射
    • 第 9 节 对象比较
    • 第 10 节 static关键字
    • 第 11 节 代码块
    • 第 12 节 内部类
    • 第 13 节 链表的定义与使用
    • 第 14 节 继承性
    • 第 15 节 覆写
    • 第 16 节 数组操作
    • 第 17 节 辅助概念
      • final关键字
      • 多态性
    • 第 18 节 抽象类的定义及使用
    • 第 19 节 接口的定义及使用
    • 第 20 节 Object类
    • 第 21 节 拓展概念
      • 匿名内部类
      • 包装类
    • 第 22 节 包的定义及使用
    • 第 23 节 访问控制权限
      • 单例设计模式
      • 多例设计模式
    • 第 24 节 异常的捕获及处理
    • 第 25 节 Java5新特性
      • 可变参数
      • foreach循环
      • 静态导入
    • 第 26 节 泛型
    • 第 27 节 枚举
    • 第 28 节 Annotation
    • 第 29 节 Java7新特性
      • AutoCloseable
      • Try-with-resources
    • 第 30 节 Java8新特性
      • 接口定义增强
      • Lambda表达式
      • 方法引用
      • 函数式接口
  • 第 3 章 Java高级编程
    • 第 1 节 Java多线程基础实现
    • 第 2 节 线程常用操作方法
    • 第 3 节 线程的同步与死锁
    • 第 4 节 生产者与消费者
    • 第 5 节 Java基础类库
      • StringBuffer
      • Runtime
      • System
      • finalize
      • Cleaner
      • 对象克隆
    • 第 6 节 数字操作类
      • Math类
      • Random类
      • 大数字操作类
    • 第 7 节 日期处理类
      • Date类
      • 日期格式化
      • Calendar类
    • 第 8 节 比较器
    • 第 9 节 正则表达式
      • 常用的正则标记
      • String类对正则的支持
      • java.util.regex包支持
    • 第 10 节 反射机制
    • 第 11 节 动态代理
    • 第 12 节 反射与Annotation
    • 第 13 节 国际化程序实现
    • 第 14 节 开发支持类库
      • Arrays类
      • UUID类
      • Optional类
      • ThreadLocal类
      • 定时器
      • Base64加密工具
    • 第 15 节 文件操作
    • 第 16 节 字节流与字符流
    • 第 17 节 IO辅助概念
      • 字符编码
      • 内存流
      • 管道流
      • RandomAccessFile
    • 第 18 节 打印流
    • 第 19 节 System类对IO的支持
    • 第 20 节 对象序列化
    • 第 21 节 IO高级应用
      • 缓冲输入流
      • Scanner
    • 第 22 节 网络编程
    • 第 23 节 类集框架
    • 第 24 节 List集合
    • 第 25 节 集合输出
    • 第 26 节 Map集合
    • 第 27 节 Set集合
    • 第 28 节 集合工具类
      • Stack
      • Queue
      • Properties
      • Collections工具类
    • 第 29 节 数据流Stream
    • 第 30 节 JDBC简介
    • 第 31 节 Statement接口
    • 第 32 节 PreparedStatment接口
    • 第 33 节 批处理与事务处理
  • 第 4 章 Oracle数据库基础
    • 第 1 节 Oracle简介
    • 第 2 节 Oracle安装与配置
    • 第 3 节 SQLPlus命令
    • 第 4 节 SQL简介与数据表分析
    • 第 5 节 SQL简单查询
    • 第 6 节 SQL限定查询
    • 第 7 节 查询排序
    • 第 8 节 综合练习:基础查询
    • 第 9 节 单行函数
    • 第 10 节 多表查询
    • 第 11 节 分组统计查询
    • 第 12 节 子查询
    • 第 13 节 综合案例:复杂查询
    • 第 14 节 数据更新操作
    • 第 15 节 事务处理
    • 第 16 节 数据伪列
    • 第 17 节 数据表的创建与管理
    • 第 18 节 约束的创建与管理
    • 第 19 节 综合案例:数据表操作
    • 第 20 节 序列的定义与使用
  • 第 5 章 JavaWeb基础
  • 第 6 章 走向单体地狱
  • 第 7 章 GitFlow工作流指南
    • 版本控制
    • Git
    • 集中式工作流
    • 功能分支工作流
    • GitFlow 工作流
    • Forking 工作流
    • Pull Requests
  • 第 8 章 微服务入门
    • 第 1 节 微服务简介
    • 第 2 节 Linux
    • 第 3 节 Docker
    • Docker 仓库
    • Ubuntu 安装 Docker
    • Docker 镜像加速器
    • 第 4 节 Docker Compose
    • 第 5 节 GitLab
    • 第 6 节 Nexus
    • 第 7 节 Harbor
  • 第 9 章 再谈微服务
  • 第 10 章 Spring Boot
  • 第 11 章 Spring Cloud Netflix
  • 第 12 章 Apache Dubbo Zookeeper
  • 第 13 章 Spring Cloud Alibaba
  • 第 14 章 Vue
  • 第 15 章 Kubernetes
  • 第 16 章 Spring Security oAuth2
  • 第 17 章 Flutter
  • Redis
    • Redis 入门
    • Redis 的数据类型
    • Redis 事务
    • Jedis
    • Spring Boot 整合 Redis
    • Redis 配置文件
    • Redis 持久化
    • Redis 发布/订阅
    • Redis 主从复制
    • Redis Sentinel
    • Redis 缓存故障
  • Glossary
由 GitBook 提供支持
在本页
  • 基础类型
  • String
  • List
  • Set
  • Hash
  • ZSet(Sorted Set)
  • 特殊类型
  • Streams
  • geospatial
  • HyperLogLog
  • bitmaps

这有帮助吗?

  1. Redis

Redis 的数据类型

上一页Redis 入门下一页Redis 事务

最后更新于2年前

这有帮助吗?

Redis 是一种开源(BSD 许可Introduction to Redis)内存数据结构存储,用作数据库、缓存、消息代理和流引擎。Redis 提供,例如 、、、、带范围查询的、、和。Redis 具有内置、、、和不同级别的,并通过和的自动分区提供高可用性。

127.0.0.1:6379> set name alpha # 设置值
OK
127.0.0.1:6379> get name # 获取值
"alpha"
127.0.0.1:6379> expire name 10 # 设置超时时间
(integer) 1
127.0.0.1:6379> ttl name # 获取存活时间
(integer) 8
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> move age 1 # 移动 key 到之情数据库
(integer) 1
127.0.0.1:6379> set name orkva
OK
127.0.0.1:6379> type name # 查看 key 的类型
string
127.0.0.1:6379> del name # 删除 key 值
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> exists name # 检查 key 是否存在
(integer) 0

基础类型

String

127.0.0.1:6379> set key1 hello
OK
127.0.0.1:6379> strlen key1 # 字符串长度
(integer) 5
127.0.0.1:6379> append key1 world # 追加字符串
(integer) 10
127.0.0.1:6379> get key1
"helloworld"
127.0.0.1:6379> get key2
(nil)
127.0.0.1:6379> append key2 world # 追加,如果不存在就设置值
(integer) 5
127.0.0.1:6379> get key2
"world"
127.0.0.1:6379> set count 0
OK
127.0.0.1:6379> type count
string
127.0.0.1:6379> incr count # 自增 步长1
(integer) 1
127.0.0.1:6379> get count
"1"
127.0.0.1:6379> decr count # 自减 步长1
(integer) 0
127.0.0.1:6379> get count
"0"
127.0.0.1:6379> incrby count 5 # 指定步长自增
(integer) 5
127.0.0.1:6379> get count
"5"
127.0.0.1:6379> decrby count 10 # 指定步长自减
(integer) -5
127.0.0.1:6379> get count
"-5"
127.0.0.1:6379> set count2 hello
OK
127.0.0.1:6379> type count2
string
127.0.0.1:6379> incr count2
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set key1 hello,world
OK
127.0.0.1:6379> getrange key1 0 4 # 获取部分字符串
"hello"
127.0.0.1:6379> getrange key1 0 -1
"hello,world"
127.0.0.1:6379> setrange key1 6 redis # 替换字符串
(integer) 11
127.0.0.1:6379> get key1
"hello,redis"
127.0.0.1:6379> setex key3 10 hello # set with expire
OK
127.0.0.1:6379> setnx key4 redis # set if not exists
(integer) 1
127.0.0.1:6379> setnx key4 mysql
(integer) 0
127.0.0.1:6379> get key4
"redis"
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # multi set
OK
127.0.0.1:6379> mget k1 k2 k3 # multi get
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v2 k4 v5 # multi setnx
(integer) 0
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379> getset db redis
(nil)
127.0.0.1:6379> getset db mysql
"redis"
127.0.0.1:6379> get db
"mysql"

使用场景

  • 基础的数据缓存:如 json 数据缓存

  • 计数器

  • 自增统计场景:如网站访问量、点击量等

List

127.0.0.1:6379> lpush list 1 2 3 # left push
(integer) 3
127.0.0.1:6379> lrange list 0 -1 # list range
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> rpush list 4 # right push
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
4) "4"
127.0.0.1:6379> lpop list # left pop
"3"
127.0.0.1:6379> rpop list # right pop
"4"
127.0.0.1:6379> lrange list 0 -1
1) "2"
2) "1"
127.0.0.1:6379> lindex list 0 # list index
"2"
127.0.0.1:6379> llen list
(integer) 2
127.0.0.1:6379> lpush list one two three three four
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "four"
2) "three"
3) "three"
4) "two"
5) "one"
127.0.0.1:6379> lrem list 1 two # list remove
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "four"
2) "three"
3) "three"
4) "one"
127.0.0.1:6379> lrem list 1 three
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "four"
2) "three"
3) "one"
127.0.0.1:6379> lpush list one
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "four"
3) "three"
4) "one"
127.0.0.1:6379> lrem list 3 one
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "four"
2) "three"
127.0.0.1:6379> lpush list one two three three four
(integer) 5
127.0.0.1:6379> ltrim list 1 4 # 截取指定区域的元素
OK
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> rpoplpush list otherlist # rpop and lpush
"one"
127.0.0.1:6379> lrange otherlist 0 -1
1) "one"
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lset list 0 two
(error) ERR no such key
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "one"
127.0.0.1:6379> lset list 0 two
OK
127.0.0.1:6379> lrange list 0 -1
1) "two"
127.0.0.1:6379> lset list 1 three
(error) ERR index out of range
127.0.0.1:6379> linsert list before two one
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "two"
127.0.0.1:6379> linsert list after two three
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "two"
3) "three"

灵活的使用可以在 Redis 中实现队列(lpush rpop)或栈(lpush lpop)。

Set

127.0.0.1:6379> sadd myset one two three
(integer) 3
127.0.0.1:6379> smembers myset # 查看所有元素
1) "one"
2) "three"
3) "two"
127.0.0.1:6379> sismember myset three # 判断元素是否在 set 中
(integer) 1
127.0.0.1:6379> sismember myset four
(integer) 0
127.0.0.1:6379> scard myset # set 中的元素个数
(integer) 3
127.0.0.1:6379> srem myset two # 删除元素
(integer) 1
127.0.0.1:6379> smembers myset
1) "one"
2) "three"
127.0.0.1:6379> srandmember myset # 随机获取元素
"six"
127.0.0.1:6379> srandmember myset 2
1) "four"
2) "six"
127.0.0.1:6379> spop myset # 移除元素
"five"
127.0.0.1:6379> spop myset
"three"
127.0.0.1:6379> smove myset otherset six
(integer) 1
127.0.0.1:6379> smembers otherset
1) "six"
127.0.0.1:6379> sadd set1 one two three
(integer) 3
127.0.0.1:6379> sadd set2 three four five
(integer) 3
127.0.0.1:6379> sdiff set1 set2 # 差集
1) "one"
2) "two"
127.0.0.1:6379> sdiff set2 set1
1) "four"
2) "five"
127.0.0.1:6379> sinter set1 set2 # 交集
1) "three"
127.0.0.1:6379> sunion set1 set2 # 并集
1) "three"
2) "two"
3) "one"
4) "four"
5) "five"

Hash

映射形式:key - [field - value]

127.0.0.1:6379> hset myhash name bob age 18
(integer) 2
127.0.0.1:6379> hget myhash name
"bob"
127.0.0.1:6379> hget myhash age
"18"
127.0.0.1:6379> hgetall myhash
1) "name"
2) "bob"
3) "age"
4) "18"
127.0.0.1:6379> hkeys myhash
1) "name"
2) "age"
127.0.0.1:6379> hvals myhash
1) "bob"
2) "18"
127.0.0.1:6379> hdel myhash name
(integer) 1
127.0.0.1:6379> hlen myhash
(integer) 1
127.0.0.1:6379> hexists myhash name
(integer) 0
127.0.0.1:6379> hincrby myhash age 1
(integer) 19
127.0.0.1:6379> hget myhash age
"19"
127.0.0.1:6379> hsetnx myhash name alpha
(integer) 1
127.0.0.1:6379> hget myhash name
"alpha"

String 和 Hash 都可以用来存储对象数据,String 使用 Json 的方式存储,而 Hash 使用键值对形式存储。当数据需要更新时,使用 String 存储的数据需要替换 Json,而使用 Hash 存储的数据只需要更新对应字段。

ZSet(Sorted Set)

127.0.0.1:6379> zadd salary 2500 alpha
(integer) 1
127.0.0.1:6379> zadd salary 1500 bob
(integer) 1
127.0.0.1:6379> zadd salary 5500 luci
(integer) 1
127.0.0.1:6379> zrange salary -inf +inf byscore
1) "bob"
2) "alpha"
3) "luci"
127.0.0.1:6379> zrange salary -inf +inf byscore withscores
1) "bob"
2) "1500"
3) "alpha"
4) "2500"
5) "luci"
6) "5500"
127.0.0.1:6379> zrange salary +inf -inf byscore rev withscores
1) "luci"
2) "5500"
3) "alpha"
4) "2500"
5) "bob"
6) "1500"
127.0.0.1:6379> zcount salary 1000 3000
(integer) 2

特殊类型

Streams

127.0.0.1:6379> xadd pc-status:shanghai:1007 * temp_c 76.4 cpu 3.4 mem 20.5
"1671609522068-0"
127.0.0.1:6379> xadd pc-status:shanghai:1007 * temp_c 81.2 cpu 6.2 mem 24.1
"1671609535993-0"
127.0.0.1:6379> xadd pc-status:shanghai:1007 * temp_c 92.6 cpu 34.9 mem 57.3
"1671609567182-0"
127.0.0.1:6379> xrange pc-status:shanghai:1007 1671609522068-0 +
1) 1) "1671609522068-0"
  2) 1) "temp_c"
    2) "76.4"
    3) "cpu"
    4) "3.4"
    5) "mem"
    6) "20.5"
2) 1) "1671609535993-0"
  2) 1) "temp_c"
    2) "81.2"
    3) "cpu"
    4) "6.2"
    5) "mem"
    6) "24.1"
3) 1) "1671609567182-0"
  2) 1) "temp_c"
    2) "92.6"
    3) "cpu"
    4) "34.9"
    5) "mem"
    6) "57.3"

geospatial

geospatial 支持存储地理空间位置,可以用来查找指定半径或者区域范围内的位置。

127.0.0.1:6379> geoadd locations:ca -122.27652 37.805186 station:1
(integer) 1
127.0.0.1:6379> geoadd locations:ca -122.2674626 37.8062344 station:2
(integer) 1
127.0.0.1:6379> geoadd locations:ca -122.2469854 37.8104049 station:3
(integer) 1
127.0.0.1:6379> geosearch locations:ca fromlonlat -122.2612767 37.7936847 byradius 5 km withdist
1) 1) "station:1"
  2) "1.8523"
2) 1) "station:2"
  2) "1.4979"
3) 1) "station:3"
  2) "2.2441"
127.0.0.1:6379> geopos locations:ca station:2
1) 1) "-122.2674599289894104"
  2) "37.80623423353753054"

HyperLogLog

HyperLogLog 是一种估计集合基数的数据结构。作为一种概率数据结构,HyperLogLog 以完美的准确性换取高效的空间利用。

Redis HyperLogLog 实现最多使用 12 KB,并提供 0.81% 的标准错误。

127.0.0.1:6379> pfadd members 123 456 112 567 433 456
(integer) 1
127.0.0.1:6379> pfcount members
(integer) 5

HyperLogLog 底层结构及其原理

bitmaps

Redis 位图是字符串数据类型的扩展,可让您将字符串视为位向量。您还可以对一个或多个字符串执行按位运算。位图用例的一些示例包括:

  • 集合成员对应于整数 0-N 的情况的有效集合表示。

  • 对象权限,其中每一位代表一个特定的权限,类似于文件系统存储权限的方式。

假设我们有 0-999 个微服务需要按时向服务器 43 发送 heartbeat ping

127.0.0.1:6379> setbit server:43:2024-01-01:00-00 123 1
(integer) 0
127.0.0.1:6379> setbit server:43:2024-01-01:00-00 456 1
(integer) 0
127.0.0.1:6379> getbit server:43:2024-01-01:00-00 123
(integer) 1
127.0.0.1:6379> getbit server:43:2024-01-01:00-00 234
(integer) 0

Streams 是 Redis 5.0 中引入的新数据类型,提供了类似于日志形式的数据存储类型,详细使用可参照 以及 。

Introduction to Redis
数据结构
字符串
散列
列表
集合
排序集合、
位图
hyperloglogs
地理空间索引
流
复制
Lua 脚本
LRU 逐出
事务
磁盘持久性
Redis Sentinel
Redis Cluster
Redis 命令参考
Redis Streams
Streams tutorial
Redis new data structure: the HyperLogLog