redis学习1数据类型--黑马

命令行模式工具使用思考

  • 功能性命令
  • 清除屏幕信息
  • 帮助信息查阅
  • 退出指令

信息添加

set key value

信息查询

get key

清除屏幕信息

clear

帮助

help 命令名

退出命令行

quit
exit

数据存储类型

  • string String
  • hash HashMap
  • list LinkedList
  • set HashSet
  • sort_set TreeSet

string

单个

set key value
get key
del key

多个

mset key1 value1 key2 value2
mget key1 key2
strlen key获取数据字符个数(字符串长度)
append key value(追加信息,存在就追加,否则新建)

扩展操作

解决分库分表时id自增重复问题

redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性

  • 此方案适用于所有数据库,且支持数据库集群
  • 设置数值数据增加指定范围的值
    incr key 自增1
    incrby key increment 自增increment(可为+-)
    incrbyfloat key increment 自增小数increment
  • 设置数值数据减少指定范围的值
    decr key
    decrby key increment

一定时长内有效,过了时间无效

redis控制数据的生命周期,通过数据是否生效控制业务行为,适用于所有具有时效性限定控制的操作

  • 设置数据具有指定的生命周期
    setex key seconds value
    psetex key milliseconds value(毫秒)

注意事项

数据操作不成功的反馈与数据正常操作之间的差异

  1. 表示运行结果是否成功
  • (integer)0->false 失败
  • (integer)1->true 成功
  1. 表示运行结果值
    +(integer)3->3 3个
    +(integer)1->1 1个
    数据未获取到:nill->null
    数据最大存储量:512MB
    数值计算最大范围(java中的long最大值):9223372036854775807

hash

一个存储空间保存多个键值对数据

单个

hset key field value
hget key field
hgetall key

多个

hmset key field1 value1 field2 value2
hmget key field1 field2
hlen key
hexists key field
hdel key feild1 [field2]

扩展

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

注意事项

  • hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。若数据未获取到对应值为nil
  • 每个hash可以存储2^23-1个键值对
  • hgetall操作可以获取全部属性,若内部field过多,遍历整体数据效率会很低,有可能成为数据访问的瓶颈

应用场景

购物车的设计与实现

  • 以客户id为key,每位客户创建一个hash存储结构存储对应的购物车信息
  • 将商品编号作为field,购买数量作为value进行存储
  • 添加商品:追加全新的field与value
  • 浏览:遍历hash
  • 更改数量:自增/减,设置value值
  • 删除商品:删除filed
  • 清空:删除key
    缺点:无法显示商品信息
    优化:
  • 每条购物车中的商品记录保存为两条filed
  • field1专用于保存购买数量
    key:商品id:num val:购买数量(数值)
  • field2专用于保存商品信息
    key:商品id:info val:商品信息(json)
    缺点:商品信息大量重复
    优化:
  • 将field2作为公共独立hash
    hsetnx key field value:field不存在则加

抢购活动,抢购商品上限1000张

  • 以商家id为key,参与抢购的商品id为field,对应数量为value,使用降值方式控制商品数量(increment负值)

string与hash区别

string:整体性,一次性更新和获取
hash:分离field,灵活性高

list

一个存储空间保存多个数据,且通过数据可以体现进入顺序,list底层使用双向链表存储结构实现
lpush key value1 [value2]
rpush key value1 [value2]
lrange key start stop
lindex key index
llen key
lpop key
rpop key

扩展操作

  • 规定时间内获取并移除数据(等待一定时间后获取数据并移除)
    blpop key1[key2] timeout
    brpop key1[key2] timeout
  • 移除指定数据
    lrem key count value

注意事项

  • 获取全部数据操作结束索引设置为-1
  • list可以对数据进行分页操作,通常第一页的信息来自于list,第二页以及更多的信息通过数据库的形式加载

业务场景

按最新时间展示

set

存储大量数据,在查询方面提供更高的效率
存储结构与hash完全相同,仅存储键(作为值),不存储值,且值不允许重复的
sadd key member1[member2]
smembers key
srem key member1[member2]
scard key 获取数据总量
sismember key member

扩展操作

业务:随机推荐

  • 随机获取集合中指定数量的数据
    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中,重复的权限将被剔除
  • 根据用户id获取用户所有角色
  • 根据用户所有角色获取用户所有权限放入set集合

统计访问量

  • 利用set记录不同的cookie数量/不同的IP数量

sorted_set

数据排序,在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 min max [WITHSCORES]
zremrangebyrank key start stop 条件删除数据(按索引)
zremrangebyscore key min max(按条件)
zcard key
zcount key min max
zinterstore destination numkeys key [key...]
zunionstore destination numkeys key [key...]

扩展操作

  • 获取数据对应的索引(排名)
    zrank key member
    zrevrank key member
  • score值获取与修改
    zscore key member
    zincrby key increment member

注意事项

  • sorted_set添加重复数据时保留最后一次的数据

业务场景

时效性任务管理

  • 将处理时间记录为score值,利用排序功能区分处理的先后吮吸
  • 记录下一个要处理的时间,当到期后处理对应任务,移除redis中的记录,并记录下一个要处理的时间
  • 当新任务加入时,判定并更新下一个要处理的任务时间
  • 为提升sorted_set的性能,通常将任务根据特征存储成若干个sorted_set,例如1小时内,1天内等,操作时逐级提升,将即将操作的若干个任务纳入到1小时内处理的队列中
  • 获取当前系统的时间:time

任务/消息权重设定应用

  • 对于带有权重的任务,优先处理权重高的任务,采用score记录权重
posted @ 2023-05-15 17:19  CC&  阅读(94)  评论(0)    收藏  举报