乐趣区

关于redis:Redis可以做哪些事

Redis 是一种基于键值对的 NoSQL 数据库,它的值次要由 string(字符串),hash(哈希),list(列表),set(汇合),zset(有序汇合)五种根本数据结构形成,除此之外还反对一些其余的数据结构和算法。key 都是由字符串形成的,那么这五种数据结构的应用场景有哪些?一起来看看!

一 字符串

字符串类型是 Redis 最根底的数据结构,字符串类型能够是 JSONXML 甚至是二进制的图片等数据,然而最大值不能超过 512MB。

1.1 外部编码

Redis 会依据以后值的类型和长度决定应用哪种外部编码来实现。

字符串类型的外部编码有 3 种:

  1. int:8 个字节的长整型。
  2. embstr:小于等于 39 个字节的字符串。
  3. raw:大于 39 个字节的字符串。

1.2 应用场景

1.2.1 缓存

在 web 服务中,应用 MySQL 作为数据库,Redis 作为缓存。因为 Redis 具备撑持高并发的个性,通常能起到减速读写和升高后端压力的作用。web 端的大多数申请都是从 Redis 中获取的数据,如果 Redis 中没有须要的数据,则会从 MySQL 中去获取,并将获取到的数据写入 redis。

1.2.2 计数

Redis 中有一个字符串相干的命令 incr keyincr 命令对值做自增操作,返回后果分为以下三种状况:

  • 值不是整数,返回谬误
  • 值是整数,返回自增后的后果
  • key 不存在,默认键为0,返回1

比方文章的浏览量,视频的播放量等等都会应用 redis 来计数,每播放一次,对应的播放量就会加 1,同时将这些数据异步存储到数据库中达到长久化的目标。

1.2.3 共享 Session

在分布式系统中,用户的每次申请会拜访到不同的服务器,这就会导致 session 不同步的问题,如果一个用来获取用户信息的申请落在 A 服务器上,获取到用户信息后存入 session。下一个申请落在 B 服务器上,想要从 session 中获取用户信息就不能失常获取了,因为用户信息的 session 在服务器 A 上,为了解决这个问题,应用 redis 集中管理这些 session,将 session 存入 redis,应用的时候间接从 redis 中获取就能够了。

1.2.4 限速

为了平安思考,有些网站会对 IP 进行限度,限度同一 IP 在肯定工夫内拜访次数不能超过 n 次。

二 哈希

Redis 中,哈希类型是指一个键值对的存储构造。

2.1 外部编码

哈希类型的外部编码有两种:

  • ziplist(压缩列表):当哈希类型元素个数小于 hash-max-ziplist-entries 配置(默认 512 个)同时所有值都小于 hash-max-ziplist-value 配置(默认 64 字节)时应用。ziplist 应用更加紧凑的构造实现多个元素的间断存储,所以比 hashtable 更加节俭内存。
  • hashtable(哈希表):当 ziplist 不能满足要求时,会应用 hashtable。

2.2 应用场景

因为 hash 类型存储的是一个键值对,比方数据库有以下一个用户表构造

id name age
1 Java 旅途 18

将以上信息存入 redis,用表明:id 作为 key,用户属性作为值:

hset user:1 name Java 旅途 age 18

应用哈希存储会比字符串更加不便直观

三 列表

列表类型用来存储多个 有序 的字符串,一个列表最多能够存储 2^32-1 个元素,列表的两端都能够插入和弹出元素。

3.1 外部编码

列表的外部编码有两种:

  • ziplist(压缩列表):当哈希类型元素个数小于 list-max-ziplist-entries 配置(默认 512 个)同时所有值都小于 list-max-ziplist-value 配置(默认 64 字节)时应用。ziplist 应用更加紧凑的构造实现多个元素的间断存储,所以比 hashtable 更加节俭内存。
  • linkedlist(链表):当 ziplist 不能满足要求时,会应用 linkedlist。

3.2 应用场景

3.2.1 音讯队列

列表用来存储多个有序的字符串,既然是有序的,那么就满足音讯队列的特点。应用 lpush+rpop 或者 rpush+lpop 实现音讯队列。除此之外,redis 反对阻塞操作,在弹出元素的时候应用阻塞命令来实现阻塞队列。

3.2.2 栈

因为列表存储的是有序字符串,满足队列的特点,也就能满足栈先进后出的特点,应用 lpush+lpop 或者 rpush+rpop 实现栈。

3.2.3 文章列表

因为列表的元素不然而有序的,而且还反对依照索引范畴获取元素。因而咱们能够应用命令 lrange key 0 9 分页获取文章列表

四 汇合

汇合类型也能够保留多个字符串元素,与列表不同的是,汇合中不容许有反复元素并且汇合中的元素是无序的。一个汇合最多能够存储 2^32-1 个元素。

4.1 外部编码

汇合类型的外部编码有两种:

  • intset(整数汇合):当汇合中的元素都是整数且元素个数小于 set-max-intset-entries 配置(默认 512 个)时,redis 会选用 intset 来作为汇合的外部实现,从而缩小内存的应用。
  • hashtable(哈希表):当 intset 不能满足要求时,会应用 hashtable。

4.2 应用场景

4.2.1 用户标签

例如一个用户对篮球、足球感兴趣,另一个用户对橄榄球、乒乓球感兴趣,这些趣味点就是一个标签。有了这些数据就能够失去喜爱同一个标签的人,以及用户的独特感兴趣的标签。给用户打标签的时候须要①给用户打标签,②给标签加用户,须要给这两个操作减少事务。

  • 给用户打标签
sadd user:1:tags tag1 tag2
  • 给标签增加用户
sadd tag1:users user:1

sadd tag2:users user:1

应用交加(sinter)求两个 user 的独特标签

sinter user:1:tags user:2:tags

4.2.2 抽奖性能

汇合有两个命令反对获取随机数,别离是:

  • 随机获取 count 个元素,汇合元素个数不变

srandmember key [count]

  • 随机弹出 count 个元素,元素从汇合弹出,汇合元素个数扭转

spop key [count]

用户点击抽奖按钮,参数抽奖,将用户编号放入汇合,而后抽奖,别离抽一等奖、二等奖,如果曾经抽中一等奖的用户不能参数抽二等奖则应用spop,反之应用srandmember

五 有序汇合

有序汇合和汇合一样,不能有反复元素。然而能够排序,它给每个元素设置一个 score 作为排序的根据。最多能够存储 2^32-1 个元素。

5.1 外部编码

有序汇合类型的外部编码有两种:

  • ziplist(压缩列表):当有序汇合的元素个数小于 list-max-ziplist-entries 配置(默认 128 个)同时所有值都小于 list-max-ziplist-value 配置(默认 64 字节)时应用。ziplist 应用更加紧凑的构造实现多个元素的间断存储,更加节俭内存。
  • skiplist(跳跃表):当不满足 ziplist 的要求时,会应用 skiplist。

5.2 应用场景

5.2.1 排行榜

用户公布了 n 篇文章,其他人看到文章后给喜爱的文章点赞,应用 score 来记录点赞数,有序汇合会依据 score 排行。流程如下

用户公布一篇文章,初始点赞数为 0,即 score 为 0

zadd user:article 0 a

有人给文章 a 点赞,递增1

zincrby user:article 1 a

查问点赞前三篇文章

zrevrangebyscore user:article 0 2

查问点赞后三篇文章

zrangebyscore user:article 0 2

5.2.2 提早音讯队列

下单零碎,下单后须要在 15 分钟内进行领取,如果 15 分钟未领取则主动勾销订单。将下单后的十五分钟后工夫作为 score,订单作为 value 存入 redis,消费者轮询去生产,如果生产的大于等于这笔记录的 score,则将这笔记录移除队列,勾销订单。

总结

在开发中,字符串类型是用的最多的数据类型,导致咱们漠视了 redis 的其余四种数据类型,在具体场景下抉择具体的数据类型对晋升 redis 性能有十分大的帮忙。redis 尽管反对音讯队列的实现,然而并不反对 ack。所以 redis 实现的音讯队列不能保障音讯的可靠性,除非本人实现音讯确认机制,不过这十分麻烦,所以如果是重要的音讯还是举荐应用专门的音讯队列去做。


点关注、不迷路

如果感觉文章不错,欢送 关注 点赞 珍藏,你们的反对是我创作的能源,感激大家。

如果文章写的有问题,请不要吝惜文笔,欢送留言指出,我会及时核查批改。

如果你还想更加深刻的理解我,能够微信搜寻「Java 旅途」进行关注。回复「1024」即可取得学习视频及精美电子书。每天 7:30 准时推送技术文章,让你的下班路不在孤单,而且每月还有送书流动,助你晋升硬实力!

退出移动版