Redis 数据类型及应用场景

转载 2017年12月09日 00:00:00

0?wx_fmt=gif&wxfrom=5&wx_lazy=1

一、 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)

idnameemail
1zj156577812@qq.com
2ai156577813@qq.com

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

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

  2. 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 是具体的数据。

KeyValue
‘name’‘redis’
‘type’‘string’

3. 应用场景

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

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

eg.

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

(2) 存储对象

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

  1. 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.数据模型

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

idnametype
1redishash

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

0?wx_fmt=png

hash数据类型在存储上述类型的数据时具有比 string 类型更灵活、更快的优势,具体的说,使用 string 类型存储,必然需要转换和解析 json 格式的字符串,即便不需要转换,在内存开销方面,还是 hash 占优势。

3.应用场景

hash 类型十分适合存储对象类数据,相对于在 string 中介绍的把对象转化为 json 字符串存储,hash 的结构可以任意添加或删除‘字段名’,更加高效灵活。

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

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

1.简介

list 是按照插入顺序排序的字符串链表,可以在头部和尾部插入新的元素(双向链表实现,两端添加元素的时间复杂度为 O(1))。插入元素时,如果 key 不存在,redis 会为该 key 创建一个新的链表,如果链表中所有的元素都被移除,该 key 也会从 redis 中移除。

2.数据模型

0?wx_fmt=png

常见操作时用 lpush 命令在 list 头部插入元素, 用 rpop 命令在 list 尾取出数据。

3. 应用场景

(1) 消息队列

redis 的 list 数据类型对于大部分使用者来说,是实现队列服务的最经济,最简单的方式。 

(2) “最新内容”

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

4.优化建议

list 是链表结构,所有如果在头部和尾部插入数据,性能会非常高,不受链表长度的影响;但如果在链表中插入数据,性能就会越来越差。

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

1.简介

  • set 数据类型是一个集合(没有排序,不重复),可以对 set 类型的数据进行添加、删除、判断是否存在等操作(时间复杂度是 O(1) )

  • set 集合不允许数据重复,如果添加的数据在 set 中已经存在,将只保留一份。

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

2.数据模型

0?wx_fmt=png

3.应用场景

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

1.“共同好友列表”

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

  1. // 这里为了方便阅读,把 id 替换成姓名

  2. sadd user:wade james melo paul kobe

  3. sadd user:james wade melo paul kobe

  4. sadd user:paul wade james melo kobe

  5. sadd user:melo wade james paul kobe

  6. // 获取 wade 和 james 的共同好友

  7. sinter user:wade user:james

  8. /* 输出:

  9. *      1) "kobe"

  10. *      2) "paul"

  11. *      3) "melo"

  12. */

  13. // 获取香蕉四兄弟的共同好友

  14. sinter user:wade user:james user:paul user:melo

  15. /* 输出:

  16. *      1) "kobe"

  17. */

  18. /*

  19. 类似的需求还有很多 , 必须把每个标签下的文章 id 存到集合中,可以很容易的求出几个不同标签下的共同文章;

  20. 把每个人的爱好存到集合中,可以很容易的求出几个人的共同爱好。

  21. */

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

1.简介

在 set 的基础上给集合中每个元素关联了一个分数,往有序集合中插入数据时会自动根据这个分数排序。

2.应用场景

在集合类型的场景上加入排序就是有序集合的应用场景了。比如根据好友的“亲密度”排序显示好友列表。

  1. // 用元素的分数(score)表示与好友的亲密度

  2. zadd user:kobe 80 james 90 wade  85 melo  90 paul

  3. // 根据“亲密度”给好友排序

  4. zrevrange user:kobe 0 -1

  5. /**

  6. * 输出:

  7. *      1) "wade"

  8. *      2) "paul"

  9. *      3) "melo"

  10. *      4) "james"

  11. */

  12. // 增加好友的亲密度

  13. zincrby user:kobe 15 james

  14. // 再次根据“亲密度”给好友排序

  15. zrevrange user:kobe 0 -1

  16. /**

  17. * 输出:

  18. *      1) "james"

  19. *      2) "wade"

  20. *      3) "paul"

  21. *      2) "melo"

  22. */

  23. //类似的需求还出现在根据文章的阅读量或点赞量对文章列表排序


0?wx_fmt=png


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

这一篇文章详细分析了redis五中数据类型,很值得学习,在此转载一下,感谢原作者的无私分享!!  转载地址:/gaogaoshan/artic...
  • Tim_phper
  • Tim_phper
  • 2016年07月12日 17:42
  • 973

Redis数据类型及使用场景

转自: http://www.kubiji.cn/juhe-id7106.html Redis数据类型及使用场景 来源:WQTech阅读:2936时间:2 小时前 摘要:Redis相比其它的KV...
  • guangzhi0633
  • guangzhi0633
  • 2017年02月08日 14:39
  • 429

Redis 五种数据类型的常见用法以及应用场景

1、String 常用命令: 除了get、set、incr、decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一段内容 设置...
  • zaxzdqd
  • zaxzdqd
  • 2015年04月28日 21:33
  • 1009

Redis各个数据类型的使用场景

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 Redis列表命令 参考:http:/...
  • Richard_Jason
  • Richard_Jason
  • 2016年11月11日 17:03
  • 5622

Redis的五种存储类型和其应用场景

常用数据类型简介:redis常用五种数据类型:string,hash,list,set,zset(sorted set).1.String类型String是最简单的类型,一个key对应一个valueS...
  • qq_19943157
  • qq_19943157
  • 2016年01月11日 11:30
  • 11972

Redis应用场景

1.  MySql+Memcached架构的问题   实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业...
  • hguisu
  • hguisu
  • 2013年05月06日 20:23
  • 98400

Redis应用场景 redis精髓

Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象构建不同的...
  • LXB15959168136
  • LXB15959168136
  • 2015年10月09日 22:13
  • 2205

Redis高级特性及应用场景

Redis高级特性及应用场景         redis中键的生存时间(expire) redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它。 ...
  • u011204847
  • u011204847
  • 2016年05月03日 10:50
  • 18521

redis常见使用场景下PHP实现

基于redis字符串string类型的简单缓存实现
  • github_26672553
  • github_26672553
  • 2017年02月25日 09:03
  • 1280

谈谈redis,memcache的区别和具体应用场景

1. Memcached简介 来源:https://www.cnblogs.com/Hondsome/p/5962144.html Memcached是以LiveJurnal旗下Danga I...
  • u012316953
  • u012316953
  • 2017年11月11日 20:54
  • 129
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Redis 数据类型及应用场景
举报原因:
原因补充:

(最多只允许输入30个字)