Redis 数据类型和详解

 

目录

 概览

一、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

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

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

SET

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

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

HASH

包含键值对的无序散列表

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

ZSET(有序集合)

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

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

一、string类型

1、基本方法

set <key> <value>添加键值对
get <key>查询对应键值
append <key> <value>将给定的<value>添加到原值的末尾
strlen <key>获得值的长度
setnx <key> <value>只有在key不存在时设置key的值
incr <key>将key中储存的数字值增1;只能对数字值操作,如果为空,新增值为1
decr <key>将key中储存的数字值减1;只能对数字值操作,如果为空,新增值为-1
incrby / decrby <key> <步长>将key中存储的数字值增减。自定义步长
mset <key1> <value1> <key2> <value2> ...同时设置一个或多个key-value对
mget <key1> <key2> <key3> ...同时获取一个或多个value
msetnx <key1> <value1> <key2> <value2> ...同时设置一个或多个key-value对。当且仅当所有给定的key都不存在
getrange <key> <起始位置> <结束位置>获得值的范围,类似java中的substring
setrange <key> <起始位置> <value>用<value>覆写<key>所存储的字符串值, 从<起始位置>开始
setex <key> <过期时间> <value>设置键值的同时,设置过期时间,单位秒
getset <key> <value>以新换旧,设置了新值同时获得旧值
del <key> [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 <key> <value1> <value2> ...从左边/右边插入一个或多个值
lpop/rpop <key>从左边/右边吐出一个值。值在键在,值亡键亡
rpoplpush <key1> <key2> 从<key1>列表右边吐出一个值,插到<key2>列表左边
lrange <key> <start> <stop>按照索引下标获得元素(从左到右)
lindex <key> <index>按照索引下标获得元素(从左到右)
llen <key>获得列表长度
linsert <key> before <value> <newvalue>在<value>的前面插入<newvalue>
lrem <key> <n> <value>从左边删除n个value(从左到右)
blpop/brpop <key> [key...] timeout

从key列表左边/右边弹出一个元素,若列表中没有元素,阻塞等待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 <key> <value1> <value2> ...将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略
smembers <key>取出该集合的所有值
sismember <key> <value>判断集合<key>是否为含有该<value>值,有返回1,没有返回0
scard <key>返回该集合的元素个数
srem <key> <value1> <value2>删除集合中的某个元素
spop <key> <n>随机从该集合中吐出一个或多个值
srandmember <key> <n>随机从该集合中取出n个值。不会从集合中删除
sinter <key1> <key2>返回两个集合的交集元素
sunion <key1> <key2>返回两个集合的并集元素
sdiff <key1> <key2>返回两个集合的差集元素
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 <key> <field> <value>给<key>集合中的<field>键赋值<value>
hget <key> <field>从<key>集合<field>取出value
hmset <key> <field1> <value1> <field2> <value2> ...批量设置hash的值
hexists <key> <field>查看哈希表key中,给定域field是否存在
hkeys <key>列出该hash集合中的所有field
hvals <key>列出该hash集合中的所有value
hincrby <key> <field> <increment>为哈希表key中的域field的值加上增量increment
hsetnx <key> <field> <value>将哈希表key中的域field的值设置为value,当且仅当域field不存在
hmget <key> <field1> <field2>...列出该hash集合对应field的value值
hdel <key> <field1> <field2>...删除hash表中field值
hlen <key>返回hash表中field的数量
hgetall <key>返回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 <key> <score1> <member> <score2> <member> ...将一个或多个member元素及其score值加入到有序集key当中
zrange <key> <start> <stop> [WITHSCORES]正序返回有序集key中,下标在<start> <stop>之间的元素。带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 <key> <increment> <member>为元素的score加上增量
zrem <key> <member>删除该集合下,指定值的元素
zcount <key> <min> <max>统计该集合,分数区间内的元素个数
zrank <key> <member>返回该值在集合中的排名,从0开始
zscore <key> <member>返回有序集合key中元素member的分值
zrevrange <key> <start> <stop> [WITHSCORES]倒序返回有序集key中,下标在<start> <stop>之间的元素。带WITHSCORES,可以让分数一起和值返回到结果集
zunionstore destkey numkeys key [key...]并集运算
zinterstore destkey numkeys key [key...]交集运算

更多 

2、应用场景

(1) 实现排行榜

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值