一、 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 156577812@qq.com
2 ai 156577813@qq.com

这个简单的表可能经常会有这个的需求:>根据用户 id 查询用户邮箱地址,可以选择把邮箱地址这个数据存到 redis 中:

set user:id:1:email 156577812@qq.com;set user:id:2:email 156577812@qq.com;

三、 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 156577812@qq.com

(2) 存储对象

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

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

(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 的结构可以任意添加或删除‘字段名’,更加高效灵活。

hmset user:1 name zj email 156577812@qq.com

五、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 kobesadd user:james wade melo paul kobesadd user:paul wade james melo kobesadd 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" */ //类似的需求还出现在根据文章的阅读量或点赞量对文章列表排序

 

Redis 数据类型及应用场景的更多相关文章

  1. redis数据类型及使用场景

    Redis数据类型  String: Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令:  set,get,decr,incr,mge ...

  2. redis数据类型和应用场景

    Redis是什么?两句话可以做下概括: 1. 是一个完全开源免费的key-value内存数据库 2. 通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 strings.map. list ...

  3. redis 数据类型的使用场景

    value为对应的数据类型. String 应用场景: String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String,也可以是数字. Hash 应用 ...

  4. redis数据类型及应用场景

    0.key的通用操作 KEYS * keys a keys a* 查看已存在所有键的名字 ****TYPE 返回键所存储值的类型 ****EXPIRE\ PEXPIRE 以秒\毫秒设定生存时间 *** ...

  5. 2 万字 + 20张图| 细说 Redis 九种数据类型和应用场景

    作者:小林coding 计算机八股文网(操作系统.计算机网络.计算机组成.MySQL.Redis):https://xiaolincoding.com 大家好,我是小林. 我们都知道 Redis 提供 ...

  6. Redis数据结构和使用场景,redis内存淘汰策略

    什么样的数据适合放入Redis? sql执行耗时特别久,且结果不频繁变动的数据,适合放入Redis. Redis是单线程的,为什么会这么快? 纯内存操作 单线程操作,避免频繁的上下文切换 采用了非阻塞 ...

  7. redis 五种数据类型的使用场景

    String 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...

  8. redis 数据类型详解 以及 redis适用场景场合

    1.  MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的 ...

  9. [转]redis 五种数据类型的使用场景

    FROM : http://blog.csdn.net/gaogaoshan/article/details/41039581#t5 String 1.String 常用命令: 除了get.set.i ...

随机推荐

  1. centos7.2中部署私有仓库harbor

    1.安装docker #安装依赖和驱动 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 #配置docker的官方源 s ...

  2. JS---offset系列和scroll系列

    元素的样式属性是无法直接通过:对象.style.属性来获取(样式在style属性中设置)   offset系列: offsetLeft:距离左边位置的值 offsetTop:距离上面位置的值 offs ...

  3. 相机位姿求解——P3P问题

    1.位姿求解是计算机视觉中经常遇到的,Perspective-n-Points, PnP(P3P)提供了一种解决方案,它是一种由3D-2D的位姿求解方式,即需要已知匹配的3D点和图像2D点.目前遇到的 ...

  4. Caffeine批量加载浅析

    最近项目中的本地缓存,看是从Guava改成了Caffeine,据说是性能更好,既然性能更好的话,那么就用起来吧.不过在使用过程中,发现了单个load和批量loadall方面的一些小设置,记录一下. 一 ...

  5. PHP最新面试题2019

    1.字符串"0"在PHP和js中转换为布尔值是false还是true php:false;  php 弱语言 '0'和0一样: js:true:字符串除了空字符串('')其他都是t ...

  6. C# Parallel 多线程并发

    Parallel并发执行多个任务 多线程的,主线程会参与计算---阻塞界面等于TaskWaitAll+主线程计算 常用方法 1.Invoke  尽可能并行执行提供的每个操作 Console.Write ...

  7. Nginx的安装及配置

    1.概述         Nginx是开源免费的一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.其特点是占有内存少,并发能力强,使用nginx网站用户有很多,如百 ...

  8. JavaScript 之 对象属性的特性 和defineProperty方法

    对象是无序属性的集合,而这些属性在创建是都带有一些特征值(可以理解为属性的属性,天生自带的),这些特征值是为了实现JavaScript引擎用的,因此JavaScript不能直接访问. JavaScri ...

  9. Symfonos:3 Vulnhub Walkthrough

    主机扫描: ╰─ nmap -p1-65535 -sV -A -sT 10.10.202.130 Starting Nmap 7.70 ( https://nmap.org ) at 2019-08- ...

  10. Android utils 之 日志工具类

    工具类 在开发的过程中,我们时常会对代码执行特定的处理,而这部分处理在代码中可能多次用到,为了代码的统一性.规范性等,通过建工具类的方式统一处理.接下来我会罗列各种工具类. 日志工具类 在utils文 ...