一、设计 Redis Key
(一)、分段设计法
使用冒号把 key 中要表达的多种含义分开表示,步骤如下:
1、把表名转化为 key 前缀
2、主键名(或其他常用于搜索的字段)
3、主键值
4、要存储的字段。
eg. 用户表(user)
id |
name |
|
---|---|---|
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 严格区分大小写!!!
二、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中完成秒杀,而不是直接操作数据库。)。
二、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 的结构可以任意添加或删除‘字段名’,更加高效灵活。
(四)、hash数据类型在 Redis 中的相关命令:
演示如下:
三、list 数据类型
(一)、简介
list 列表,它是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边),它的底层实际上是个链表。
(二)、数据模型
常见操作时用 lpush 命令在 list 头部插入元素, 用 rpop 命令在 list 尾取出数据。
(三)、应用场景
(1) 消息队列
redis 的 list 数据类型对于大部分使用者来说,是实现队列服务的最经济,最简单的方式。
(2) “最新内容”
因为 list 结构的数据查询两端附近的数据性能非常好,所以适合一些需要获取最新数据的场景,比如新闻类应用的 “最近新闻”。
(四)、hash数据类型在 Redis 中的相关命令:
list 是链表结构,所有如果在头部和尾部插入数据,性能会非常高,不受链表长度的影响;但如果在链表中插入数据,性能就会越来越差。
四、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 类型的无序集合。
五、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 中的相关命令:
六、系统相关命令
七、key 相关命令
关于 key 的命令应该说是最常用的,需要大家记住。
这里在介绍一个命令 :
OBJECT ENCODING key
这是用来显示这五种数据类型的底层数据结构,下一篇博客我们会详细介绍。
上面的命令我们给string 数据类型 k1 复制str,给 k2 复制123,通过 OBJECT ENCODING 显示底层实现的数据类型分别是 embstr 和 int。这到底是什么呢?下篇博客我们会详细介绍的。
参考资料:https://www.cnblogs.com/ysocean/p/9080940.html
https://segmentfault.com/a/1190000012212663?utm_source=tag-newest