NoSql数据库Redis系列(2)——Redis数据类型
一、设计 Redis Key
(一)、分段设计法
使用冒号把 key 中要表达的多种含义分开表示,步骤如下:
1、把表名转化为 key 前缀
2、主键名(或其他常用于搜索的字段)
3、主键值
4、要存储的字段。
eg. 用户表(user)
id |
name |
|
---|---|---|
1 |
zj |
156577812@qq.com |
2 |
ai |
156577813@qq.com |
这个简单的表可能经常会有这个的需求:>根据用户 id 查询用户邮箱地址,可以选择把邮箱地址这个数据存到 redis 中:
- set user:id::email @qq.com;
- set user:id::email @qq.com;
注意:Redis的命令不区分大小写,但是key 严格区分大小写!!!
二、string 数据类型
(一)、简介
string 是Redis的最基本的数据类型,可以理解为与 Memcached 一模一样的类型,一个key 对应一个 value。string 类型是二进制安全的,意思是 Redis 的 string 可以包含任何数据,比如图片或者序列化的对象,一个 redis 中字符串 value 最多可以是 512M。
(二)、数据模型
string 类型是基本的 Key-Value 结构,Key 是某个数据在 Redis 中的唯一标识,Value 是具体的数据。
Key |
Value |
---|---|
‘name’ |
‘redis’ |
‘type’ |
‘string’ |
(三)、 应用场景
(1) 存储 MySQL 中某个字段的值
把 key 设计为 表名:主键名:主键值:字段名
eg.
- set user:id::email @qq.com
(2) 存储对象
string 类型支持任何格式的字符串,应用最多的就是存储 json 或其他对象格式化的字符串。(这种场景下推荐使用 hash 数据类型)
- set user:id: '[{"id":1,"name":"zj","email":"156577812@qq.com"},{"id":1,"name":"zj","email":"156577812@qq.com"}]'
(3) 生成自增 id
当 redis 的 string 类型的值为整数形式时,redis 可以把它当做是整数一样进行自增(incr)自减(decr)操作。由于 redis 所有的操作都是原子性的,所以不必担心多客户端连接时可能出现的事务问题
(四)、string 数据类型在 Redis 中的相关命令:
PS:上面的 ttl 命令是返回 key 的剩余过期时间,单位为秒。
上面是 string 类型的基本命令,下面介绍几个自增自减操作,这在实际工作中还是特别有用的(分布式环境中统计系统的在线人数,利用Redis的高性能读写,在Redis中完成秒杀,而不是直接操作数据库。)。
二、hash 数据类型
(一)、简介
hash 是一个键值对集合,是一个 string 类型的 key和 value 的映射表,key 还是key,但是value是一个键值对(key-value)。类比于 Java里面的 Map<String,Map<String,Object>> 集合。
(二)、数据模型
假设有一张数据库表如下:
id |
name |
type |
---|---|---|
1 |
redis |
hash |
如果要用 redis 的 hash 结构存储,数据模型如下:
hash数据类型在存储上述类型的数据时具有比 string 类型更灵活、更快的优势,具体的说,使用 string 类型存储,必然需要转换和解析 json 格式的字符串,即便不需要转换,在内存开销方面,还是 hash 占优势。
(三)、应用场景
hash 类型十分适合存储对象类数据,相对于在 string 中介绍的把对象转化为 json 字符串存储,hash 的结构可以任意添加或删除‘字段名’,更加高效灵活。
- hmset user: name zj email @qq.com
(四)、hash数据类型在 Redis 中的相关命令:
演示如下:
三、list 数据类型
(一)、简介
list 列表,它是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边),它的底层实际上是个链表。
(二)、数据模型
常见操作时用 lpush 命令在 list 头部插入元素, 用 rpop 命令在 list 尾取出数据。
(三)、应用场景
(1) 消息队列
redis 的 list 数据类型对于大部分使用者来说,是实现队列服务的最经济,最简单的方式。
(2) “最新内容”
因为 list 结构的数据查询两端附近的数据性能非常好,所以适合一些需要获取最新数据的场景,比如新闻类应用的 “最近新闻”。
(四)、hash数据类型在 Redis 中的相关命令:
list 是链表结构,所有如果在头部和尾部插入数据,性能会非常高,不受链表长度的影响;但如果在链表中插入数据,性能就会越来越差。
四、set 数据类型
(一)、简介
set 数据类型是一个集合(没有排序,不重复),可以对 set 类型的数据进行添加、删除、判断是否存在等操作(时间复杂度是 O(1) )
set 集合不允许数据重复,如果添加的数据在 set 中已经存在,将只保留一份。
set 类型提供了多个 set 之间的聚合运算,如求交集、并集、补集,这些操作在 redis 内部完成,效率很高。
(二)、数据模型
(三)、应用场景
set 类型的特点是——不重复且无序的一组数据,并且具有丰富的计算功能,在一些特定的场景中可以高效的解决一般关系型数据库不方便做的工作。
1. “共同好友列表”
社交类应用中,获取两个人或多个人的共同好友,两个人或多个人共同关注的微博这样类似的功能,用 MySQL 的话操作很复杂,可以把每个人的好友 id 存到集合中,获取共同好友的操作就可以简单到一个取交集的命令就搞定。
- // 这里为了方便阅读,把 id 替换成姓名
- sadd user:wade james melo paul kobe
- sadd user:james wade melo paul kobe
- sadd user:paul wade james melo kobe
- sadd user:melo wade james paul kobe
- // 获取 wade 和 james 的共同好友
- sinter user:wade user:james
- /* 输出:
- * 1) "kobe"
- * 2) "paul"
- * 3) "melo"
- */
- // 获取香蕉四兄弟的共同好友
- sinter user:wade user:james user:paul user:melo
- /* 输出:
- * 1) "kobe"
- */
- /*
- 类似的需求还有很多 , 必须把每个标签下的文章 id 存到集合中,可以很容易的求出几个不同标签下的共同文章;
- 把每个人的爱好存到集合中,可以很容易的求出几个人的共同爱好。
- */
(四)、set数据类型在 Redis 中的相关命令:
Redis 的 set 是 string 类型的无序集合。
五、zset 数据类型
(一)、简介
zset(sorted set 有序集合),和上面的set 数据类型一样,也是 string 类型元素的集合,但是它是有序的。
(二)、应用场景
在集合类型的场景上加入排序就是有序集合的应用场景了。比如根据好友的“亲密度”排序显示好友列表。
- // 用元素的分数(score)表示与好友的亲密度
- zadd user:kobe james wade melo paul
- // 根据“亲密度”给好友排序
- zrevrange user:kobe -
- /**
- * 输出:
- * 1) "wade"
- * 2) "paul"
- * 3) "melo"
- * 4) "james"
- */
- // 增加好友的亲密度
- zincrby user:kobe james
- // 再次根据“亲密度”给好友排序
- zrevrange user:kobe -
- /**
- * 输出:
- * 1) "james"
- * 2) "wade"
- * 3) "paul"
- * 2) "melo"
- */
- //类似的需求还出现在根据文章的阅读量或点赞量对文章列表排序
- 新浪微博微信TwitterFacebook
(三)、zset数据类型在 Redis 中的相关命令:
六、系统相关命令
七、key 相关命令
关于 key 的命令应该说是最常用的,需要大家记住。
这里在介绍一个命令 :
- OBJECT ENCODING key
这是用来显示这五种数据类型的底层数据结构,下一篇博客我们会详细介绍。
上面的命令我们给string 数据类型 k1 复制str,给 k2 复制123,通过 OBJECT ENCODING 显示底层实现的数据类型分别是 embstr 和 int。这到底是什么呢?下篇博客我们会详细介绍的。
参考资料:https://www.cnblogs.com/ysocean/p/9080940.html
https://segmentfault.com/a/1190000012212663?utm_source=tag-newest
NoSql数据库Redis系列(2)——Redis数据类型的更多相关文章
- 项目实战11—企业级nosql数据库应用与实战-redis的主从和集群
企业级nosql数据库应用与实战-redis 环境背景:随着互联网2.0时代的发展,越来越多的公司更加注重用户体验和互动,这些公司的平台上会出现越来越多方便用户操作和选择的新功能,如优惠券发放.抢红包 ...
- Redis系列(二):Redis的数据类型及命令操作
原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...
- Redis系列(2)之数据类型
Redis系列(2)之数据类型 <Redis系列(1)之安装>中介绍了Redis支持以下几种数据类型,那么本节主要介绍学习下这几种数据类型的基本操作 字符串类型,string 散列类型,h ...
- Redis系列(一):Redis的简介与安装
原文链接(转载请注明出处):Redis系列(一):Redis的简介与安装 什么是 Redis Redis 是一个使用ANSI C 编写的开源.支持网络协议.基于内存.可选持久性的键值对数据库,它是一个 ...
- Redis系列一 Redis安装
Redis系列一 Redis安装 1.安装所使用的操作系统为Ubuntu16.04 Redis版本为3.2.9 软件一般下载存放目录为/opt,以下命令操作目录均为/opt root@ubunt ...
- 企业级nosql数据库应用与实战-redis
一.NoSQL简介 1.1 常见的优化思路和方向 1.1.1 MySQL主从读写分离 由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力.读写集中在一个数据库上让数据库不堪重负,大部 ...
- Redis系列---操作命令及数据类型
本章将简单介绍下,Redis里面常用的数据类型以及我们常用到的一些命令,let's go 准备环境: Redis 详细见上一个章节 我们接下来操作的命令用的是Redis自带的客户端工具,在安装red ...
- Redis系列之----Redis的数据类型及使用场景
Redis是一个开源的.高性能的.基于键值对的缓存与存储系统,能够提供多种不同的键值数据类型来适应不同场景下的缓存和存储需求. Redis中所有的数据都存储在内存中,因此读写速度非常快,相 ...
- Redis系列三 Redis数据类型
一 .Redis的五大数据类型 1.String(字符串) string是redis最基本的数据类型,可以理解成与 Memached一模一样的数据类型,一个key对应一个value. string 类 ...
- redis系列:redis介绍与安装
前言 这个redis系列的文章将会记录博主学习redis的过程.基本上现在的互联网公司都会用到redis,所以学习这门技术于你于我都是有帮助的. 博主在写这个系列是用的是目前最新版本4.0.10,虚拟 ...
随机推荐
- fastjson反序列化漏洞研究(下)
之前的文章显示字符太多 拒绝显示 只好分为两篇了 这样我们只需要找到可以利用的类,构造poc链就好了,这个和以前的java反序列化漏洞类似,先不说.网上最早的poc是使用com.sun.org.ap ...
- ECharts 实现地图散点图上(转载)
转载来源:https://efe.baidu.com/blog/echarts-map-tutorial/ ECharts 实现地图散点图(上) 小红 2016-04-28 ECharts, 教 ...
- CasPHP 便捷简单的 ThinkPHP 框架
便捷简单的 PHP 框架,自适应后台管理界面 Convenient and succinct(便捷的 简明的;言简意赅的) 核心框架:framework: 5.1.28助手函数:think-helpe ...
- ACL权限
基本命令 getfacl 文件名 查看文件ACL权限 setfacl [选项] 文件名 设定文件ACL权限 -m 设定ACL权限 -b 删除ACL权限 -x:用户 删除单个用户的ACL权限 s ...
- OSS阿里云相关文档
OSS阿里云相关文档 oss文档链接
- 【转】spring bean 卸载
spring bean 卸载起因: 群里的一个朋友问到: 关于配置destory-method, springboot中 yml如何指定 首先介绍 bean卸载的三种形式 自定义destory-met ...
- websocket实现心跳连接
在使用websocket的时候,遇到了一个websocket在连接一段时间就异常断开连接了.第一想法就是重新去连接websocket(websock.onopen),后来发现这种方式是错误的,查阅文档 ...
- AI demo framework
import pickle import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_select ...
- Spring4- 04-Spring简易整合Mybatis -导入jar包/ 正常编写pojo/ 编写spring 配置文件
笔记要点&出错分析与总结 POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,工程组织 (AirportService为机场 ...
- 《The One!团队》第八次作业:ALPHA冲刺(一)
项目 内容 作业所属课程 所属课程 作业要求 作业要求 团队名称 < The One !> 作业学习目标 (1)掌握软件测试基础技术.(2)学习迭代式增量软件开发过程(Scrum) 第一天 ...