Redis的五大数据类型及其使用场景
前言
redis是一个非常快速的非关系数据库解决方案。其简单的键值数据模型使 Redis 能够处理大型数据集,同时保持令人印象深刻的读写速度和可用性。redis提供了五种数据类型,分别是是:1、string(字符串);2、hash(哈希);3、list(列表);4、set(集合);5、sort set (有序集合)(其实随着 Redis 版本的更新,后面又支持了四种数据类型:BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增),本文暂不作介绍。)。接下我就给大家介绍一下这五种数据类型的基本用法和使用场景。
Redis五大数据类型
一. String
1、简介
字符串类型:实际上可以是字符串(包括XML、JSON)、还有数字(整形、浮点数)、二进制(图片、音频、视频),最大不能超过512MB。
2、常用命令
(1)设值命令:
set age 23 ex 10 //10秒后过期 px 10000 毫秒过期
setnx name test //不存在键name时,返回1设置成功;存在的话失败0
set age 25 xx //存在键age时,返回1成功
(2)获值命令:
get age //存在则返回value, 不存在返回nil
(3)批量设值:
mset country china city beijing
(4)批量获取:
mget country city address //返回china beigjin, address为nil
(5)计数命令:
incr age //必须为整数自加1,非整数返回错误,无age键从0自增返回1
decr age //整数age减1
incrby age 2 //整数age+2
decrby age 2//整数age -2
incrbyfloat score 1.1 //浮点型score+1.1
(6)append追加指令:
set name hello; append name world //追加后成helloworld
(7)字符串长度:
set hello “世界”;strlen hello//结果6,每个中文占3个字节
(8)截取字符串:
set name helloworld ; getrange name 2 4//返回 llo
3、使用场景
(1) 简单字符缓存
(2) 分布式锁
(3)计数功能——》计数服务
INCR article:001 (文章001阅读数加1)
GET airticle:001
文章阅读数
(4) 各类场景下(单机或分布式)的标识号
Incrby serialNo 1 ——》分给每个服务1000个本地缓存Incrby serialNo 1000
(5) 集群环境下的Session共享
二、Hash
1、简介
哈希hash是一个string类型的field和value的映射表,hash特适合用于存储对象
hash
2、常用命令
(1)设值命令:
设值:
hset user:1 name james //成功返回1,失败返回0
批量设值:
hmset user:2 name james age 23 sex boy //返回OK
(2)取值命令:
取值:
hget user:1 name //返回james
批量取值:
hmget user:2 name age sex //返回三行:james 23 boy
(3)删除命令:
hdel user:1 age //返回删除的个数
(4)计算个数:
hset user:1 name james;
hset user:1 age 23;
hlen user:1 //返回2,user:1有两个属性值
(5)判断field是否存在:
hexists user:2 name //若存在返回1,不存在返回0
(6)获取所有field:
hkeys user:2 // 返回name age sex三个field
(7)获取user:2所有value:
hvals user:2 // 返回james 23 boy
(8)获取user:2所有field与value:
hgetall user:2 //name age sex james 23 boy值
(9)增加1:
hincrby user:2 age 1 //age+1
hincrbyfloat user:2 age 2 //浮点型加2
3 、使用场景
(1) 存储对象
实例:购物车
Hmset cart:001 prod:01 1 prod:02 1
当前登录用户ID号为key,商品ID号为Field,加入购物车数量为value
购物车展示
三、 List
1、简介
用来存储多个有序的字符串,一个列表最多可存2的32次方减1个元素。因为有序,可以通过索引下标获取元素或某个范围内元素列表,列表元素可以重复
list
2、常用命令
(1)添加命令:
rpush james c b a //从右向左插入cba, 返回值3
lrange james 0 -1 //从左到右获取列表所有元素 返回 c b a
lpush key c b a //从左向右插入cba
linsert james before b teacher //在b之前插入teacher, after为之后,使 用lrange james 0 -1 查看:c teacher b a
(2)查找命令:
lrange key start end //索引下标特点:从左到右为0到N-1
lindex james -1 //返回最右末尾a,-2返回b
llen james //返回当前列表长度
lpop james //把最左边的第一个元素c删除
rpop james //把最右边的元素a删除
3、使用场景
(1)利用List实现栈、队列
1.先进后出:栈 = LPUSH+LPOP->FILO
2.先进先出:队列=LPUSH+RPOP
3.Blocking MQ(堵塞队列)= LPUSH+BRPOP
(2)redis做消息队列(不推荐使用redis做消息队列)
下面以订单为例子进行演示:
- 每个用户有多个订单key为 order:1 order:2 order:3, 结合hmset
hmset order:1 orderId 1 money 36.6 time 2018-01-01
hmset order:2 orderId 2 money 38.6 time 2018-01-01
hmset order:3 orderId 3 money 39.6 time 2018-01-01
- 把订单信息的key放到队列
lpush user:1:order order:1 order:2 order:3
- 新产生了一个订单order:4,
hmset order:4 orderId 4 money 40.6 time 2018-01-01
- 追加一个order:4放入队列第一个位置
lpush user:1:order order:4
- 当需要查询用户订单记录时:
List orderKeys = lrange user:1:order 0 -1 //查询user:1 的所有订单key值
for(Order order: orderKeys){
hmget order:1
}
(3)列表缓存
微信订阅号展示
小明微信号ID:001,他关注了顶级架构师、爱敲代码的小黄、程序员蜗牛上图的展示效果应该如何设计?
- 顶级架构师发布了一条文章ID为100的文章
lpush:mes:001 100
- 爱敲代码的小黄发布了一条文章ID为101的文章
lpush:mes:001 101
- 程序员蜗牛发布了一条文章ID为102的文章
lpush:mes:001 102
- 小明的微信订阅号列表实现如下
lrange mes:001 0 5
四、Set
1、简介
保存多元素,与列表不一样的是不允许有重复元素,且集合是无序,一个集合最多可存2的32次方减1个元素,除了支持增删改查,还支持集合交集、并集、差集;
sey
2、常用命令
(1)检查user键值是否存在
exists user
(2)设置命令:
sadd user a b c//向user插入3个元素,返回3
sadd user a b //若再加入相同的元素,则重复无效,返回0
(3)查找命令:
smember user //获取user的所有元素,返回结果无序
(4)删除命令:
srem user a //返回1,删除a元素
(5)计算元素个数
scard user //返回2,计算元素个数
3、Set 集合特殊的操作指令
(1)集合与集合之间的交集
sinter setA setB -> 得到集合 {B,C}
(2)集合与集合之间的并集
sunion setA setB -->得到集合{A,B,C}
(3)集合与集合之间的差集
sdiff setA setB-->得到集合{A}
4、使用场景:
(1)标签,社交,查询有共同兴趣爱好的人,智能推荐
使用方式:
给用户添加标签:
sadd user:1:fav basball fball pq
sadd user:2:fav basball fball
............
或给标签添加用户
sadd basball:users user:1 user:2
sadd fball:users user:1 user:2
........
计算出共同感兴趣的人:
sinter user:1:fav user2:fav
(2)抽奖
微信抽奖
微信有一个活动,活动ID为001,如何实现微信抽奖功能,基于Redis设计实现?
假设小明的userId为: 004
- 当小明点击参与抽奖时,数据放入set集合
sadd active:001 004
- 开始抽奖2名中奖者(随机)
srandmember active:001 2
或者
spop act:001 2
- 查看有多少用户参加了本次抽奖
smembers active:001
(3)朋友圈点赞
朋友圈消息ID:008,微信点赞如何设计?
张三用户ID 为userId:01
朋友圈点赞
(1)张三对消息ID008点赞啦
sadd zan:008 userId:01
(2)张三取消了对消息008的点赞
srem zan:008 userId:01
(3)检查用户是否点过赞
sismember zan:008 userId:01
(4)获取消息ID008所有的点赞用户列表
smembers zan:008
(5)消息ID008的点赞数计算
scard zan:008
(4)Set集合特殊的操作指令应用场景
如何实现微博的微关系设计?
微博关注
条件:
1 James关注的人
sadd jamesCares Irving,peter,king,jack
条件2 Irving关注的人
sadd IrvingCares james,jack,cjk,king
条件3 jack关注的人
sadd avCares deer,cjk,king
计算:
计算1 James和Irving共同关注的人
sinter jamesCares IrvingCares , 计算结果为 {jack, king}
计算2 我关注的人也关注他(king)
sismember IrvingCares king
sismember avCares king
计算3 我可能认识的人
SDIFF IrvingCares jamesCares-> {james.cjk}
五、ZSet
1、简介
常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数与集合有联系,不能有重复成员
zset
2、常用命令
(1)添加命令
zadd key score member [score member......]
zadd user:zan 200 james //james的点赞数1, 返回操作成功的条数1
zadd user:zan 200 james 120 mike 100 lee// 返回3
zadd test:1 nx 100 james //键test:1必须不存在,主用于添加
zadd test:1 xx incr 200 james //键test:1必须存在,主用于修改,此时为300
zadd test:1 xx ch incr -299 james //返回操作结果1,300-299=1
(2)查询命令
zrange test:1 0 -1 withscores //查看点赞(分数)与成员名
(3)计算成员个数
zcard test:1 //计算成员个数, 返回1
3、使用场景
排名场景:
zadd user:3 200 james 120 mike 100 lee//先插入数据
zrange user:3 0 -1 withscores //查看分数与成员
zrank user:3 james //返回名次:第3名返回2,从0开始到2,共3名
zrevrank user:3 james //返回0, 反排序,点赞数越高,排名越前
排行榜系统,如视频网站需要对用户上传的视频做排行榜
点赞数:
zadd user:1:20180106 3 mike //mike获得3个赞
再获一赞:
zincrby user:1:20180106 1 mike //在3的基础上加1
用户作弊,将用户从排行榜删掉:
zrem user:1:20180106 mike
展示赞数最多的5个用户:
zrevrangebyrank user:1:20180106 0 4
查看用户赞数与排名:
zscore user:1:20180106 mike zrank user:1:20180106 mike
实例
以最典型的微博热搜为例,描述用Redis设计实现, 以日期做为Key
微博热搜展示
(1)点击话题
zincrby topic:20230717 1 狗头萝莉
(2)上图排行实现,展示今日前10排名
zrevrange topic:20230717 0 9 withscores
(3)统计近3日点击数据
zunionstore topic:3day 3
(4) 展示近3日的排行前10名
zrevrange topic:20230717-20230717 0 9 withscores
4、ZSet和List、Set对比
ZSet和List、Set对比
Redis的五大数据类型及其使用场景的更多相关文章
- Redis详解(五)------ redis的五大数据类型实现原理
前面两篇博客,第一篇介绍了五大数据类型的基本用法,第二篇介绍了Redis底层的六种数据结构.在Redis中,并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这些对 ...
- Redis(三)--- Redis的五大数据类型的底层实现
1.简介 Redis的五大数据类型也称五大数据对象:前面介绍过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject:这个对象系统包 ...
- Redis 详解 (五) redis的五大数据类型实现原理
目录 1.对象的类型与编码 ①.type属性 ②.encoding 属性和 *prt 指针 2.字符串对象 3.列表对象 4.哈希对象 5.集合对象 6.有序集合对象 7.五大数据类型的应用场景 8. ...
- 面试官:讲讲Redis的五大数据类型?如何使用?(内含完整测试源码)
写在前面 最近面试跳槽的小伙伴有点多,给我反馈的面试情况更是千差万别,不过很多小伙伴反馈说:面试中的大部分问题都能够在我的公众号[冰河技术]中找到答案,面试过程还是挺轻松的,最终也是轻松的拿到了Off ...
- redis的五大数据类型实现原理
1.对象的类型与编码 Redis使用前面说的五大数据类型来表示键和值,每次在Redis数据库中创建一个键值对时,至少会创建两个对象,一个是键对象,一个是值对象,而Redis中的每个对象都是由 redi ...
- 解析Redis操作五大数据类型常用命令
摘要:分享经常用到一些命令和使用场景总结,以及对Redis中五大数据类型如何使用cmd命令行的形式进行操作的方法. 本文分享自华为云社区<Redis操作五大数据类型常用命令解析>,作者:灰 ...
- redis之五大数据类型
redis之五大数据类型 redis redis的两种链接方式 简单链接 1234 import redisconn = redis.Redis(host='10.0.0.200',port=6379 ...
- Redis的五大数据类型以及key的相关操作命令
Redis的五大数据类型 redis的数据都是以key/value存储,所以说,五大类型指的是value的数据类型 String 字符串,作为redis的最基本数据类型 redis中的string类型 ...
- 2 万字 + 20张图| 细说 Redis 九种数据类型和应用场景
作者:小林coding 计算机八股文网(操作系统.计算机网络.计算机组成.MySQL.Redis):https://xiaolincoding.com 大家好,我是小林. 我们都知道 Redis 提供 ...
- 一文搞定Redis五大数据类型及应用场景
本文学习知识点 redis五大数据类型数据类型:string.hash.list.set.sorted_set 五大类型各自的应用场景 @TOC 1. string类型 1-1 string类型数据的 ...
随机推荐
- 基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux
2023年目前要说最热的点,肯定是ChatGPT了. ChatGPT官方提供的网页版本,还有需要科*上网,很多人都会基于此进行封装. 现在是移动互联网时代,基于手机APP的需求还是很大的. 所以,今天 ...
- Django笔记二十六之数据库函数之数学公式函数
本文首发于公众号:Hunter后端 原文链接:Django笔记二十六之数据库函数之数学公式函数 这一篇来介绍一下公式函数,主要是数学公式. 其中 sin,cos 这种大多数情况下用不上的就不介绍了,主 ...
- 解决ffmpeg源码不能编译ffplay问题
虽然不是很大问题,还是记录一下,避免以后忘记!!! 总共两个原因影响了源码编译不能生成ffplay可执行文件,如下: 1.系统中没有安装SDL,直接去官网下载SDL源码编译安装http://www.l ...
- for of 和 for in 的区别
1 var arr = ["f", "6", 3, "a", 7]; 2 var obj = { name: "shun" ...
- [OpenCV-Python] 4 图像读取
文章目录 OpenCV-Python: II OpenCV 中的 Gui 特性 4 图片 4.1 读入图像 4.2 显示图像 4.3 保存图像 4.4 总结一下 OpenCV-Python: II O ...
- 获取scrollTop的方法(兼容所有浏览器)
/** *获取scrollTop的值,兼容所有浏览器 */ function getScrollTop() { var scrollTop = document.documentElement.scr ...
- 2021-10-19:缺失的区间。给定一个排序的整数数组 nums ,其中元素的范围在 闭区间 [lower, upper] 当中,返回不包含在数组中的缺失区间。力扣163。
2021-10-19:缺失的区间.给定一个排序的整数数组 nums ,其中元素的范围在 闭区间 [lower, upper] 当中,返回不包含在数组中的缺失区间.力扣163. 福大大 答案2021-1 ...
- vue全家桶进阶之路31:Vue3 数据和方法的双向绑定ref、reactive、toRefs
ref 在 Vue 3 中,你可以使用 setup 函数来定义组件的数据和方法.在 setup 函数中,你可以使用 ref.reactive 和 computed 等 Vue 3 的响应式 API 来 ...
- Rocky 9 Linux 平台 vim 9.0 源码包编译安装踩坑记录
目录 vim 9.0 部署准备环境 vim 9.0 源码包正式部署 vim 9.0 初体验 plug-vim 安装插件 在上一篇 <vim入门实战> 篇,我并没有介绍 Linux 平台源码 ...
- 局部添加加载中效果loading (vue+elementUI)
产品需求:有时候我们不想为整个页面添加loading效果.只想给局部区域添加loading效果.(这效果就不揍产品了) 在一个表格数据加载时,因为需要连接其它东西,所以后台接口返回数据需要较长时间,因 ...