Redis 数据类型和详解

Redis 数据类型和详解,第1张

 

目录

 概览

一、string类型

1、基本方法

2、应用场景

二、list类型

1、基本方法

2、 应用场景

三、set 类型

1、基本方法

2、 应用场景

四、hash类型 

1、基本方法

2、 应用场景

3、 优缺点

五、zset类型

1、基本方法

2、应用场景


 概览

Redis 数据库支持五种数据类型。

  • 字符串(string)
  • 哈希(hash)
  • 列表(list)
  • 集合(set)
  • 有序集合(sorted set)zset

结构类型

结构存储的值

结构的读写能力

STRING

可以是字符串、整数或者浮点数

对整个字符串或者字符串的其中一部分执行 *** 作;对整数和浮点数进行自增(increment)或者自减(decrement) *** 作

LIST

一个链表,链表上的每个节点都包含了一个字符串

从链表的两端推入或者d出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或者移除元素

SET

包含字符串的无序收集器(unordered collection),并且被包含的每个字符串都是独一无二、各不相同的

添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素

HASH

包含键值对的无序散列表

添加、获取、移除单个键值对;获取所有键值对

ZSET(有序集合)

字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定

添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素

一、string类型 1、基本方法
set 添加键值对
get 查询对应键值
append 将给定的添加到原值的末尾
strlen 获得值的长度
setnx 只有在key不存在时设置key的值
incr 将key中储存的数字值增1;只能对数字值 *** 作,如果为空,新增值为1
decr 将key中储存的数字值减1;只能对数字值 *** 作,如果为空,新增值为-1
incrby / decrby <步长>将key中存储的数字值增减。自定义步长
mset ...同时设置一个或多个key-value对
mget ...同时获取一个或多个value
msetnx ...同时设置一个或多个key-value对。当且仅当所有给定的key都不存在
getrange <起始位置> <结束位置>获得值的范围,类似java中的substring
setrange <起始位置> 覆写所存储的字符串值, 从<起始位置>开始
setex <过期时间> 设置键值的同时,设置过期时间,单位秒
getset 以新换旧,设置了新值同时获得旧值
del [key.....]删除key
expire key seconds设置key的过期时间

 更多

2、应用场景

(1) 单值缓存

set key value

get key

(2) 对象缓存

set user:1 value(json格式数据)

mset user:1:name zhuge user:1:balance 1888

mget user:1:name user:1:balance

(3) 分布式锁

setnx product:10001 true // 返回1代表获取锁成功

setnx product:10001 true // 返回0代表获取锁失败

.... 执行业务 *** 作

del product:10001 // 执行完业务释放锁

set product:10001 true ex 10 nx // 防止程序意外终止导致死锁

(4) 计数器

incr article:readcount:{文章id}

get article:readcount:{文章id}

(5) Web集群session共享

spring session + redis实现session共享

(6) 分布式系统全局序列号

incrby orderId 1000 // redis批量生成序列号提升性能

二、list类型

1、基本方法
lpush/rpush ...从左边/右边插入一个或多个值
lpop/rpop 从左边/右边吐出一个值。值在键在,值亡键亡
rpoplpush 列表右边吐出一个值,插到列表左边
lrange 按照索引下标获得元素(从左到右)
lindex 按照索引下标获得元素(从左到右)
llen 获得列表长度
linsert before 的前面插入
lrem 从左边删除n个value(从左到右)
blpop/brpop [key...] timeout

从key列表左边/右边d出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待

更多

2、 应用场景

(1) 常用的数据结构

Stack = LPUSH + LPOP

Queue = LPUSH + RPOP

Blocking MQ(阻塞队列) = LPUSH + BRPOP

(2) 微信公众号消息流

xxx关注了MacTalk,刘备说车等大V

 MacTalk发消息,消息Id为10018

LPUSH msg:{xxx-ID} 10018

刘备说车发消息,消息Id为10086

LPUSH msg:{xxx-ID} 10086

xx查看最新消息

LRANGE msg:{xxx-ID} 0 4

 

三、set 类型

1、基本方法
sadd ...将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略
smembers 取出该集合的所有值
sismember 判断集合是否为含有该值,有返回1,没有返回0
scard 返回该集合的元素个数
srem 删除集合中的某个元素
spop 随机从该集合中吐出一个或多个值
srandmember 随机从该集合中取出n个值。不会从集合中删除
sinter 返回两个集合的交集元素
sunion 返回两个集合的并集元素
sdiff 返回两个集合的差集元素
sinterstore destination key [key...]将交集结果存入新集合destination中
sunionstore destination key [key...]将并集结果存入新集合destination中
sdiffstore destination key [key...]将差集结果存入新集合destination中

更多

2、 应用场景

(1) 微信抽奖小程序

  • 点击参与抽奖加入集合 sadd key {userID}
  • 查看参与抽奖所有用户 smembers key
  • 抽取count名中奖者  srandmember key [count] 抽中不移除 / spop key [count] 抽中并移除

(2) 微信微博点赞,收藏,标签

  • 点赞sadd like:{消息ID} {用户ID}
  • 取消点赞 srem like:{消息ID} {用户ID}
  • 检查用户是否点过赞 sismember like:{消息ID} {用户ID}
  • 获取点赞的用户列表 smembers like:{消息ID}
  • 获取点赞用户数 scard like:{消息ID}

(3) 集合 *** 作

sinter set1 set2 set3 -> {c}

sunion set1 set2 set3 -> {a, b, c, d, e}

sdiff set1 set2 set3 -> {a}

(4) 集合 *** 作实现微博微信关注模型

  • eg.  诸葛老师关注的人:zhugeSet -> {guojia, xushu}

              杨过老师关注的人:    yangguoSet -> {zhuge, baiqi, guojia, xushu}

              郭嘉老师关注的人: guojiaSet -> {zhuge, yangguo, baiqi, xushu, xunyu}

  • 诸葛老师和杨过老师共同关注的人:sinter zhugeSet yangguoSet
  • 诸葛老师关注的人也关注杨过老师:sismember guojiaSet yangguo
  • 诸葛老师可能认识的人   sdiff yangguoSet zhuguSet

(5) 集合 *** 作实现电商商品筛选

sadd brand:huawei p40sadd brand:xiaomi mi-10

sadd brand:iphone iphone12

sadd os:android p40 mi-10

sadd cpu:brand:intel p40 mi-10

sadd ram:8G p40 mi-10 iphone12

sinter os:android cpu:brand:intel ram:8G -> {p40, mi-10}

四、hash类型 

1、基本方法
hset 集合中的键赋值
hget 集合取出value
hmset ...批量设置hash的值
hexists 查看哈希表key中,给定域field是否存在
hkeys 列出该hash集合中的所有field
hvals 列出该hash集合中的所有value
hincrby 为哈希表key中的域field的值加上增量increment
hsetnx 将哈希表key中的域field的值设置为value,当且仅当域field不存在
hmget ...列出该hash集合对应field的value值
hdel ...删除hash表中field值
hlen 返回hash表中field的数量
hgetall 返回hash表中所有的键值

更多

2、 应用场景

(1) 对象缓存

hmset user {userId}:name zhuge {userId}:balance 1888

hmset user 1:name zhuge 1:balance 1888

hmget user 1:name 1:balance

(2) 电商购物车

  • eg. 以用户id为key 商品id为field、 商品数量为value
  • 添加商品 ----> hset cart:1001 10088 1
  • 添加数量 ----> hincrby cart:1001 10088 1
  • 商品总数 ----> hlen cart:1001
  • 删除商品 ----> hdel cart:1001 10088
  • 获取购物车所有商品 ----> hgetall cart:1001

3、 优缺点

优点:

同类数据归类整合存储,方便数据管理

相比string *** 作消耗内存与cpu更小

相比string存储更节省空间

缺点:

过期功能不能使用在field上,只能用在key上

redis集群架构下不适合大规模使用

五、zset类型

1、基本方法
zadd ...将一个或多个member元素及其score值加入到有序集key当中
zrange [WITHSCORES]正序返回有序集key中,下标在 之间的元素。带WITHSCORES,可以让分数一起和值返回到结果集
zrangebyscore key min max [withscores] [limit offset count]返回有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。有序集成员按score值递增(从小到大)次序排列
zrevrangebyscore key max min [withscores] [limit offset count]同上,改为从大到小排列
zincrby 为元素的score加上增量
zrem 删除该集合下,指定值的元素
zcount 统计该集合,分数区间内的元素个数
zrank 返回该值在集合中的排名,从0开始
zscore 返回有序集合key中元素member的分值
zrevrange [WITHSCORES]倒序返回有序集key中,下标在 之间的元素。带WITHSCORES,可以让分数一起和值返回到结果集
zunionstore destkey numkeys key [key...]并集运算
zinterstore destkey numkeys key [key...]交集运算

更多 

2、应用场景

(1) 实现排行榜

  • 点击新闻 zincrby hotNews:20210819 1
  • 展示当日排行前十 zrevrange hotNews:20210819 0 9 withscores

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/731786.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存