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}

待续。。。。

posted @ 2020-02-02 14:36  mcbbss  阅读(203)  评论(0编辑  收藏  举报