当前位置: 首页 > news >正文

Redis实战(1)入门和适用场合

Redis 是一个 Key-Value 存储系统。和 Memcached 类似,它支持存储的 value 类型相对更多,
包括 string(字符串)、list(链表)、set(集合)和 zset(有序集合)。这些数据类型都支持 push/pop、
add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础
上,Redis 支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在
内存中。区别的是 Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录
文件,并且在此基础上实现了 master-slave(主从)同步。


一、初识 Redis


Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、
Key-Value 数据库,并提供多种语言的 API。 


1、数据类型:

作为 Key-value 型数据库,Redis 也提供了键(Key)和键值(Value)的映射关系。但是,除
了常规的数值或字符串,Redis 的键值还可以是以下形式之一:
Lists (列表)
Sets (集合)
Sorted sets (有序集合)
Hashes (哈希表)
键值的数据类型决定了该键值支持的操作。Redis 支持诸如列表、集合或有序集合的交集、
并集、查集等高级原子操作;同时,如果键值的类型是普通数字,Redis 则提供自增等原子操作。


2、持久化:

通常,Redis 将数据存储于内存中,或被配置为使用虚拟内存。通过两种方式可以实现数据持久化:

使用截图的方式,将内存中的数据不断写入磁盘;

或使用类似 MySQL 的日志方式,记录每次更新的日志。

前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。

3、主从同步

Redis 支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。

4、性能

相比需要依赖磁盘记录每个更新的数据库,基于内存的特性无疑给 Redis 带来了非常优秀的性能。读写操作之间有显著的性能差异。

二、适用场合


利用 Redis 灵活多变的数据结构和数据操作,Redis 适用的一些场景:


1、取最新 N 个数据的操作


比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的 5000 条评论的 ID 放在
Redis 的 List 集合中,并将超出集合部分从数据库获取。
使用 LPUSH latest.comments<ID>命令,向 list 集合中插入数据
插入完成后再用 LTRIM latest.comments 0 5000 命令使其永远只保存最近 5000 个 ID。
如果你还有不同的筛选维度,比如某个分类的最新 N 条,那么你可以再建一个按此分类的
List,只存 ID 的话,Redis 是非常高效的。


2、排行榜应用,取 TOP N 操作


这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,
比如按顶的次数排序,
这时候就需要我们的 sorted set 出马了,
将你要排序的值设置成 sorted
set 的 score,将具体的数据设置成相应的 value,每次只需要执行一条 ZADD 命令即可。


3、需要精准设定过期时间的应用


比如你可以把上面说到的 sorted set 的 score 值设置成过期时间的时间戳,那么就可以简单
地通过过期时间排序,定时清除过期数据了,不仅是清除 Redis 中的过期数据,你完全可以
把 Redis 里这个过期时间当成是对数据库中数据的索引,用 Redis 来找出哪些数据需要过期
删除,然后再精准地从数据库中删除相应的记录。


4、计数器应用


Redis 的命令都是原子性的,你可以轻松地利用 INCR,DECR 命令来构建计数器系统。


5、Uniq 操作,获取某段时间所有数据排重值


这个使用 Redis 的 set 数据结构最合适了,只需要不断地将数据往 set 中扔就行了,set 意为
集合,所以会自动排重。


6、实时系统,反垃圾系统


通过上面说到的 set 功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作
的集合并进行分析统计对比等。没有做不到,只有想不到。


7、Pub/Sub 构建实时消息系统


Redis 的 Pub/Sub 系统可以构建实时的消息系统,比如很多用 Pub/Sub 构建的实时聊天系统
的例子。


8、构建队列系统


使用 list 可以构建队列系统,使用 sorted set 甚至可以构建有优先级的队列系统。


9、缓存


这个不必说了,性能优于 Memcached,数据结构更多样化。


















本文转自shayang8851CTO博客,原文链接:http://blog.51cto.com/janephp/1335633,如需转载请自行联系原作者

相关文章:

  • dell 1088 安装 windows xp 蓝屏的解决方法
  • Apache服务器之------https功能
  • mongodb3.4.4安装副本集,wt引擎配置优化(二)
  • PLSql使用
  • Tomcat
  • 44、BGP配置实验之Weight选路
  • 3星|《未来公司》:Uber简史
  • 洛谷——P1348 Couple number
  • Java MongoDB基本操作
  • 用SHELL脚本来防SSH和vsftpd暴力破解(第②版)
  • 8.10 shell特殊符号cut命令
  • ckeditor body与P标签去除
  • es6中新增的常用数值扩展
  • 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 1、两层神经网络的单样本向量化表示与多样本向量化表示...
  • 华为产品升级及打补丁具体步骤
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Javascript弹出层-初探
  • JavaScript实现分页效果
  • Java多态
  • mysql 5.6 原生Online DDL解析
  • Python学习笔记 字符串拼接
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Vim 折腾记
  • Vue 重置组件到初始状态
  • 从PHP迁移至Golang - 基础篇
  • 使用docker-compose进行多节点部署
  • 延迟脚本的方式
  • 走向全栈之MongoDB的使用
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​决定德拉瓦州地区版图的关键历史事件
  • # 计算机视觉入门
  • #《AI中文版》V3 第 1 章 概述
  • (12)Linux 常见的三种进程状态
  • (LeetCode) T14. Longest Common Prefix
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计ssm电影分享网站
  • (四)c52学习之旅-流水LED灯
  • (转)大型网站的系统架构
  • (转)为C# Windows服务添加安装程序
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net 怎么循环得到数组里的值_关于js数组
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET基础篇——反射的奥妙
  • .NET开发人员必知的八个网站
  • .net流程开发平台的一些难点(1)
  • .NET项目中存在多个web.config文件时的加载顺序
  • [100天算法】-目标和(day 79)
  • [acm算法学习] 后缀数组SA
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [C#]winform部署PaddleOCRV3推理模型
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法
  • [C/C++]数据结构 深入挖掘环形链表问题