Redis系列二:基本数据结构及操作

Redis常用五种数据结构

  1. 字符串类型 string:String(对应Java中的String,下同)
  2. 哈希类型 hash:HashMap
  3. 列表类型 list:linkedlist,支持重复元素
  4. 集合类型 set:HashSet,不允许重复元素
  5. 有序集合类型 sorted_set:TreeSet不允许重复元素,且元素有顺序

Redis数据存储格式

  • Redis自身是一个Map,其中所有的数据都是采用key:value的形式存储
  • 数据类型指的是存储的数据的类型,也就是value部分,key部分永远是字符串
    在这里插入图片描述

1.string类型

  • 存储的数据:单个数据,最简单的数据结存储结构,也是最常用的数据存储类型
  • 存储数据的格式:一个存储空间保存一个数据
  • 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用。

string基本操作

  • 添加/修改数据
set key value
  • 获取数据
get key
  • 删除数据
del key
  • 添加/修改多个数据
mset key1 value1 key2 value2 ...
  • 获取多个数据
mget key1 key2 ...
  • 获取数据字符个数
strlen key
  • 追加信息到原始信息后部(如果原始存在就追加,否则新建)
append key value
单数据操作和多数据操作的选择

如果使用单数据操作set进行三次设置key和value,消耗时间为3个发送时间+3个执行时间+3个结果返回时间。

如果使用多数据mset进行设置,消耗时间为1个发送时间+3个执行时间+1个结果返回时间

多数据操作一般会优于单数据操作,减少了时间,但也不一定如此。因为多数据的发送和结果返回时间变长了,当多个数据合成一条操作时,如果执行时间过长会造成阻塞。大数据量执行操作时,先进行切割成适当大小。

string类型数据的扩展操作

业务场景
数据库分表的时候,要保证数据库表中的主键ID唯一不重复。

  • 设置数值数据增加指定范围的值
incr key                    自增+1
incrby key increment        增加increment整数
incrbyfloat key increment   增加increment小数
  • 设置数值减小至指定范围的值
decr key                    自减1
decrby key increment        自减increment整数

注意:

  1. 减没有小数操作,可以利用增加负数达到减的效果。
  2. string在Redis内部就是一个字符串,遇到incr,decr等时会转成数值进行计算。如果不能转换成数值,或者超出数值范围,将报错。
  3. Redis所有操作都是原子性的,采用单线程处理所有任务,命令是一个一个执行的,因此无需考虑并发的影响
适用场景1
  • redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性。
  • 此方案适用于所有数据库,且支持数据库集群

业务场景
电商商家开启热门商品推荐,热门商品不能一直处于热门期,每种商品热门期维持3天, 3天后自动取消热门。

新闻网站会出现热点新闻,热点新闻最大的特征是时效性,如何自动控制热点新闻的时效性。

解决方案

  • 设置数据具有指定的生命周期
setex key seconds value
psetex key milliseconds value
适用场景2
  • redis控制数据的生命周期,通过数据是否生效控制业务行为,适用于所有具有时效性限定控制的操作。

业务场景
主页高频访问信息显示控制,例如新浪微博大V主页显示粉丝数与微博数量

解决方案

  • 在redis中为大V设定用户信息,以用户主键和属性值作为Key,后来设定定时刷新策略
    eg: user: 在这里插入图片描述
    id:100200321:fans --> 12210947
    eg: user🆔100200321:blogs --> 6164
    eg: user🆔100200321:focus --> 83

  • 在redis中以json格式存储大V用户信息,定时刷新
    eg: user🆔100200321 --> {“id”:100200321,“name”:“春晚”,“fans”:12210947,“blogs”:6164,“focus”:83}

适用场景3
  • redis应用于各种结构性非结构型高热度数据访问加速

key的设置约定
表名:主键名:主键值:字段名

例如 user🆔100200321:name

2.hash类型

存储的困惑

对象类数据的存储如果具有较频繁的更新需求操作就会显得笨重

hash类型

  • 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
  • 需要的存储结构:一个存储空间保存多个键值对数据
  • hash类型:底层使用哈希表结构实现数据存储
    在这里插入图片描述

hash类型的基本数据操作

  • 添加/修改数据
hset key field value
  • 获取数据
hget key field
hgetall key
  • 删除数据
hdel key field1 [field2]
  • 添加/修改多个数据
hmset key field1 value1 field2 value2 ...
  • 获取多个数据
hmget key field1 field2 ...
  • 获取哈希表中字段的数量
hlen key
  • 获取哈希表中是否存在指定的字段
hexists key field

hash类型的数据扩展操作

  • 获取哈希表中所有字段名或字段值
hkeys key
hvals key
  • 设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment

hash数据类型数据操作注意事项

  • hash类型下的value只能存储字符串,不允许存储其它数据类型,禁止套娃!
  • 每个hash可以存储2的32次方-1个键值对
  • hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计之初不是为存储大量对象设计的,切记不可滥用
  • hgetall可以获取全部属性,但内部fields过多的话,遍历整体数据效率就会很低,有可能成为数据访问瓶颈。

hash类型应用场景

业务场景
电商网站购物车的设计与实现

解决方案

  • 以客户id作为key,每位客户创建一个hash存储结构存储对应的购物车信息
  • 将商品编号作为field,购买数量作为value进行存储
  • 添加商品:追加全新的field与value
  • 浏览:遍历hash
  • 更改数量:自增/自减,设置value值
  • 删除商品:删除field
  • 清空:删除key

这样我们仅仅是把数据存到了redis中,并没有起到加速的作用,商品信息还是需要二次查询数据库。

  • 每条购物车中的商品记录保存成两条field
  • field1专用于保存购买数量
    • 命名格式:商品id:nuns
    • 保存数据:数值
  • fields2专用于保存购物车中显示的信息,包含文字描述,图片地址,所属商家信息等
    • 命名格式:商品id:info
    • 保存数据:json

hsetnx key field value

Redis Hsetnx 命令用于为哈希表中不存在的的字段赋值 。
如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
如果字段已经存在于哈希表中,操作无效。
如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。

适用场景4
  • redis应用于购物车数据存储设计

业务场景
双十一促销,销售手机充值卡的商家对联通、移动、电信的30元、50元、100元商品退出抢购活动,每种商品抢购上线1000张

解决方案

  • 商家ID为key
  • 抢购商品id为field
  • 抢购商品数量作为对应value
  • 抢购时使用降值的方式控制产品数量
适用场景5
  • redis应用于抢购,限购类、限量发放优惠券、激活码等业务的数据存储设计

3.list类型

  • 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
  • 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
  • list类型:保存多个数据,底层使用双向链表存储结构实现

list类型数据基本操作

  • 添加/修改数据
lpush key value1 [value2] ...
rpush key value1 [value2] ...
  • 获取数据
lrange key start stop
lindex key index
llen key
  • 获取并移除数据
lpop key 
rpop key

list数据类型扩展操作

  • 规定时间内获取并移除数据
blpop key1 [key2] timeout
brpop key1 [key2] timeout
brpoplpush source destination timeout  列表中取出最后一个元素,并插入到另外一个列表的头部

list类型数据操作注意事项

  • list保存的数据都是string类型,总容量为2的32次方-1
  • list具有索引的概念
  • 获取全部数据操作结束索引设置为-1
  • list可以对数据进行分页操作,通常第一页信息来自于list,第二页及更多通过数据库的形式加载

list类型应用场景

业务场景
微信朋友圈点赞,按点赞顺序显示点赞好友信息
如果取消点赞,移除对应好友信息

解决方案

点赞:rpush
取消:
    移除指定数据 lrem key count value
适用场景6
  • redis应用于具有操作先后顺序的数据控制

业务场景
企业运营过程中,系统将产生大量的运营数据,如何保障多台服务器操作日志的统一顺序输出?
解决方案

  • 依赖list数据具有殊勋的特征对信息进行处理
  • 使用队列模型解决多路信息汇总合并的问题
  • 使用栈模型解决最新消息问题
适用场景7
  • redis应用于最新消息展示

4.set类型

set类型

  • 新的存储需求:存储大量的数据,在查询方面提供更高的效率
  • 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
  • set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),且值是不允许重复的
    在这里插入图片描述

set类型的基本操作

  • 添加数据
sadd key member1 [member2]
  • 获取全部数据
smembers key
  • 删除数据
srem key member1 [member2]
  • 获取集合中数据总量
scard key
  • 判断集合中是否包含指定数据
sismember key menber

set类型数据的扩展操作

  • 随机获取集合中指定数量的数据
srandmember key [count]
  • 随机获取集合中某个数据并将该数据移出集合
spop key [count]

业务场景
用户首次使用头条的时候会设置3项爱好的内容,但是后期为了增加用户的活跃度、兴趣点,必须让用户对其它信息类别产生兴趣,增加客户的留存度,如何实现?
问题解决

  • 系统分析出各个类别的最新或最热信息条目并组织成set集合
  • 随机挑选其中部分信息
  • 配合用户关注的信息分类中的热点组织成展示的全信息集合
适用场景8
  • reis应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热卖旅游线路等。

业务场景
美团外卖为了提升成单量,必须帮助用户挖掘美食需求,如何推荐给用户最适合自己的美食?

QQ新用户入网年龄越来越低,这些用户的朋友圈交际圈非常小,往往集中在一所学校设置一个班级中,如何帮助用户快速积累好友带来更多的活跃度?

解决方案

  • 求两个集合的交、并、差集
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]
  • 求两个集合的交、并、差集并存储到指定集合中
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
  • 将指定数据从原始集合中移动到目标集合中
smove source destination member

在这里插入图片描述

适用场景9
  • redis应用同类信息的关联所有,二度关联搜索,深度关联搜索
  • 显示共同关注,共同好友
  • 由用户A出发,获取用户B的好友信息列表等
适用场景10
  • redis应用于同类型数据的快速去重
适用场景11
  • redis应用于基于黑白名单设定的服务控制

5.sorted_set类型

sorted_set类型

  • 新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
  • 需要的存储结构:新的存储模型,可以保存可排序的数据
  • sorted_set类型:在set的存储结构基础上添加可排序字段

sorted_set类型数据的基本操作

  • 添加操作
zadd key score1 member1 [score2 member2]
  • 获取全部数据
zrange key start stop [WITHSCORES]
zrevrange key start stop [WITHSCORES]
  • 删除数据
zrem key member [member ...]
  • 按条件获取数据
zrangebyscore key min max [WITHSCORES] [LIMIT]
zrevrangebyscore key max min [WITHSOCRES]
  • 按条件删除数据
zremrangebyrank key start stop
zremrangebyscore key min max
  • 获取集合数据总量
zcard key
zcount key min max
  • 集合交、并操作
zinterstore destination numkeys key [key ...]
zunionstore destination numkeys key [key ...]
redis适用场景12
  • 定时任务执行书序管理或任务过期管理
  • 及时任务/消息队列执行管理
  • 按次结算的服务控制
  • 基于时间顺序的数据操作,而不关注具体时间

查看更多:Redis系列全

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值