zoukankan      html  css  js  c++  java
  • Redis的学习之路

    应用场景

    1.作为缓存使用

      (1)原始业务功能设计

    • 秒杀
    • 双十一、618
    • 排队购票

      (2)运营平台察觉到突发式高频访问热点

    • 突发式热点新闻

      (3)高频复杂的统计数据

    • 在线直播
    • 投票排行榜

    2.附加功能

      (1)系统功能优化或升级

    • 单服务器升级集群
    • Session管理
    • Token管理

     主要内容

     一、常用的5种数据存储类型

    • String          --类比Java中的String
    • hash            --类比Java中的HashMap
    • list          --类比Java中的LinkedList
    • set          --类比Java中的HashSet
    • sorted_set  --类比Java中的TreeSet

     1.数据存储类型String基本操作-单指令与多指令

    Redis自身是一个Map,其中所有的数据都是采用key:value形式来存储。

    key永远都是字符串,而这里所涉及的数据存储类型指的都是value。

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

    (1)添加/修改数据

    set key value

    (2)获取数据

    get key

    (3)删除数据

    delete key

    这里需要注意的是Redis删除成功的时候这里返回值为(Integer) 1,删除失败返回值为(Integer)0 。

    (4)添加/修改多个数据

    mset key1 value1 key2 value2 key3 value3 ...

     (5)获取多个数据

    mget key1 key2 key3...

    (6)获取数据字符个数(字符串长度)

    strlen key

    (7)追加信息到原始信息后部(如果存在则拼接在后部,不存在则新建)

    append key value

    (8)这里单独提一下set 和mset的区别,执行效率上,举一个例子:如果我想执行三条set命令,分别要进行发送、执行、返回结果的过程,假设发送指令和返回结果指令所需时间都是s,这两个过程各自需要三次,执行命令所需时间为x,需要三次,那么总时间需要6s+3x。那么多指令执行mset,发送指令需要一次,执行需要三次,返回结果需要一次,那么总时间就是2s+3x。好像多指令mset在多个set值的时候效率高于set,其实这是要结合实际情况来决定发送方法,如果要发50条指令,用mset比较合适,如果要发1亿条指令呢,mset的数据量会很庞大,单线程阻塞了,所有人都等它执行完,反而起到反作用。因此,我们在实际数据量大的时候可以对数据进行适当的切割。

    2.数据存储类型String扩展操作-数据增减操作

    业务场景:大型企业级应用中,分表操作是基本操作,使用多张表存储同类型数据,但是对应的主键id必须保证统一性,不能重复,Oracle数据库具有sequence设定,可以解决该问题,但是MySQL数据库并不存在类似的机制,那么该如何解决呢?

    这里就要介绍一下Redis中的一些指令来代替。

    解决方案:

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

    (1)incr用法:

    (2)incrby key increment:指定增加的步长

     (3)incrbyfloat key increment:指定增长的小数

    • 设置数值数据减少指定范围的值
    decr key
    decrby key increment

     (4)decr用法:

     (5)decrby key increment:指定减少的步长

    这里补充一下:incrby和decrby后面的increment的数可以为正,可以为负,也就是说incrby后如果步长是负数,则可以做到减的效果。

    String作为数值操作

    • String在Redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算。
    • Redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
    • 注意:按数值进行操作的数据,如果原始数据不能转成数值,或者超过了Redis数值上限范围,将报错。(9223372036854775807:java中Long型数据最大值,Long.MAX_VALUE)

    3.数据时效性设置

    业务场景

    • 海选微信投票,每个微信号每6个小时只能投一票
    • 电商商家开启热门商品推荐,每个商品拥有3天热门推荐时间,3天后取消热门
    • 热点新闻有时效性,控制新闻的时效性

     Redis提供以下指令:

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

    用法:

    下面的毫秒指令与此相似,不做演示。

    4.string类型使用注意事项与key的命名规范

    (1)注意事项

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

      a.表示运行结果是否成功

        (integer)0 ---> false 失败

        (integer)1 ---> true 成功

      b.表示运行结果值

        (integer)3 --->3  3个

        (integer)1 --->1  1个

    • 数据未获取到

        (nil)等同于null

    • 数据最大存储量

        512MB

    • 数值计算最大范围(java中long的最大值)

        9223372036854775807

    (2)String类型的业务场景

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

      这里的原因是任何人点进这个微博大V主页,都必定会显示粉丝数、微博数量、关注量。

       命令规范1

      这里举个栗子:表名:主键:主键值:属性名

      key--->user:id:1001:fans

      value--->1221

      命名规范2

      如果是json格式将一整个对象传入value呢?

      再举个栗子:表名:主键:主键值

      key--->user:id:1001

      value--->{id:1001,blogs:789,fans:1221}

    待续。。。。

  • 相关阅读:
    补习系列(19)-springboot JPA + PostGreSQL
    【跟唐老师学习云网络】-第8篇 iptables
    【跟唐老师学习云网络】
    物联网与人工智能之间的区别与联系
    NB-IoT将成为未来5G物联网主流技术
    Python自带又好用的代码调试工具Pdb学习笔记
    Vue源码中compiler部分逻辑梳理(内有彩蛋)
    全新一代云服务器S6,重新定义性价比
    [HAOI2012]音量调节
    [SCOI2005]扫雷
  • 原文地址:https://www.cnblogs.com/xusp/p/12252133.html
Copyright © 2011-2022 走看看