Redis⽀持哪⼏种数据类型?
Redis⽀持哪⼏种数据类型?
1 什么是Redis?
Redis(Remote Dictionary Server)本质上是⼀个Key-Value类型的内存数据库,很像Memcached,整个数据库统统加载在内存当中进⾏操作,定期通过异步操作把数据库数据flush到硬盘上进⾏保存。因为是纯内存操作,Redis的性能⾮常出⾊,每秒可以处理超过10万次读写操作,是已知性能最快的Key-Value DB。
2 优缺点
优点:
Redis的出⾊之处不仅仅是性能,Redis最⼤的魅⼒是⽀持保存多种数据结构,此外单个value 的最⼤限制是1GB,不像Memcached 只能保存1MB的数据,因此Redis可以⽤来实现很多有⽤的功能。
⽐⽅说⽤他的List来做FIFO双向链表,实现⼀个轻量级的⾼性能消息队列服务,⽤他的Set可以做⾼性能的tag系统等等。
另外Redis也可以对存⼊的Key-Value设置expire时间,因此也可以被当作⼀ 个功能加强版的 Memcached来⽤。
缺点:
Redis的主要缺点是数据库容量受到物理内存的限制,不能⽤作海量数据的⾼性能读写,因此Redis适合的场景主要局限在较⼩数据量的⾼性能操作和运算上。
3 Redis相⽐Memcached有哪些优势?
Memcached所有的值均是简单的字符串,Redis作为其替代者,⽀持更为丰富的数据类型
Redis的速度⽐Memcached快很多
Redis可以持久化其数据
4 Redis⽀持的数据类型
Redis⽀持五种数据类型:
String(字符串)、List(列表)、Set(集合)、Zset(Sorted Set:有序集合)、以及Hash(哈希)。
4.1 String(字符串)
格式: set key value
String类型是⼆进制安全的,Redis的String可以包含任何数据。⽐如jpg图⽚或者序列化的对象 。
String类型是Redis最基本的数据类型,可以理解成与 Memcached ⼀模⼀样的类型,⼀个 key 对应⼀个 value,⼀个键最⼤能存储
512MB。
常⽤命令
set、get、decr、incr、mget等。
使⽤场景
缓存功能:字符串最经典的使⽤场景,Redis作为缓存层,MySQL作为储存层,绝⼤部分请求数据都是Redis中获取,由于Redis具有⽀撑⾼并发特性,所以缓存通常能起到加速读写和降低后端压⼒的作⽤。
计数器:许多运⽤都会使⽤Redis作为计数的基础⼯具,他可以实现快速计数、查询缓存的功能,同时数据可以⼀步落地到其他的数据源。
例如:视频播放数系统就是使⽤Redis作为视频播放数计数的基础组件。
共享Session:出于负载均衡的考虑,分布式服务会将⽤户信息的访问均衡到不同服务器上,⽤户刷新⼀次访问可能会需要重新登录,为避免这个问题可以⽤Redis将⽤户Session集中管理,在这种模式下只要保证Redis的⾼可⽤和扩展性的,每次获取⽤户更新或查询登录信息都直接从Redis中集中获取。
限速:处于安全考虑,每次进⾏登录时让⽤户输⼊⼿机验证码,为了短信接⼝不被频繁访问,会限制⽤户每分钟获取验证码的频率。
4.2 List(列表)
Redis 列表是简单的字符串列表,按照插⼊顺序排序。你可以添加⼀个元素到列表的头部(左边)或者尾部(右边)
格式: lpush name value
在 key 对应 list 的头部添加字符串元素
格式: rpush name value
在 key 对应 list 的尾部添加字符串元素
格式: lrem name index
key 对应 list 中删除 count 个和 value 相同的元素
格式: llen name
返回 key 对应 list 的长度
常⽤命令
lpush、rpush、lpop、rpop、lrange等。
使⽤场景
消息队列: Redis的lpush+brpop命令组合即可实现阻塞队列,⽣产者客户端是⽤lupsh从列表左侧插⼊元素,多个消费者客户端使⽤brpop命令阻塞时的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和⾼可⽤性。
4.3 Set(集合)
格式: sadd name value
Redis的Set是string类型的⽆序集合。
集合是通过哈希表实现的,所以添加,删除,查的复杂度都是O(1)。
常⽤命令
sadd、spop、smembers、sunion等。
使⽤场景
标签(tag):集合类型⽐较典型的使⽤场景,如⼀个⽤户对娱乐、体育⽐较感兴趣,另⼀个可能对新闻感兴趣,这些兴趣就是标签,有了这些数据就可以得到同⼀标签的⼈,以及⽤户的共同爱好的标签,这些数据对于⽤户体验以及曾强⽤户粘度⽐较重要。
注意:⽤户和标签的关系维护应该放在⼀个事物内执⾏,防⽌部分命令失败造成数据不⼀致。
4.4 Sorted Set(有序集合)
格式: zadd name score value
Sorted Set和Set⼀样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联⼀个double类型的分数。redis正是通过分数来为集合中的成员进⾏从⼩到⼤的排序。
有序集合的成员是唯⼀的,但分数(score)却可以重复。
常⽤命令
zadd、zrange、zrem、zcard等。
使⽤场景
排⾏榜:例如视频⽹站需要对⽤户上传的视频做排⾏榜,榜单维护可能是多⽅⾯:按照时间、按照播放量、按照获得的赞数等。
4.5 Hash(哈希)
格式: hmset name key1 value1 key2 value2
Redis hash 是⼀个键值(key=>value)对集合。
Redis hash是⼀个string类型的field和value的映射表,hash特别适合⽤于存储对象。
常⽤命令
hget、hset、hgetall等。
使⽤场景
通常⽤来存储⼀个⽤户信息的对象数据,例如记录⽹站每个⽤户个⼈主页的访问量:hincrby user:1:info pageviewcount。
缓存视频的基本信息(数据源在Mysql中)。
5 Redis有哪些适合的场景?redis支持的五种数据类型
(1)会话缓存(Session Cache)
最常⽤的⼀种使⽤Redis的情景是会话缓存(session cache)。⽤Redis缓存会话⽐其他存储(如 Memcached)的优势在于:Redis提供持久化。当维护⼀个不是严格要求⼀致性的缓存时,如果⽤户
的购物车信息全部丢失,⼤部分⼈都会不⾼兴的,现在他们还会这样吗?
幸运的是,随着Redis这些年的改进,很容易到怎么恰当的使⽤Redis来缓存会话的⽂档。甚⾄⼴为⼈知的商业平台Magento也提供Redis的插件。
(2)全页缓存(FPC)
除基本的会话token之外,Redis还提供很简便的FPC平台。回到⼀致性问题,即使重启了Redis实例,因为有磁盘的持久化,⽤户也不会看到页⾯加载速度的下降,这是⼀个极⼤改进,类似PHP本地FPC。
再次以Magento为例,Magento提供⼀个插件来使⽤Redis作为全页缓存后端。此外,对WordPress的⽤户来说,Pantheon有⼀个⾮常好的插件wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页⾯。
(3)队列
Reids在内存存储引擎领域的⼀⼤优点是提供list和set操作,这使得Redis能作为⼀个很好的消息队列平台来使⽤。Redis作为队列使⽤的操作,就类似于本地程序语⾔(如Python)对list的push/pop操作。
如果你快速的在Google中搜索“Redis queues”,你马上就能到⼤量的开源项⽬,这些项⽬的⽬的就是利⽤Redis创建⾮常好的后端⼯具,以满⾜各种队列需求。例如,Celery有⼀个后台就是使⽤Redis作为broker,你可以从这⾥去查看。
(4)排⾏榜/计数器
Redis在内存中对数字进⾏递增或递减的操作实现的⾮常好。集合(Set)和有序集合(Sorted Set)也使得我们在执⾏这些操作的时候变的⾮常简单,Redis只是正好提供了这两种数据结构。
所以,我们要从排序集合中获取到排名最靠前的 10 个⽤户–我们称之为“user_scores”,我们只需要像下⾯⼀样执⾏即可:
当然,这是假定你是根据你⽤户的分数做递增的排序。如果你想返回⽤户及⽤户的分数,你需要这样执⾏:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games就是⼀个很好的例⼦,⽤Ruby实现的,它的排⾏榜就是使⽤Redis来存储数据的,你可以在这⾥看到。
(5)发布/订阅
最后是 Redis 的发布/订阅功能。发布/订阅的使⽤场景确实⾮常多。我已看见⼈们在社交⽹络连接中使⽤,还可作为基于发布/订阅的脚本触发器,甚⾄⽤ Redis 的发布/订阅功能来建⽴聊天系统。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。