暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis#1——Redis的基本使用

suger 2023-04-23
203

Redis#1——Redis的基本使用

 


  • 1 Redis基本操作

    • 1.1 帮助命令

  • 2 redis应用场景

  • 3 String

    • 3.1 基本操作

    • 3.2 key的设置约定:

    • 3.3 String类型的扩展操作

    • 3.4 String作为数值操作

  • hash

    • hash存储优化

    • 基本操作

    • 扩展操作

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

    • 业务场景

  • list

    • list类型数据基本操作

    • 扩展操作

    • list类型数据操作注意事项

  • set

    • set类型数据基本操作

    • 扩展操作

    • set类型数据操作的注意事项

    • 应用场景

  • sorted_set

    • sorted_set类型数据的基本操作

    • 扩展操作

    • sorted_set类型数据操作的注意事项

    • sorted_set类型应用场景

  • 综合实践

    • 计数器

  • redis通用指令

    • key的通用操作

    • db的通用操作


Redis基础

1 Redis基本操作

1.1 帮助命令

Redis官方为我们提供了一套帮助命令

help 命令名称
help @组名

2 redis应用场景

  • redis用户控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性。
  • redis控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作
  • redis应用于各种结构型和非结构型高热度数据访问加速
  • redis应用于购物车数据存储设计
  • redis应用于抢购,限购类、限量发送优惠卷、激活码等业务得到数据存储设计
  • redis应用于具有操作先后顺序的数据控制
  • redis应用于最新消息展示
  • redis应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,大V推荐等
  • redis应用于同类信息的关联搜索,二度关联搜索,深度关联搜索
  • redis应用于同类型不重复数据的合并、取交集操作
  • redis应用于同类型数据的快速去重
  • redis应用于基于黑名单和白名单设定的服务控制
  • redis应用于定时任务执行顺序或任务过期管理(sorted_set)
  • redis应用于即时按次结算的服务控制
  • redis应用于计数器组合排序功能对应的排名
  • redis应用于即使任务/消息队列执行管理
  • redis应用于基于时间顺序的数据操作,而不关注具体时间

3 String

存储单个数据,是最简单数据结构

3.1 基本操作

添加/修改数据
set key value

获取数据
get key

删除数据(成功返回修改的个数,为1成功,为0失败)
del key

添加、 修改索格数据
mset key1 value1 key2 value2 ...

获取多个数据
mget key1 key2 ...

获取字符串长度
strlen key

追加信息到原始信息后部(返回追加完的长度)
append key value

单数据和多数据操作之间怎么选择?

单指令是将数据一条一条发送,而多指令一条指令即可完成。多指令传输效率比较高。但是如果一条指令中的数据过长,需要即时切割

3.2 key的设置约定:

表名:主键名:主键值:字段名

eg:order : id : 1234 : name

3.3 String类型的扩展操作

# 设置数值数据增加指定范围
incr key
incrby key increment
incrbyfloat key increment

# 设置数值数据减少范围的值
decr key
decrby key increment

# 设置数据具有声明周期
setex key seconds value # 设置秒
psetex key milliseconds value # 设置毫秒

3.4 String作为数值操作

  • string在redis内部存储默认就是一个字符串,当遇到递减类操作incr,decr时会转成数值型进行运算
  • redis所有的操作都是原子性的,采用单线程处理所有业务;
  • string的最大类型时Javalong型数据最大值

hash

hash存储优化

如果一个key中的field比较少,存储结构优化为类数组结构

如果field较多,存储结构使用hashmap结构

基本操作

添加/修改数据
hset key field value

获取数据
hget key field
hgetall key

删除数据
hdel key field1 [field2]

添加/修改多个数据
hmset ket field1 value1 field2 value2...

获取多个数据
hmset key field1 field2 ...

获取哈希表中的字段数量
hlen key

获取哈希表中是否存在指定的字段
hexists key field

扩展操作

获取哈希表中所有的字段名或字段值
hkeys key
hvals key

设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment

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

  • hash类型下的value只能存储字符串,不允许存储其他类型。数据未获取到,对应的值是(nil)
  • 每个hash可以存储2^31^-1个键值对
  • hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计的初衷不是为了存储大量对象,不可滥用(用哪个存哪个)
  • hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据的效率会很低,有可能成为数据访问的瓶颈(用哪个取哪个)

业务场景

电商网站购物车的设计与实现

业务分析

  • 仅分析购物车的redis存储模型
    • 添加、浏览、更改数量、删除、清空
  • 购物车与数据库间持久化同步
  • 购物车与订单间关系
    • 提交购物车:读取数据生成订单
    • 商家临时价格调整:隶属于订单级别
  • 未登录用户购物车信息存储
    • cookie存储

解决方案

  • 以用户id作为key,每位用户创建一个hash存储结构
  • 将商品编号作为field,购买数量作为value进行存储
  • 添加商品:追加全新的field和value
  • 浏览:遍历hash
  • 更改数量:自增/自减,设置value值
  • 删除商品:删除field
  • 清空:删除key
  • 大量重复信息可以独立建立hash(通过hsetnx可以节省空间,提高效率)
如果有值则不存放,没值才存放
hsetnx key field value

list

底层使用双向链表(有序)

list类型数据基本操作

添加/修改数据
lpush key value1 [value2]
rpush key value1 [value2]

获取数据
lrange key start stop #查看所有数据stop赋值为-1
lindex key index
llen key

获取并移除数据
lpop key
rpop key

扩展操作

规定时间内获取并移除数据
blpop key1 [key2] timeout
brpop key1 [key2] timeout

移除指定数据
lrem key count value

list类型数据操作注意事项

  • list中保存的数据都是string类型,数据容量是有限的,最多2^32^-1个元素
  • list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
  • 获取全部数据操作结束索引设置为-1
  • list可以对数据进行分页操作,通常第一页的信息来自于list,第二页及更多的信息通过数据库的形式加载

set

存储大量数据,高效的内部存储机构,便于查询

set类型:与hash存储结构完全相同,仅储存value,不存key,即将field放入value(不允许重复)

set类型数据基本操作

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

扩展操作

业务场景

系统为了用户留存度,为用户随机推送热点信息

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

系统为用户推荐人际圈,确定推送内容

求两个集合的交、并、差集
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

set类型数据操作的注意事项

  • set类型不允许重复
  • set虽然与hash结构相似,但是不能调用hash value的存储空间

应用场景

业务场景

黑名单、白名单

解决方案

  • 基于经营策略设定问题用户发现、鉴别规则
  • 周期性更新满足规则的用户黑名单,加入set集合
  • 用户行为信息达到后于黑名单进行比对
  • 通过剔除用户ip地址、用户id、用户设备id等信息拦截用户

sorted_set

新的存储要求:数据排序有利于数据的有效展示,需要提供一种根据自身特征进行排序的方式

需要的存储结构:新的存储模型,可以保存可排序的字段

sorted_set类型:在set的存储结构基础上添加可排序字段

sorted_set类型数据的基本操作

添加数据
zadd key score1 member1 [score2 member2 ...]
获取全部数据
zrange ket start stop [WITHSCORES] #从小到大
zrevrange ket start stop [WITHSCORES] #从大到小
删除数据
zrem key number [number]...

按条件获取数据
zrangebyscore key min max [WITHSCORES] [LIMIT]
zrevrangebyscore key max min [WITHSCORES]
条件删除数据
zremrangebyrank key start stop
zremrangebyscore key min max

获取集合数据总量
zcard key
zcount key min max
集合交、并操作
zinterstore destination numkey key [key...]
zunionstore destination numket ket [key...]

扩展操作

业务场景

各类投票、资源网站的排序

解决方案

获取数据对应的索引
zrank key member #从小到大
zrevrank key member #从大到小

score值获取与修改
zscore key member
zincrby key increment member

sorted_set类型数据操作的注意事项

  • score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
  • score保存的数据也可以是双精度的double值,使用要慎重
  • sorted_set底层存储还是基于set结构,因此数据不能重复,如果重复会覆盖保存

sorted_set类型应用场景

业务场景

基础服务+增值服务类网站会设定各位会用的使用,让用户体验会员优势。当VIP体验到期后,需要有效管理此类信息

各种拥有时效性质的任务

解决方案

  • 对于基于时间线限定的任务处理,将处理时间记录为score值,利用排序功能区分处理的先后顺序
  • 记录下一个要处理的时间,当到期后处理对应任务,移除redis的任务
  • 当新任务加入时,判定并更新当前下一个要处理任务的时间
  • 为提升性能,通常将任务根据特征存储成若干个sorted_set,如月度、季度、年度等
获取系统时间
time

业务场景

任务/消息权重设定应用

当任务或者消息待处理,形成了任务队列或消息队列时,对于高优先级的任务要保障对其优先处理,如何实现任务权重管理。

解决方案

使用score记录权重

综合实践

计数器

一段时间之内只能调用固定次数的情景

解决方案

  • 设计计数器,记录调用次数。以用户id作为key,使用次数作为value
  • 在调用前获取次数
    • 不超过,每次调用计数+1
    • 超过了,业务调用失败,计数-1
  • 为计数器设置生命周期为指定周期,自动清空周期内使用次数

改良

  • 取消最大值的判定,利用incr操作超过最大值抛出异常的形式替代每次判断是否达到最大值
  • 判断是否为nil
    • 如果是,设置为Max-次数
    • 如果不是,计数+1
    • 业务调用失败,计数-1
  • 抛出异常视为达到最大值

redis通用指令

key的通用操作

删除指定key
del key
获取key是否存在
exists key
获取key的类型
type key

为指定key设置有效期
expire key seconds # s
pexpire key milliseconds # ms
expireat key timestamp # 时间戳
expireat key milliseconds-timestamp
获取key的有效时间
ttl key # 不存在返回-2,永久存在返回-1
pttl key
切换key从时效性转换为永久性
persisy key

key查询功能
key pattern # *:匹配任意数量的任意符号、?匹配一个任意符号、[]匹配一个指定符号

为key改名
rename key newkey
renamenx key newkey
对所有key排序
sort

db的通用操作

redis为每个服务提供16个数据库[0,15]

切换数据库
select index
其他操作
quit
ping
echo message #日志

数据移动
move key db
数据清楚
dbsize
flushdb
flushall


















「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论