当前位置: 首页 > news >正文

redis常用五种数据类型的常用指令

本文为初识redis记录的基本知识,如有不正确之处还请指出

一、redis五种类型简介
string:存储结构为简单动态字符串(SDS)
hash:存储结构可以是哈希表(O(1))、压缩列表(O(N))
list:存储结构可以是双向链表(O(N))、压缩列表(O(N))
set:存储结构可以是哈希表(O(1))、整数数组(O(N))
zset:存储结构可以是压缩列表(O(N))、跳表(O(logN))

数组:根据序号随机查找很快,但是插入和删除很慢,需要挪动很多元素
链表:插入和删除很快,只需要修改相邻元素指针,但是查找很慢,需要从第一个元素逐个遍历查找
有序数组支持折半查找(插入、删除很慢哦),链表不支持折半查找
跳表:在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。

二、不同数据类型的常用操作

1、字符串常用操作

最简单的键值对存储类型,常用于缓存单一值(eg:数字、字符串)

序号语法含义示例备注
1SET key value存入字符串键值对
2MSET key value [key value…]批量存储字符串键值对
3SETNX key value存入一个不存在的字符串键值对
4GET key获取一个字符串键值
5MGET key [key …]批量获取字符串键值
6DEL key [key …]删除一个键
7EXPIRE key seconds设置一个键的过期时间(秒)
8INCR key将key中存储的数字值+1
9DECR key将key中存储的数字值减1
10INCR key increment将key中存储的数字值加上increment
11DECR key decrement将key中存储的数字值减decrement

应用场景:
计数器:
INCR article:readcount:{1001} //将1001号文章阅读次数进行+1操作
GET article:readcount:{1001} //返回1001号文章阅读量

在分布式系统中容易漏+1的情况,可通过批量生成序列号提升性能:
INCRBY orderId 100 //批量获取100个序列号

2、hash结构

键值对集合,适合存储对象类型数据(eg:用户信息、商品信息)

序号语法含义示例备注
1HSET key field value存储一个哈希表key的键值
2HSETNX key field value存储一个不存在的哈希表key的键值
3HMSET key field value [field value …]在一个哈希表key中存储多个键值对
4HGET key field获取哈希表key对应的field键值
5HMGET key field [field…]批量获取哈希表key中多个field键值
6HDEL key field [field…]删除哈希表key中的field键值
7HLEN key返回哈希表key中field的数量
8HGETALL返回哈希表key中所有的键值
9HINCRBY key field increment为哈希表key中field键的值加上增量increment

应用场景:对象缓存(电商购物车)
HMSET user {userId}:name yz. {userId}:age 18
HMSET user {userId}:name {userId}:age
eg:购物车
以用户id为key,以商品id为fiels,以商品数量为value
购物车操作:

主要操作语句
添加商品hset cart:8304 9999 1
增加数量hincrby cart:8304 9999 1
商品总数hlen cart:8304
删除商品hdel cart:8304 9999
获取购物车所有商品hgetall cart:8304

3、list结构

是一个按照插入顺序排序的字符串元素集合(有序列表),集合中的元素可以重复,支持从头部或尾部插入/删除元素,可实现队列、栈等数据结构,适合消息队列等场景
常用操作

序号语法含义示例备注
1LPUSH key value[walue …]将一个或多个value插入到key列表的表头(最左边)
2RPUSH key value[walue …]将一个或多个value插入到key列表的表头(最右边)
3LPOP key移除并返回key列表的头元素
4RPOP key移除并返回key列表的尾元素
5LRANGE key start stop返回列表key中指定区间的元素,区间以偏移量start和stop指定
6BLPOP key [key …] timeout从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0则一直阻塞等待
7BRPOP key[key …] timeout从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0则一直阻塞等待

应用场景:常用分布式数据结构
栈(后进先出):stack=LPUSH+LPOP
队列(先进先出):queue = LPUSH+RPOP
阻塞队列:Blocking MQ = LPUSH+BRPOP

》微信公众号消息流
YZ关注了“XX本地宝”、“海底捞火锅”等
XX本地宝发送消息,消息ID为0909
LPUSH msg:{YZ-id} 0909
海底捞发送消息,消息id:0808
LPUSH msg:{YZ-id} 0808
YZ查看前五条消息
LRANGE msg:{YZ-id} 0 4

4、set-无序集合

一个无序、唯一的字符串集合,不允许重复的成员。可以对集合执行添加、删除和判断成员是否存在等操作,也支持集合之间的交集、并集、差集运算,适合用户标签等场景

常用操作

序号语法含义示例备注
1SADD key member [member…]往集合key中存入元素,元素存在择忽略,若key不存在则新建
2SREM key member [menber…]从集合key中删除元素
3SMEMBERS key获取集合key中所有元素
4SCARD key获取集合key的元素个数
5SISMEMBER key member判断member元素是否存在于集合key中
6SRANDMEMBER key [count]从集合key中选出count哥元素,元素不从key中删除
7SPOP key [count]从集合key中选出count哥元素,元素从key中删除
8SINTER key [key…]交集SINTER set1 set2 set3
9SINTERSTORE destination key [key…]将交集结果存入新集合destination中
10SUNION key [key…]并集运算SUNION set1 set2 set3
11SUNIONSTORE destination key [key…]将并集结果存入新集合destination中
12SDIFF key [key…]差集运算
13SDIFFSTORE destination key [key…]将差集结果存入新集合destination中

应用场景
》抽奖小程序
1、添加到抽奖池中:-》SADD key {userid}
2、查看参与抽奖的所有用户->SMEMBERS key
3、抽取n名获奖者
不带删除用户的抽奖:SRANDMEMBER key [n]
带删除的用户抽奖:SPOP key [n]

》朋友圈点赞
点赞-〉SADD like: {消息id} {用户id}
取消点赞-》SREM like:{消息id} {用户id}
获取点赞的用户列表-〉SMEMBERS like:{消息id}
获取点赞用户数-》SCARD like:{消息id}
检查用户是否点过赞-〉SISMEMBER like:{消息id} {用户id}

》集合的运算可实现微信关注模型
邢一关注的集合:Xingset1 ={“邢三”,“李四”}
邢二关注的集合:Xingset2 ={“邢一”,“邢三”,“李四”,“王五”}
邢三关注的集合:Xingset3 ={“邢一”,“邢二”,“李四”,“王五”,“赵六”}
李四关注的集合:Liset4 ={“邢一”,“李四”,“王五”,“赵六”}

邢一和邢二共同关注的人:
SINTER Xingset1 Xingset2 结果:{“邢三”,“李四”}

邢一关注的人是否关注了邢二:
SISMEMBER Xingset3 “邢二”
SISMEMBER Liset4 “邢二”

邢一和邢二是兄弟,邢一可能认识的人:
SDIFF Xingset2 Xingset1 结果:{“邢一”,“王五”}

》集合在筛选中经常遇到多种组合筛选:
eg:火车票查询时:可添加 时段、选择车次类型(只看高铁/动车、只看普通车)、选择查看是否有票等等,这种场景均可使用set取交集来实现- SINTER
eg:购物:选择商品时也是如此
在这里插入图片描述

5、Zset(Sorted Set)-有序集合

Zset是一个有序的字符串集合,每个成员都关联着一个分数。集合中的成员根据分数大小进行排序,可以进行范围查询和按分数排名操作,常用于排行榜、优先队列等场景
常用操作

序号语法含义示例备注
1ZADD key score member [[score member]…]往有序集合key中,加入带分值元素
2ZREM key member [member…]从有序集合key中删除元素
3ZSCORE key member返回有序集合key中元素member的分值
4ZINCRBY key increment member为有序集合key中元素member的分值加上increment
5ZCARD key返回有序集合key中元素个数
6ZRANGE key start stop [WITHSCORES]正序获取有序集合key从start下标到stop下标的元素
7ZREVRANGE key start stop [WITHSCORES]倒序货物有序集合key从start下标到stop下标的元素
8ZUNIONSTORE destkey numkeys key [key …]并集计算
9ZINTERSTORE destkey numkeys key [key …]交集计算

除了这些主要的数据类型,Redis还提供了一些特殊的数据结构和功能,如HyperLogLog用于基数统计,Geo用于地理位置信息存储,Pub/Sub用于发布和订阅等。通过这些不通的数据类型,Redis可以灵活的存储和操作各种类型的数据,满足不同应用场景下的需求。

三、说明
数据结构是自动进行转化的,zset为例进行说明
Redis中的zset(sorted set)数据结构在元素数量较少且每个元素值较短时使用ziplist作为底层实现,当这个条件不满足时会转换为skiplist作为新的底层实现。
ziplist是一种紧凑的连续内存存储结构,适合存储小数据。而skiplist是一种复杂的多层次的链表结构,适合大数据的随机访问和插入。

转换条件:
当zset中的元素数量超过zset-max-ziplist-entries配置项的值时。
当zset中每个元素的大小超过zset-max-ziplist-value配置项的值时。

这两个配置项可以在redis.conf文件中设置,默认值一般为-1,表示不限制。如果你设置了这些值,当zset满足这些条件时,它会自动从ziplist转换为skiplist。

注意:Redis的版本更新可能会改变这些条件,请参照你正在使用的Redis版本的官方文档。


http://www.mrgr.cn/news/34172.html

相关文章:

  • 数据分析那些事儿——关于A/B实验
  • 一个简单ASP.NET购物车设计
  • Ubuntu中以root身份运行Qt创建的项目
  • uniCloud云对象调用第三方接口,根据IP获取用户归属地的免费API接口,亲测可用
  • Android GPU纹理数据拷贝
  • dockers+Jenkins+git+自动化框架
  • 核心复现—计及需求响应的区域综合能源系统双层优化调度策略
  • 网安新声 | 黎巴嫩BP机爆炸事件带来的安全新挑战与反思
  • ubuntu安装gitlab-runner
  • 力扣647-回文子串(Java详细题解)
  • 光控资本:沪指涨0.72%,煤炭、银行板块拉升,车路云概念活跃
  • Linux: eBPF: libbpf-bootstrap-master 编译
  • 保姆级 Stable Diffusion 教程,看完这篇就够了!
  • 多语言文本 AI 情感分析 API 数据接口
  • JSP 指令标识和脚本标识的使用
  • MongoDB-索引的使用和索引类型
  • 图片和文本的一些处理方案——图片等比例缩放、背景图片调节、文本溢出
  • 【数据结构】Java的HashMap 和 HashSet 大全笔记,写算法用到的时候翻一下,百度都省了!(实践篇)
  • 【micro】糖果配色
  • nginx反向代理tomcat多实例
  • 云盘还安全么?阿里云盘出现BUG,惊现大量陌生人照片
  • FreeRTOS下UART的封装
  • 基于DeepFace深度学习模型的离线版人脸识别API接口实现(类似百度在线API接口)
  • 3dmax选择全解:高效建模的关键技巧
  • Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具
  • PyCharm远程源代码缓存与代码补全功能