NoSql数据库Redis系列(2)——Redis数据类型

1、设计 Redis Key

(一)、分段设计法html

  使用冒号把 key 中要表达的多种含义分开表示,步骤以下:redis

      一、把表名转化为 key 前缀数据库

      二、主键名(或其余经常使用于搜索的字段)json

     三、主键值segmentfault

     四、要存储的字段。安全

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;

  注意:Redis的命令不区分大小写,可是key 严格区分大小写!!!

2、string 数据类型

(一)、简介

  string 是Redis的最基本的数据类型,能够理解为与 Memcached 如出一辙的类型,一个key 对应一个 value。string 类型是二进制安全的,意思是 Redis 的 string 能够包含任何数据,好比图片或者序列化的对象,一个 redis 中字符串 value 最多能够是 512M。

(二)、数据模型

  string 类型是基本的 Key-Value 结构,Key 是某个数据在 Redis 中的惟一标识,Value 是具体的数据。

Key

Value

‘name’

‘redis’

‘type’

‘string’

(三)、 应用场景

(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 全部的操做都是原子性的,因此没必要担忧多客户端链接时可能出现的事务问题

(四)、string 数据类型在 Redis 中的相关命令:

  

   

  PS:上面的 ttl 命令是返回 key 的剩余过时时间,单位为秒。

  上面是 string 类型的基本命令,下面介绍几个自增自减操做,这在实际工做中仍是特别有用的(分布式环境中统计系统的在线人数,利用Redis的高性能读写,在Redis中完成秒杀,而不是直接操做数据库。)。

  

   

2、hash 数据类型

(一)、简介  

hash 是一个键值对集合,是一个 string 类型的 key和 value 的映射表,key 仍是key,可是value是一个键值对(key-value)。类比于 Java里面的 Map<String,Map<String,Object>> 集合。

(二)、数据模型

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

id

name

type

1

redis

hash

若是要用 redis 的 hash 结构存储,数据模型以下:

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

(三)、应用场景

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

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

(四)、hash数据类型在 Redis 中的相关命令:

   

   演示以下:

  

3、list 数据类型

(一)、简介

  list 列表,它是简单的字符串列表,按照插入顺序排序,你能够添加一个元素到列表的头部(左边)或者尾部(右边),它的底层其实是个链表。

(二)、数据模型

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

(三)、应用场景

(1) 消息队列

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

(2) “最新内容”

     由于 list 结构的数据查询两端附近的数据性能很是好,因此适合一些须要获取最新数据的场景,好比新闻类应用的 “最近新闻”。 

(四)、hash数据类型在 Redis 中的相关命令:

  

   

  

(五)、优化建议

  list 是链表结构,全部若是在头部和尾部插入数据,性能会很是高,不受链表长度的影响;但若是在链表中插入数据,性能就会愈来愈差。

4、set 数据类型

(一)、简介

       set 数据类型是一个集合(没有排序,不重复),能够对 set 类型的数据进行添加、删除、判断是否存在等操做(时间复杂度是 O(1) )
  set 集合不容许数据重复,若是添加的数据在 set 中已经存在,将只保留一份。
  set 类型提供了多个 set 之间的聚合运算,如求交集、并集、补集,这些操做在 redis 内部完成,效率很高。

(二)、数据模型

(三)、应用场景

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 存到集合中,能够很容易的求出几个不一样标签下的共同文章; 把每一个人的爱好存到集合中,能够很容易的求出几我的的共同爱好。 */

(四)、set数据类型在 Redis 中的相关命令:

  Redis 的 set 是 string 类型的无序集合。

   

   

  

5、zset 数据类型

(一)、简介

  zset(sorted set 有序集合),和上面的set 数据类型同样,也是 string 类型元素的集合,可是它是有序的。

(二)、应用场景

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

// 用元素的分数(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" */
 
 //相似的需求还出如今根据文章的阅读量或点赞量对文章列表排序
 新浪微博微信TwitterFacebook

(三)、zset数据类型在 Redis 中的相关命令:

  

  

6、系统相关命令

  

7、key 相关命令

  关于 key 的命令应该说是最经常使用的,须要你们记住。

  

   

  

  这里在介绍一个命令 :

OBJECT ENCODING key 

  这是用来显示这五种数据类型的底层数据结构,下一篇博客咱们会详细介绍。

  

   上面的命令咱们给string 数据类型 k1 复制str,给 k2 复制123,经过 OBJECT ENCODING 显示底层实现的数据类型分别是 embstr 和 int。这究竟是什么呢?下篇博客咱们会详细介绍的。 

参考资料:http://www.javashuo.com/article/p-dippyzhn-gq.html

     https://segmentfault.com/a/1190000012212663?utm_source=tag-newest

相关文章
相关标签/搜索