所有数据存储在内存中,高速读写
提供丰富多样的数据类型:string、hash、set、sortedset、bitmap、hyperloglog
提供了AOF和RDB两种数据的持久化保存方式,保证了Redis重启后数据不丢失
Redis的所有操作都是原子性的,还支持对几个操作合并后的原子性操作,支持事务
通常我们都把数据存到关系型数据库中,但为了提升应用的性能,我们应该把访频率高且不会经常变动的数据缓存到内存中。。Redis没有像MySQL这类关系型数据库那样强大的查询功能,需要考虑如何把关系型数据库中的数据,合理的对应到缓存的key-value数据结构中。
使用冒号把key中要表达的多种含义分开表示,步骤如下:
把表名转化为key前缀
主键名(或其他常用于搜索的字段)
主键值
要存储的字段。
eg.用户表(user)
setuser:id:1:email
qq.
string类型是Redis中最基本的数据类型,最常用的数据类型,甚至被很多玩家当成redis唯一的数据类型去使用。string类型在redis中是二进制安全(binarysafe)的,这意味着string值关心二进制的字符串,不关心具体格式,你可以用它存储json格式或JPEG图片格式的字符串。
string类型是基本的Key-Value结构,Key是某个数据在Redis中的唯一标识,Value是具体的数据。
把key设计为表名:主键名:主键值:字段名
eg.
setuser:id:1:email
qq.
string类型支持任何格式的字符串,应用最多的就是存储json或其他对象格式化的字符串。(这种场景下推荐使用hash数据类型)
setuser:id:1[{"id":1,"name":"zj","email":"
qq."},{"id":1,"name":"zj","email":qq.}]
当redis的string类型的值为整数形式时,redis可以把它当做是整数一样进行自增(incr)自减(decr)操作。由于redis所有的操作都是原子性的,所以不必担心多客户端连接时可能出现的事务问题。
hash类型很像一个关系型数据库的数据表,hash的Key是一个唯一值,Value部分是一个hashmap的结构。
假设有一张数据库表如下:
如果要用redis的hash结构存储,数据模型如下:
hash数据类型在存储上述类型的数据时具有比string类型更灵活、更快的优势,具体的说,使用string类型存储,必然需要转换和解析json格式的字符串,即便不需要转换,在内存开销方面,还是hash占优势。
hash类型十分适合存储对象类数据,相对于在string中介绍的把对象转化为json字符串存储,hash的结构可以任意添加或删除‘字段名’,更加高效灵活。
hsetuser:1namezjemail
qq.
list是按照插入顺序排序的字符串链表,可以在头部和尾部插入新的元素(双向链表实现,两端添加元素的时间复杂度为O(1))。插入元素时,如果key不存在,redis会为该key创建一个新的链表,如果链表中所有的元素都被移除,该key也会从redis中移除。
常见操作时用lpush命令在list头部插入元素,用rpop命令在list尾取出数据。
redis的list数据类型对于大部分使用者来说,是实现队列服务的最经济,最简单的方式。
因为list结构的数据查询两端附近的数据性能非常好,所以适合一些需要获取最新数据的场景,比如新闻类应用的“最近新闻”。
set数据类型是一个集合(没有排序,不重复),可以对set类型的数据进行添加、删除、判断是否存在等操作(时间复杂度是O(1))
set集合不允许数据重复,如果添加的数据在set中已经存在,将只保留一份。
set类型提供了多个set之间的聚合运算,如求交集、并集、补集,这些操作在redis内部完成,效率很高。
set类型的特点是——不重复且无序的一组数据,并且具有丰富的计算功能,在一些特定的场景中可以高效的解决一般关系型数据库不方便做的工作。
社交类应用中,获取两个人或多个人的共同好友,两个人或多个人共同
七、sortedset数据类型的应用场景
1.简介
在set的基础上给集合中每个元素关联了一个分数,往有序集合中插入数据时会自动根据这个分数排序。
在集合类型的场景上加入排序就是有序集合的应用场景了。比如根据好友的“亲密度”排序显示好友列表。
//用元素的分数(score)表示与好友的亲密度zadduser:kobe80james90wade8melo90paul//根据“亲密度”给好友排序zrevrangeuser:kobe0-1/***输出:*1)"wade"*2)"paul"*)"melo"*)"james"*///增加好友的亲密度zincrbyuser:kobe1james//再次根据“亲密度”给好友排序zrevrangeuser:kobe0-1/***输出:*1)"james"*2)"wade"*)"paul"*2)"melo"*///类似的需求还出现在根据文章的阅读量或点赞量对文章列表排序
via:https://segmentfault./a/
预览时标签不可点收录于话题#个上一篇下一篇