分类 标签 存档 社区 博客 友链 GitHub 订阅 搜索

Java - Redis

194 浏览

ZERO

    持续更新 请关注:https://zorkelvll.cn/blogs/zorkelvll/articles/2018/12/25/1545748353696

背景

     本文主要是记录在学习 Java - Redis 过程中的一些知识点备忘!

20181225

1、概述

Redis 一个非关系型内存数据库,存写速度非常之快,被广泛用于缓存方向;也经常用来用作分布式锁,提供多种数据类型(字符串、散列、列表、集合、有序集合等等),且支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案

2、为什么使用 redis 而不用 map/guava 做缓存?

缓存分为本地缓存和分布式缓存!

若使用 map 或 guava 实现的是本地缓存,最主要的特点是轻量和快速,但是生命周期随着 JVM 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性

而 redis 或 memcached,为分布式缓存;在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性;缺点就是需要保持 Redis 或 memcached 的高可用,程序架构上较为复杂

3、Redis 常见数据结构

  • String

常用命令:set,get,decr,incr,mget 等。

String 数据结构是简单的 key-value 类型,value 其实不仅可以是 String 也可以是数字,常规 key-value 缓存应用;常规计数:微博数、粉丝数等

  • Hash

常用命令:hget,hset,hgetall 等。

Hash 是一个 String 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,在后续操作的时候可以直接仅仅修改这个对象中的某个字段的值。比如,可以用 Hash 数据结构用来存储用户信息、商品信息等等,示例:

    key=JavaUser293847
    value={
      “id”: 1,
      “name”: “SnailClimb”,
      “age”: 22,
      “location”: “Wuhan, Hubei”
    }
  • List

常用命令:lpush,rpush,lpop,rpop,lrange 等。

List 是链表,Redis List 应用场景非常多,也是 Redis 最重要的数据结构之一,比如微博的关注列表、粉丝列表、消息列表等功能都可以用 Redis 和 List 结构来实现

Redis list 的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销

另外,可以通过 lrange 命令,就是从某个元素开始读取多少个元素,可以基于 list 实现分页查询,这是一个非常棒的功能,基于 redis 实现简单的高性能分页,就可以做类似微博那种下拉不断分页的东西(一页一页的往下走),性能高

  • Set

常用命令:sadd,spop,smembers,sunion 等

Set 对外提供的功能与 List 类似,也是一个列表的功能,特殊之处在于 set 是可以自动排重的

当需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这也是 list 所不能提供的;可以基于 set 轻易实现交集、并集、差集的操作

比如:在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis 可以非常方便地实现如共同关注、共同粉丝、共同喜好等功能,这个过程也就是求交集的过程;具体命令如下:

sinterstore key1 key2 key3     将交集存在key1内
  • Sorted Set

常用命令:zadd,zrange,zrem,zcard 等

相比较于 Set,sorted set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列

举例:在直播系统中,实时排列信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用 Redis 中的 SortedSet 结构进行存储

说明:本 JavaGuide 系列博客为来源于https://github.com/Snailclimb/JavaGuide 等学习网站或项目中的知识点,均为自己手打键盘系列且内容会根据继续学习情况而不断地调整和完善!

评论  
留下你的脚步
推荐阅读