0

0

redis数据类型有哪些?redis各数据类型的总结

不言

不言

发布时间:2018-09-13 17:20:38

|

7305人浏览过

|

来源于php中文网

原创

本篇文章给大家带来的内容是关于redis数据类型有哪些?redis各数据类型的总结,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

前言

  1. redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存、亦可持久化的日志型、key-value数据库,并提供多种语言的API。

  2. 它是内存存储的数据结构服务器,可用作数据库、高速缓存和消息队列代理。

  3. 通过数据全部in-momery的方式保证高速访问,同时提供数据落地的功能,这是redis最主要的适用场景。

  4. reids内置复制、Lua脚本、LRU收回、事物以及不同级别磁盘持久化功能,同时通过redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

  5. redis支持字符串、哈希表、列表、集合、有序集合、位图、hyperloglogs等数据类型。

  6. redis最为常用的数据类型:stirng、hash、list、set、sorted set、pub/sub、transactions。

String类型

  1. string类型就是简单的key-value类型,value不仅仅是string,也可以是数字。

  2. 常用命令:set、get、decr、incr、mget等。

  3. 除了提供与memcached一样的get、set、incr、decr 等操作外,redis还提供了下面的一些操作:

(1)获取字符串长度;
(2)往字符串append内容;
(3)设置和获取字符串的某一段内容;
(4)设置及获取字符串的某一位(bit);
(5)批量设置一系列字符串的内容;

Hash类型

  1. hash特别适合用于存储对象。

  2. 常用命令:hget、hset、hgetall等。

  3. 应用场景:存储一些结构化的数据,比如用户的昵称、年龄、性别、积分等,存储一个用户信息对象数据。

  4. 我们举个简单的实例来描述下Hash的应用场景,比如我们存储一个用户信息对象数据,包含以下信息:

(1)用户id为查找的key;
(2)存储的value包括姓名、年龄、生日等信息

1、实例解析:

(1)key是用户id,value是一个Map。
(2)这个Map的key是成员的属性名,value是属性值;
(3)这样对数据的修改和存取都可以直接通过其内部的Map的key(redis里称内部Map的key为field),也就是key(用户名id)+field(属性名)就可以操作对应属性数据了。

2、注意:

(1)redis提供了接口(hgetall)可以直接取到全部的属性数据,但是如果内部Map的成员很多,那么涉及到遍历整个Map的操作。
(2)由于redis单线程模型的缘故,这个遍历操作可能会比较耗时,而令其他客户端的请求完全响应不到,这点需要注意。

List类型

  1. list类型实质是一个每个元素都是string类型的双向链表,这使得list既可以用作栈,也可以用作队列。

  2. list类型经常会被用于消息队列的服务,以完成多程序之间的消息交换。

  3. 常用命令:lpush、rpush、lpop、rpop、lrange等。

  4. 应用场景:实现最新消息排行等功能,还有消息队列。

  5. 简单消息队列举例分析:

(1)假设一个应用程序执行lpush向链表中添加新的元素,我们通常将这样的程序称之为“生产者(producer)”;
(2)而另外一个应用程序正在执行rpop操作从链表中取出元素,我们称这样的程序为“消费者(consumer)”;
(3)在消费者消费消息的过程中,需要不停调用rpop查看list中是否有待处理消息。每调用一次都会发起一次链接,造成不必要的浪费。
(4)另外,如果生产者速度大于消费者速度,消息队列长度会一直增大,时间久了会占用大量内存空间;
(5)所以,可以使用brpop命令,这个命令只有在有元素时返回,没有则会阻塞直到超时返回null。

Set类型

  1. set类型是string类型的无序集合。

  2. set集合的概念就是一堆不重复值的组合。

  3. set元素最大可以包含(2的32次方-1)个元素。

  4. set内部实现是一个value永远为null的HashMap。

  5. set对外提供的功能与list类似是一个列表的功能,特殊之处在于set时可以自动排重的。

  6. 常用命令:sadd、spop、smembers、sunion等。

  7. 当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择。

  8. 并且set提供了判断某个成员是否在一个set集合内的重要接口,这个是list不能提供的。

  9. 利用set数据结构,可以存储一些集合性的数据,比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。

  10. redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能。

Zset类型

  1. 和set一样,sorted set也是stirng类型元素的集合。不同的是每个元素都会关联一个double类型的score,元素顺序由score决定。

  2. sorted set是插入有序的,即自动排序。

    魔法映像企业网站管理系统
    魔法映像企业网站管理系统

    技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作

    下载
  3. 常用命令:zadd、zrange、zrem、zcard等。

  4. 当你需要一个有序的并且不重复的集合列表时,那么可以选择sorted set数据结构。

  5. 应用举例:

(1)例如存储全班同学的成绩,其集合value可以是同学的学号,而score就可以是成绩。
(2)排行榜应用,根据得分列出topN的用户等。

pub/sub

  1. subscribe、unsubscribe和publish三个命令实现了发布与订阅泛型。

  2. 发送者(发送信息的客户端)不是直接将信息发给特定的接收者(接受信息的客户端),而是将信息发给频道(channel),然后由频道将信息转发给所有对这个频道感兴趣的订阅者。

  3. 发送者无需知道任何关于订阅者的信息,而订阅者也无需知道是哪个客户端给它发送信息,它只要关注自己感兴趣的频道即可。

  4. 发布/订阅在redis中,被设计的非常轻量级和简洁,它做到了消息的发布和订阅的基本能力;但是尚未提供关于消息持久化等各种企业级的特性。

  5. 一个redis client发布消息,其他多个redis client订阅消息,发布的消息即发即失,redis不会持久保存发布的消息;消息订阅者也只能得到订阅后的消息,通道中此前的消息无从获得。

  6. 消息发布者,即publish客户端,无需独占链接,你可以在publish消息的同时,使用同一个redis-client链接进行其他操作(如incr等);

  7. 消息订阅者,即subscribe客户端,需要独占链接,即进行subscribe期间,redis-client无法穿插其他操作。

  8. 此时client以阻塞的方式等待publish端的消息,因此subscribe需要使用单独的链接,甚至需要在额外的线程中使用。

  9. tcp默认连接时间固定,如果在这世间内sub端没有接收到pub端消息,或pub端没有消息产生,sub端的连接都会强制回收。

  10. 这就需要特殊手段解决,用定时器来模拟pub和sub之间的保活机制,定时器时间不能超过tcp最大连接时间。

  11. 一旦subscribe端断开链接,将会失去部分消息,即链接失效期间的消息将会被丢失,所以,这里需要考虑redis的list来持久化;

  12. 如果你非常关注每个消息,那么你应该基于redis做一些额外的补充工作,如果你希望订阅是持久的,那么如下设计思路可以借鉴:

(1)subscribe端:首先向一个set集合中增加“订阅者id”,此set集合保存了“活跃订阅”者;订阅者id标记每个唯一的订阅者,此set为“活跃订阅者集合”。
(2)subscribe端开启订阅操作,并基于redis创建一个以订阅者id为key的list数据结构,此list中存储了所有的尚未消费的消息,此list称为“订阅者消息队列”;
(3)publish端:每发布一条消息之后,publish端都需要遍历活跃订阅者集合,并依次向每个“订阅者消息队列”尾部追加此次发布的消息;
(4)到此为止,我们基本可以保证,发布的每一条消息,都会持久的保存在每个“订阅者消息队列”中;
(5)subscribe端,每接收到一个订阅消息,在消费周后,必须删除自己的“订阅者消息队列”头部的一条消息;
(6)subscribe端启动时,如果发现自己的“订阅者消息队列”中有残存记录,那么将会首先消费这些消息,然后再去订阅。

  1. 以上方法可以保证成功到达的消息必消费不丢失

transactions

  1. redis事务可以一次执行多个命令。

  2. 一个事务从开始到执行会经历三个阶段:

(1)开始事务
(2)命令入队
(3)执行事务

事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序执行。

事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

单个redis命令的执行时原子性的,但redis没有在事务上增加任何维持原子性的机制,所以redis事务的执行并不是原子性的。

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

multi、exec、discard和watch命令是redis事务的基础。

multi:

(1)multi命令用于开启一个事务,它总是返回ok。
(2)multi命令执行之后,客户端可以继续向服务器发送任意多条命令;
(3)这些命令不会立即被执行,而是被放到一个队列中;
(4)当exec命令被调用时,所有队列中的命令才会被执行。

exec:

(1)exec命令负责触发并执行事务中的所有命令;
(2)如果客户端在使用multi开启了一个事务后,却因为断线而没有成功执行exec命令,那么事务中所有的命令都不会被执行。
(3)另一方面,如果客户端成功在开启事务之后执行exec命令,那么事务中的所有命令都会被执行。

discard:

(1)通过调用discard,客户端可以清空事务队列,并放弃执行事务。

watch:

(1)watch命令可以为redis事务提供check-and-set (CAS)行为。
(2)watch使得exec命令有条件的执行:事务只能在所有被监控健都没有被修改的前提下执行,如果这个前提不能满足,事务就不会执行。
(3)如果你用watch监视来一个带过期时间的健,那么即使这个健过期了,事务仍然可以执行。
(4)watch可以被调用多次,对健的监视从watch被执行之后就生效,直到调用exec为止。
(5)当exec被调用时,不管事务是否被成功执行,对所有健的监视都会被取消。
(6)当客户端断开链接时,该客户端对健的监视也会被取消。

相关推荐:

Redis数据类型--string

Redis基本数据类型和相关操作

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

2

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

24

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

80

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

187

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

339

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

116

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

180

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

31

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

81

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MongoDB 教程
MongoDB 教程

共17课时 | 3.2万人学习

XML教程
XML教程

共142课时 | 8.1万人学习

php-src源码分析探索
php-src源码分析探索

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号