Redis 操作数据
展现最新数据
Web应用常常要展现最新数据,就会根据时间对数据排序:
SELECT * FROM foo WHERE ... ORDER BY time DESC LIMIT 10
随着数据的增加,问题变得越来越复杂,速度也越来越慢。这种情况可以用Redis解决,如这个问题:一个web应用需要展示最新的20条用户评论。
- 每当一条新评论产生时,将评论id加到redis的list中:LPUSH latest.comments <ID>
- 裁剪list,保持固定长度(如只保留5000条):LTRIM latest.comments 0 5000
- 当需要展示具体评论时,可以调用如下函数:
[plain] view plain copy
- FUNCTION get_latest_comments(start,num_items):
- id_list = redis.lrange("latest.comments",start,start+num_items-1)
- IF id_list.length < num_items
- id_list = SQL_DB("SELECT ... ORDER BY time LIMIT ...")
- END
- RETURN id_list
- END
在这里,redis做为一个实时缓存,无需不停的刷新。MySQL只有在需要更细节的信息和间隔可以较长的情况下被使用。
删除和筛选
注意到可以用LREM删除评论。如果删除不频繁,也可以在redis中保留这条记录,在我们去mysql查询时,会获取不到结果。
很多时候,你想筛选展现不同的数据表,使用多个redis list就可以了。每个list包含5000条,而redis用很少的内存就可以存储上百万的记录。
排行榜和相关问题
如果数据存储在DB中,且每秒都有很多更新。要想实时的展现一个分数排名榜,且要很好的性能,就会变得很困难。这个经典例子就是在线游戏的排名榜,如Facebook游戏,但是这种类型适用于很多场景。在线游戏里,你会收到非常多的用户分数更新,利用这些分数,你想完成如下功能:
- 展现排名前100的分数
- 展现用户自己的排名
即使你有数百万用户,每分钟有数百万的分数更新,使用Redis的sorted set处理这类问题也很容易。
处理方法:每当收到一个新分数时,就如下操作
[cpp] view plain copy
- ZADD leaderboard <score> <username>
得到前100用户排名只需:ZREVRANGE leaderboard 0 99
告诉用户自己的排名:ZREVRANK leaderboard <username>
补:ZRANK/ZRANGE是从小到大排序,ZREVRANK/ZREVRANGE是从大到小排序
你可以做的还有很多,如展示和用户排名相近的分数:ZRANGEBYSCORE leaderboard 500 700
根据用户投票和时间排序
上个例子是根据分数排名,但是新闻网站会采用下面的公式排名新闻。
[cpp] view plain copy
- score = points / time^alpha
用户投票会相应的提升排名,但是时间会指数式的拉低排名。可以发现可以展现在首页的新闻只可能在最新的新闻中选出(如最新的1000条),所以可以忽略其他的新闻:
- 每当提交一条新闻时,将ID增加到list中:LPUSH + LTRIM(保证1000条)
- 启动一个线程不断的读取list并计算最终的分数,然后使用zadd将结果存到sorted set中,同时将旧新闻从sorted set中清除
在这个例子中,我们使用了保存1000条新闻、根据分数排名的sorted set。这个sorted set可以支持每秒10万次的查询,很容易的适应网站的规模
数据过期
sorted set的另一个用处可以用时间来索引数据,如unix time做为score。但是更好的使用我们可以用来过期主库中的一些数据:
- 当有新数据插入DB时,将它同时插入sorted set,用该数据应该过期的时间做为score(current_time + time_to_live)
- 后台程序使用ZRANGE ... WITHSCORES来去最新的10条,如果表示时间的score已经过去了,我们就将这条数据从db中删除
计数
使用INCRBY和其他类似的命令,Redis可以成为一个很好的计数器。很多时候,你想在db中新增计数器来统计新信息,但又不得不避免使用它,因为对于db来说它是个写密集的任务。
使用Redis就没有这种顾忌了。原子自增实现计数,GETSET原子性的获得计数器当前值并清零,设置有效期来达到只在规定时间内进行计数的目的。
[cpp] view plain copy
- INCR user:<id>
- EXPIRE user:<id> 60
如上,你可以计数用户60s内看了多少网页,如果达到20,你可以展现一些提示或者横幅。
固定时间内单独的N条数据
统计一段时间内浏览某资源的单独用户量,这个功能对于db很困难,但使用redis就很容易实现。例如,我想知道阅读一篇文章的单独注册用户数或者单独IP数。
每当获得一次页面浏览时,只需要做:
[cpp] view plain copy
- SADD page:day1:<page_id> <user_id>
day1可以用今天的第一秒(unix time: time() - (time()%3600*24))。
想知道单独用户数?SCARD page:day1:<page_id>
想知道某个用户是否已经看过该页面?SISMEMBER page:day1:<page_id>
实时分析
通过redis的各种命令和数据结构,可以很容易的实现大数据的实时统计,来增强反垃圾邮件系统或者用新信息来提高服务质量。
Pub/Sub
Redis的Pub/Sub非常简单、稳定、快速,而且支持模式匹配、动态订阅/取消订阅频道等等。
队列
你可能已经注意到list的push/pop命令很适合用来实现队列,当list没有元素时,你甚至可以使用BLPOP来阻塞POP命令。
Redis做为队列的使用可以参考Resque。
list的RPOPLPUSH,sorted set等都可以实现很多有趣的队列。
缓存
单单这部分就可以用一篇专门的博客来介绍。这里长话短说,Redis可以做为memcached的替代,让你的cache更新更容易,数据管理更方便。
Redis现在就可以修复你的问题
现在就使用redis吧,会让你的用户更满意,系统更简单,网址响应更快。不需要使用redis来替换已有的组件,用redis去解决更加不可能、更加困难、更有价值的事吧。Redis3.0集群与应用场景
Redis 操作数据相关推荐
- 你以为Redis的数据被删除了就没事了,还占用那么大的内存呢
前言 通过 CONFIG SET maxmemory 100mb 或者在 redis.conf 配置文件设置 maxmemory 100mb Redis 内存占用限制.当达到内存最大值值,会触发内存 ...
- 深入分析Redis内存碎片
前言 我们先来看一个问题, 假设Redis实例保存了5GB的数据,现在删除了2GB的数据,那么Redis进程占用的内存会不会减少呢? 答案是:它可能仍然占用大约5GB内存,即使Redis数据只占用大约 ...
- Spring Boot学习之旅:(六)springboot 整合 redis 以及 redis 通用工具类
这编文章主要介绍了springboot整合redis,以及redis配置和一些redis操作数据的工具类. 首先倒入redis依赖 一.依赖 <dependency><groupId ...
- Redis基本操作数据命令
key keys * 获取所有的key select 0 选择第一个库 move myString 1 将当前的数据库key移动到某个数据库,目标库有,则不能移动 flush db 清除指定库 ran ...
- 常用的高性能 KV 存储 Redis、Memcached、etcd、Zookeeper 区别
1. 什么是 KV 存储 KV 是 Key-Value 的缩写,KV 存储也叫键值对存储.简单来说,它是利用 Key 做索引来实现数据的存储.修改.查询和删除功能. 常用的高性能 KV 存储主要有 R ...
- Redis 入门知识
Redis 的前世今生 Redis的诞生于2008年,由Salvatore Sanfilippo开发.最初作者在开发一个网站时,需要实现一个高性能的队列功能,在使用Mysql无果后,决定自己造一个轮子 ...
- 首长,Redis性能优化十三条军规立好了,请过目~
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 前言 Redis作为高性能的内存数据库,在大数据量的情况下 ...
- Redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:爱宝贝丶 my.oschina.net/zhangxufen ...
- Redis简介、特性、优势、应用场景和nosql介绍
1. nosql介绍 NoSQL:一类新出现的数据库(not only sql) 泛指非关系型的数据库 [不需要分析表与表之间的关系] 不支持SQL语法 存储结构跟传统关系型数据库中的那种关系表完全 ...
最新文章
- 网银和银企直联的区别
- nginx工作进程处理请求的系统调用
- Android Studion有用的快捷键
- AJPFX关于构造器的总结
- 一步步教你前端vue项目开发中如何解决跨域问题
- HDU 2222 Keywords Search
- Spring Cloud 服务治理
- 2017 Multi-University Training Contest - Team 5:1001. Rikka with Candies(手写bitset)
- 配置tomcat远程debug
- TreeSet与TreeMap
- 计算机机房需求调查表,机房建设需求调查表.doc
- photoshop Mac版本安装
- 范德堡计算机科学硕士,美国范德堡大学计算机科学专业怎么样?
- Python —— 数据科学的手段 (第2版)配套代码
- 有一种焦虑叫三十不立
- 皮皮虾如何引流?皮皮虾运营如何变现?皮皮虾APP怎么引流?
- vue分类筛选方法,filer
- element ts vue 中的表单验证出现红色波浪线的解决方法
- plsql 连接 虚拟机Linux下的Oracle数据库 失败
- linux重装出现cannot load file 5555h,装系统出现error cannot load file code 5555h 的解决