主页»数据库»Redis 数据类型及运用场景

Redis 数据类型及运用场景

来历:waterandair 发布时刻:2017-12-06 阅览次数:

  一、 redis 特色

  • 一切数据存储在内存中,高速读写
  • 供给丰厚多样的数据类型:string、 hash、 set、 sorted set、bitmap、hyperloglog
  • 供给了 AOF 和 RDB 两种数据的耐久化保存办法,确保了 Redis 重启后数据不丢掉
  • Redis 的一切操作都是原子性的,还支撑对几个操作兼并后的原子性操作,支撑业务

 一般咱们都把数据存到联系型数据库中,但为了进步运用的功用,咱们应该把访频率高且不会常常变化的数据缓存到内存中。。Redis 没有像 MySQL 这类联系型数据库那样强壮的查询功用,需求考虑怎么把联系型数据库中的数据,合理的对应到缓存的 key-value 数据结构中。

  二、 规划 Redis Key

  分段规划法

  运用冒号把 key 中要表达的多种意义分隔表明,过程如下:

  1. 把表名转化为 key 前缀
  2. 主键名(或其他常用于查找的字段)
  3. 主键值
  4. 要存储的字段。

  eg. 用户表(user)

id name email
1 zj [email protected]
2 ai [email protected]

  这个简略的表或许常常会有这个的需求:>依据用户 id 查询用户邮箱地址,能够挑选把邮箱地址这个数据存到 redis 中:

set user:id:1:email [email protected];
set user:id:2:email [email protected];

  三、 String数据类型的运用场景

  1. 简介

  string 类型是 Redis 中最根本的数据类型,最常用的数据类型,乃至被许多玩家当成 redis 仅有的数据类型去运用。string 类型在 redis 中是二进制安全(binary safe)的,这意味着 string 值关怀二进制的字符串,不关怀详细格局,你能够用它存储 json 格局或 JPEG 图片格局的字符串。

  2. 数据模型

  string 类型是根本的 Key-Value 结构,Key 是某个数据在 Redis 中的仅有标识,Value 是详细的数据。

Key Value
‘name’ ‘redis’
‘type’ ‘string’

  3. 运用场景

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

  把 key 规划为 表名:主键名:主键值:字段名

  eg.

set user:id:1:email [email protected]
  (2) 存储目标

  string 类型支撑任何格局的字符串,运用最多的便是存储 json 或其他目标格局化的字符串。(这种场景下引荐运用 hash 数据类型)

set user:id:1 [{"id":1,"name":"zj","email":"[email protected]"},{"id":1,"name":"zj","email":[email protected]}]
  (3) 生成自增 id

  当 redis 的 string 类型的值为整数办法时,redis 能够把它作为是整数相同进行自增(incr)自减(decr)操作。由于 redis 一切的操作都是原子性的,所以不用忧虑多客户端衔接时或许呈现的业务问题。

  四、hash 数据类型的运用场景

  1. 简介

  hash 类型很像一个联系型数据库的数据表,hash 的 Key 是一个仅有值,Value 部分是一个 hashmap 的结构。

  2. 数据模型

  假设有一张数据库表如下:

id name type
1 redis hash

  假如要用 redis 的 hash 结构存储,数据模型如下:

  hash数据类型在存储上述类型的数据时具有比 string 类型更灵敏、更快的优势,详细的说,运用 string 类型存储,必定需求转化和解析 json 格局的字符串,即使不需求转化,在内存开支方面,仍是 hash 占优势。

  3. 运用场景

  hash 类型十分合适存储目标类数据,相关于在 string 中介绍的把目标转化为 json 字符串存储,hash 的结构能够恣意添加或删去‘字段名’,愈加高效灵敏。

hset user:1 name zj email [email protected]

  五、list 数据类型的运用场景

  1. 简介

  list 是依照刺进次序排序的字符串链表,能够在头部和尾部刺进新的元素(双向链表完结,两头添加元素的时刻杂乱度为 O(1))。刺进元素时,假如 key 不存在,redis 会为该 key 创立一个新的链表,假如链表中一切的元素都被移除,该 key 也会从 redis 中移除。

  2. 数据模型

  常见操作时用 lpush 指令在 list 头部刺进元素, 用 rpop 指令在 list 尾取出数据。

  3. 运用场景

  (1) 音讯行列

  redis 的 list 数据类型关于大部分运用者来说,是完结行列服务的最经济,最简略的办法。

  (2) “最新内容”

  由于 list 结构的数据查询两头邻近的数据功用十分好,所以合适一些需求获取最新数据的场景,比方新闻类运用的 “最近新闻”。

  4.优化主张

  (1) list 是链表结构,一切假如在头部和尾部刺进数据,功用会十分高,不受链表长度的影响;但假如在链表中刺进数据,功用就会越来越差。

  六、set 数据类型的运用场景

  1. 简介

  set 数据类型是一个调集(没有排序,不重复),能够对 set 类型的数据进行添加、删去、判别是否存在等操作(时刻杂乱度是 O(1) )

  set 调集不允许数据重复,假如添加的数据在 set 中现已存在,将只保存一份。

  set 类型供给了多个 set 之间的聚合运算,如求交集、并集、补集,这些操作在 redis 内部完结,功率很高。

  2. 数据模型

  3. 运用场景

  set 类型的特色是——不重复且无序的一组数据,而且具有丰厚的核算功用,在一些特定的场景中能够高效的处理一般联系型数据库不便利做的作业。

  1. “一同老友列表”

  交际类运用中,获取两个人或多个人的一同老友,两个人或多个人一同重视的微博这样相似的功用,用 MySQL 的话操作很杂乱,能够把每个人的老友 id 存到调集中,获取一同老友的操作就能够简略到一个取交集的指令就搞定。

// 这儿为了便利阅览,把 id 替换成名字
sadd user:wade james melo paul kobe
sadd user:james wade melo paul kobe
sadd user:paul wade james melo kobe
sadd user:melo wade james paul kobe

// 获取 wade 和 james 的一同老友
sinter user:wade user:james
/* 输出:
 *      1) "kobe"
 *      2) "paul"
 *      3) "melo"
 */
 
 // 获取香蕉四兄弟的一同老友
 sinter user:wade user:james user:paul user:melo
 /* 输出:
 *      1) "kobe"
 */
 
 /*
     相似的需求还有许多 , 有必要把每个标签下的文章 id 存到调集中,能够很简略的求出几个不同标签下的一同文章;
 把每个人的喜好存到调集中,能够很简略的求出几个人的一同喜好。 
 */

  七、sorted set 数据类型的运用场景

  1.简介

  在 set 的基础上给调集中每个元素相关了一个分数,往有序调集中刺进数据时会主动依据这个分数排序。

  2.运用场景

  在调集类型的场景上参加排序便是有序调集的运用场景了。比方依据老友的“亲密度”排序显现老友列表。

// 用元素的分数(score)表明与老友的亲密度
zadd user:kobe 80 james 90 wade  85 melo  90 paul

// 依据“亲密度”给老友排序
zrevrange user:kobe 0 -1

/**
 * 输出:
 *      1) "wade"
 *      2) "paul"
 *      3) "melo"
 *      4) "james"
 */
 
// 添加老友的亲密度
zincrby user:kobe 15 james

// 再次依据“亲密度”给老友排序
zrevrange user:kobe 0 -1

/**
 * 输出:
 *      1) "james"
 *      2) "wade"
 *      3) "paul"
 *      2) "melo"
 */
 
 //相似的需求还呈现在依据文章的阅览量或点赞量对文章列表排序
QQ群:凯发娱乐官网官方群(515171538),验证音讯:10000
微信群:加小编微信 849023636 邀请您参加,验证音讯:10000
提示:更多精彩内容重视微信大众号:全栈开发者中心(fsder-com)
网友谈论(共0条谈论) 正在载入谈论......
沉着谈论文明上网,回绝歹意咒骂 宣布谈论 / 共0条谈论
登录会员中心