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:数字、字符串)
序号 | 语法 | 含义 | 示例 | 备注 |
---|---|---|---|---|
1 | SET key value | 存入字符串键值对 | ||
2 | MSET key value [key value…] | 批量存储字符串键值对 | – | |
3 | SETNX key value | 存入一个不存在的字符串键值对 | ||
4 | GET key | 获取一个字符串键值 | – | |
5 | MGET key [key …] | 批量获取字符串键值 | ||
6 | DEL key [key …] | 删除一个键 | – | |
7 | EXPIRE key seconds | 设置一个键的过期时间(秒) | ||
8 | INCR key | 将key中存储的数字值+1 | – | |
9 | DECR key | 将key中存储的数字值减1 | ||
10 | INCR key increment | 将key中存储的数字值加上increment | – | |
11 | DECR key decrement | 将key中存储的数字值减decrement |
应用场景:
计数器:
INCR article:readcount:{1001} //将1001号文章阅读次数进行+1操作
GET article:readcount:{1001} //返回1001号文章阅读量
在分布式系统中容易漏+1的情况,可通过批量生成序列号提升性能:
INCRBY orderId 100 //批量获取100个序列号
2、hash结构
键值对集合,适合存储对象类型数据(eg:用户信息、商品信息)
序号 | 语法 | 含义 | 示例 | 备注 |
---|---|---|---|---|
1 | HSET key field value | 存储一个哈希表key的键值 | ||
2 | HSETNX key field value | 存储一个不存在的哈希表key的键值 | – | – |
3 | HMSET key field value [field value …] | 在一个哈希表key中存储多个键值对 | ||
4 | HGET key field | 获取哈希表key对应的field键值 | – | – |
5 | HMGET key field [field…] | 批量获取哈希表key中多个field键值 | ||
6 | HDEL key field [field…] | 删除哈希表key中的field键值 | – | – |
7 | HLEN key | 返回哈希表key中field的数量 | ||
8 | HGETALL | 返回哈希表key中所有的键值 | – | – |
9 | HINCRBY 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结构
是一个按照插入顺序排序的字符串元素集合(有序列表),集合中的元素可以重复,支持从头部或尾部插入/删除元素,可实现队列、栈等数据结构,适合消息队列等场景
常用操作
序号 | 语法 | 含义 | 示例 | 备注 |
---|---|---|---|---|
1 | LPUSH key value[walue …] | 将一个或多个value插入到key列表的表头(最左边) | ||
2 | RPUSH key value[walue …] | 将一个或多个value插入到key列表的表头(最右边) | – | – |
3 | LPOP key | 移除并返回key列表的头元素 | ||
4 | RPOP key | 移除并返回key列表的尾元素 | ||
5 | LRANGE key start stop | 返回列表key中指定区间的元素,区间以偏移量start和stop指定 | ||
6 | BLPOP key [key …] timeout | 从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0则一直阻塞等待 | ||
7 | BRPOP 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-无序集合
一个无序、唯一的字符串集合,不允许重复的成员。可以对集合执行添加、删除和判断成员是否存在等操作,也支持集合之间的交集、并集、差集运算,适合用户标签等场景
常用操作
序号 | 语法 | 含义 | 示例 | 备注 |
---|---|---|---|---|
1 | SADD key member [member…] | 往集合key中存入元素,元素存在择忽略,若key不存在则新建 | ||
2 | SREM key member [menber…] | 从集合key中删除元素 | – | – |
3 | SMEMBERS key | 获取集合key中所有元素 | ||
4 | SCARD key | 获取集合key的元素个数 | ||
5 | SISMEMBER key member | 判断member元素是否存在于集合key中 | ||
6 | SRANDMEMBER key [count] | 从集合key中选出count哥元素,元素不从key中删除 | ||
7 | SPOP key [count] | 从集合key中选出count哥元素,元素从key中删除 | ||
8 | SINTER key [key…] | 交集 | SINTER set1 set2 set3 | |
9 | SINTERSTORE destination key [key…] | 将交集结果存入新集合destination中 | ||
10 | SUNION key [key…] | 并集运算 | SUNION set1 set2 set3 | |
11 | SUNIONSTORE destination key [key…] | 将并集结果存入新集合destination中 | ||
12 | SDIFF key [key…] | 差集运算 | ||
13 | SDIFFSTORE 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是一个有序的字符串集合,每个成员都关联着一个分数。集合中的成员根据分数大小进行排序,可以进行范围查询和按分数排名操作,常用于排行榜、优先队列等场景
常用操作
序号 | 语法 | 含义 | 示例 | 备注 |
---|---|---|---|---|
1 | ZADD key score member [[score member]…] | 往有序集合key中,加入带分值元素 | ||
2 | ZREM key member [member…] | 从有序集合key中删除元素 | – | – |
3 | ZSCORE key member | 返回有序集合key中元素member的分值 | ||
4 | ZINCRBY key increment member | 为有序集合key中元素member的分值加上increment | ||
5 | ZCARD key | 返回有序集合key中元素个数 | ||
6 | ZRANGE key start stop [WITHSCORES] | 正序获取有序集合key从start下标到stop下标的元素 | ||
7 | ZREVRANGE key start stop [WITHSCORES] | 倒序货物有序集合key从start下标到stop下标的元素 | ||
8 | ZUNIONSTORE destkey numkeys key [key …] | 并集计算 | ||
9 | ZINTERSTORE 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版本的官方文档。