Java语言】 redis在项目中的应用?

2021-03-04 10:05发布

8条回答
小张同学
2021-03-22 13:53

一、 redis 特点

    1.所有数据存储在内存中,高速读写

    2.提供丰富多样的数据类型:string、 hash、 set、 sorted set、bitmap、hyperloglog

    3.提供了 AOF 和 RDB 两种数据的持久化保存方式,保证了 Redis 重启后数据不丢失

    4.Redis 的所有操作都是原子性的,还支持对几个操作合并后的原子性操作,支持事务

 通常我们都把数据存到关系型数据库中,但为了提升应用的性能,我们应该把访频率高且不会经常变动的数据缓存到内存中。Redis 没有像 MySQL 这类关系型数据库那样强大的查询功能,需要考虑如何把关系型数据库中的数据,合理的对应到缓存的 key-value 数据结构中。

1)String数据类型的应用场景

    (1) 存储 MySQL 中某个字段的值

    把 key 设计为 表名:主键名:主键值:字段名 eg.

    set user:id:1:email 10000@qq.com

    (2) 存储对象

    string 类型支持任何格式的字符串,应用最多的就是存储 json 或其他对象格式化的字符串。(这种场景下推荐使用 hash 数据类型)

    set user:id:1 '[{"id":1,"name":"zj","email":"10000@qq.com"},{"id":1,"name":"zj","email":"10000@qq.com"}]'

    (3) 生成自增 id

    当 redis 的 string 类型的值为整数形式时,redis 可以把它当做是整数一样进行自增(incr)自减(decr)操作。由于 redis 所有的操作都是原子性的,所以不必担心多客户端连接时可能出现的事务问题。

    incr 对值进行加1操作,如果不是整数,返回错误,如果不存在按照从0开始 decr 同incr,但是是减1操作 incrby,decrby ,增加减去指定的数

    (4) 生成自增 id

    比如视频播放次数,点赞次数。

    (5)共享session

    数据共享的功能,redis作为单独的应用软件用来存储一些共享数据供多个实例访问。

    (6)自动定时过期

    set key value [ex seconds] [px millseconds] [nx|xx]

    ex seconds: 键过期时间

    px milliseconds: 为键设置毫秒级过期时间

    nx: 键必须不存在才可以设置成功,用于添加

    xx: 键必须存在,才可以设置成功,用于更新

    (7)批量操作

    mset,mget

    批量设置和获取命令,在操作多个key的时候可以节省网络传输时间

    mset key value [key value...]

    mget key [key ...]

2)hash 数据类型的应用场景

    hash 类型十分适合存储对象类数据,相对于在 string 中介绍的把对象转化为 json 字符串存储,hash 的结构可以任意添加或删除‘字段名’,更加高效灵活。 一些关系型数据库中不是特别复杂的表,也无需复杂的关系查询,可以使用Redis的Hash来存储,也可以用Hash做表数据缓存。

3)list 数据类型的应用场景

    (1) 消息队列

    redis 的 list 数据类型对于大部分使用者来说,是实现队列服务的最经济,最简单的方式。我司使用redis做消息队列,lpush + brpop或rpop命令,实现先进先出,如果消费失败客户端把key再放回去,消费成功就remove掉。

    (2) “最新内容”

    因为 list 结构的数据查询两端附近的数据性能非常好,所以适合一些需要获取最新数据的场景,比如新闻类应用的 “最近新闻”。

4)set 数据类型的应用场景

    set 类型的特点是——不重复且无序的一组数据,并且具有丰富的计算功能,在一些特定的场景中可以高效的解决一般关系型数据库不方便做的工作。

    (1)“共同好友列表”

    社交类应用中,获取两个人或多个人的共同好友,两个人或多个人共同关注的微博这样类似的功能,用 MySQL 的话操作很复杂,可以把每个人的好友 id 存到集合中,获取共同好友的操作就可以简单到一个取交集的命令就搞定。

   (2)唯一ip

    跟踪一些具有唯一性的一些数据,比如访问某一博客的唯一ip地址的信息,我们仅需要在每次访问的时候,将ip存入redis中。利用服务器端聚合操作方便高效的特性,维护数据对象之间的关联关系。

5)sorted set 数据类型的应用场景

排行榜

    实效性

    从排行榜的实效性上划分,主要分为:    

        实时榜:基于当前一段时间内数据的实时更新,进行排行。例如:当前一小时内游戏热度实时榜,当前一小时内明星送花实时榜等

        历史榜:基于历史一段周期内的数据,进行排行。例如:日榜(今天看昨天的),周榜(上一周的),月榜(上个月的),年榜(上一年的)

    业务数据类型

    从需要排行的数据类型上划分,主要分为:

        单类型数据排行榜:是指需要排行的主体不需要区分类型,例如,所有用户积分排行,所有公贡献值排行,所有游戏热度排行等

        多类型(复合类型)数据排行榜:是指需要排行的主体在排行中要求有类型上的区分,例如:竞技类游戏热度排行、体育类游戏热度排行、MOBA类游戏操作性排行、角色/回合/卡牌三类游戏热度排行等

    展示唯度

    从榜单的最终展示唯度上划分,主要分为:

        单唯度:是指选择展示的排行榜就是基于一个唯度下的排行,例如前面提到的MOBA类游戏操作性排行榜,就仅展示所有MOBA类游戏按操作性的评分排行

        多唯度:是指选择展示的排行榜还有多种唯度供用户选择,仍然以前面的MOBA类游戏为例,唯度除了操作性,还有音效评分排行,难易度评分排行,画面评分排行等。

    展示数据量

     从需要展示的数据量上划分,主要分为:

        topN数据:只要求展示topN条排行纪录,例如:最火MOBA游戏top20

        全量数据:要求展示所有数据的排行,例如:所有用户的积分排行


一周热门 更多>