背景最近工作中开始使用redis,本文就本人目前的理解对redis做一个概括性的介绍,并简单举例几个工作中的应用,最后总结redis使用中的规范,期望以比较全面的方式整理redis相关知识给大家。redis介绍Redis(Remot...
背景
最近工作中开始使用redis,本文就本人目前的理解对redis做一个概括性的介绍,并简单举例几个工作中的应用,最后总结redis使用中的规范,期望以比较全面的方式整理redis相关知识给大家。
redis介绍
Redis(Remote Dictionary Server)可以理解是一个基于内存的key-value存储数据结构。“基于内存”表示所有数据直接存在内存中,拥有较快的IO速度,“基于key-value”表示它很适合与基于key的查找操作,达到O(1)的复杂度。
redis拥有简单key-value数据结构存储功能,主要数据结构包括string、hash、set、list、zset和不常见的复杂数据结构bitmap和Hyperloglogs。
下面列举不同数据结构的操作来加深对redis提供数据结构的理解:
1、string数据结构
set box “hello" (添加元素,表示设置key为box,value为hello)
get box (获取key为box对应的value值)
2、list数据结构
LPUSH friends “sandy” (向列表左边加入元素)
RPUSH friends “bruce" (向列表右边加入元素)
LRANGE friends 0 -1 (两个参数,左右封闭,第二个参数-1表示显示所有元素)
LLEN friends (返回list的长度)
LPOP friends (删除左边元素,并返回该值)
RPOP friends (删除右边元素,并返回该值)
可以应用list数据结构实现队列和栈的效果
3、set数据结构(同一个key里面的元素集合没有重复)
SADD home_member “xwc" (添加元素)
SREM home_member “xwc” (删除元素)
SISMEMBER home_member “xwc” (判断是否存在xwc,存在返回1,不存在返回0)
SMEMBERS home_member (返回set中所有元素)
SRANDMEMBER key [count] 随机返回count个数元素
SUNION A B (将A,B集合放一起)
4、hash数据结构
命令结构:HSET key field value
HSET user name "John Smith” (给key为user,属性为name的字段赋值John Smith)
HSET user email "john.smith@example.com" (给key为user,属性为email的字段赋值john.smith@example.com)
HGETALL user (获取key为user的所有属性值)
HINCBY user age 5 (给key为user,属性为age的值加上5)
5、zset数据结构
命令结构:ZADD key score value
ZADD xwc 112 "apple” (设置key为xwc,value为apple,分数score为102分,zset会根据score字段排序)
ZADD xwc 120 "banana” (同上)
ZRANGE xwc 0 -1 (返回key为xwc,value为从小到大排序的集合所有元素)
zrevrange xwc 0 2 (返回按分数从大到小排序的前3个元素)
redis应用
相对于传统关系型数据库,redis具有简单数据结构、单线程,内存存储和支持高并发的特点,适合很多社交应用。
1、指标计数
社交应用一般会有帖子广场(feed 流),可以实时采集用户行为信息日志,对每个帖子的点击、点赞、转发、分享哥和曝光进行计数统计。
使用hash数据结构可以对不同feedID的几个属性指标统计。
2、排行榜
排行榜例如feed热门榜需要实时计算热度,根据热度来排名。redis的zset数据结构就非常合适,因为zset的每一个元素都有score,可以更新score来实现排行榜功能。
具体实现有两种:
- 离线计算,使用一个list来维护需要排序的候选集,定时对list里面的元素计算score更新zset。
- 实时计算,使用flink、spark streaming实时消费用户对帖子的行为日志,对新行为帖子计算score分数。实现较复杂,但是几乎实时更新帖子榜单。
3、过滤与去重
使用redis存储用户访问帖子历史记录来实现去重功能。
4、热门数据存储
数据如果分为冷热,将热数据放到redis,当访问数据时如果redis没有则可以从传统数据库读取。利用redis内存存储访问快的特点来优化服务性能。
5、记录近一段时间信息
很多时候我们只需要保留最近2天活跃的用户信息,这个时候可以使用zset数据结构,score使用用户最近访问的timestamp,这样可以根据score维持两天内用户信息,超过2天的删除。
6、pub/sub 消息订阅发布
Redis的Pub/Sub非常非常简单,运行稳定并且快速,支持模式匹配,能够实时订阅与取消频道。redis与kafka的pub/sub不同之处在于没有持久化,如果订阅者挂掉,那么在从挂掉到恢复后这段时间的消息是丢失的,所以redis适用于可以容忍丢失消息的场景。
7、队列功能
redis支持阻塞队列,list列表没元素的时候阻塞,实现一个功能简单的messaging系统。
8、好友关系存储
redis简单的数据结构适合存储一对多关系,如用户关注列表,用户粉丝列表。
9、缓存数据
相对于存在磁盘,如果数据量不是很大,存在内存存储redis能加速读写效率。
关于redis常见问题?
这里整理了几个认识redis过程的常见问题:
redis为什么这么快?
- 纯内存,类似于HashMap结构,HashMap的优势就是查找和操作的时间复杂度都是O(1);
- 数据结构简单,读写数据量小
- 单线程处理,减少线程上下文切换开销,省去考虑同步问题
- 多路IO复用(多路是处理多线程连接,IO复用是重复使用一个线程执行请求)
因为是单线程处理每次执行,cpu不是redis程序的瓶颈,反而内存最可能是瓶颈。
redis能不能持久化?
能,支持RDB和AOF持久化。
-
RDB:定时执行快照保存内存中数据到本地磁盘,直接将databases中的key-value的二进制形式存储在了rdb文件中。
优点:性能较高,因为是快照,且执行频率比aof低,而且rdb文件中直接存储的是key-values的二进制形式,对于恢复数据也快。
缺点:在上一次快照和下一次快照之间宕机,这个时间段之内的数据丢失。 -
AOF(Ahead of File):redis将对数据的每一条修改命令追加到aof文件中。
**优点:**宕机后数据能从AOF文件中获取,数据没有丢失。
**缺点:**性能较低,因为每次修改操作都会将追加到AOF文件。
关于redis持久化信息可参考:RDB+AOF
redis是否支持分布式?
支持,这是在redis 3.0之后开始支持集群模式部署。 一个Redis 集群包含 16384 个哈希槽(hash slot),数据库中的每个key都属于这 16384个哈希槽的其中一个(会根据key计算crc16的hashcode,然后对16384取模),集群中的每个节点负责处理一部分哈希槽。 例如一个集群有三个节点,其中:
- 节点 A 负责处理 0 号至 5500 号哈希槽。
- 节点 B 负责处理 5501 号至 11000 号哈希槽。
- 节点 C 负责处理 11001 号至 16384 号哈希槽。
如果有新节点加入或退出,可以根据一致性hash算法来重新平衡槽的分布。
redis一共支持三种模式:主从模式、sentinel模式和cluster模式,其中集群模式就是纯分布式的,扩展性好。
redis与memcache的区别?
redis和memcache读写性能和存储效率相当,此外还有如下不同:
redis | memcache | |
---|---|---|
数据结构 | 支持多种数据结构 | 只支持key-value数据结构 |
集群模型 | 支持 | 不支持 |
数据持久化/同步 | 支持 | 不支持 |
网络IO模型 | 多线程 | 单线程IO复用 |
数据一致性 | 通过事物支持 | 通过CAS支持 |
参考:
Redis应用场景
也谈谈 Redis 和 Memcached 的区别
本文标题为:redis入门介绍及社交行业应用
基础教程推荐
- Sql Server Management Studio连接Mysql的实现步骤 2023-07-29
- SQLServer 清理日志的实现 2023-07-29
- Redis如何实现延迟队列 2023-07-13
- 关于MySQL中explain工具的使用 2023-07-27
- python中pandas库的iloc函数用法解析 2023-07-28
- 【Redis】数据持久化 2023-09-12
- Mysql查询所有表和字段信息的方法 2023-07-26
- Mysql主从三种复制模式(异步复制,半同步复制,组复 2022-09-01
- Python常见库matplotlib学习笔记之多个子图绘图 2023-07-27
- 如何将excel表格数据导入postgresql数据库 2023-07-20