首页 > 学院 > 开发设计 > 正文

Redis 应用场景

2019-11-08 20:38:54
字体:
来源:转载
供稿:网友

非常感谢http://blog.csdn.net/zhu_tianwei/article/details/44892247

一、Redis使用场景

1.取最新N个数据的操作比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的5000条评论的ID放在Redis的List集合中,并将超出集合部分从数据库获取使用LPUSH latest.comments<ID>命令,向list集合中插入数据插入完成后再用LTRIM latest.comments 0 5000命令使其永远只保存最近5000个ID然后我们在客户端获取某一页评论时可以用下面的逻辑(伪代码)

[plain] view plain copy PRint?在CODE上查看代码片派生到我的代码片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  如果你还有不同的筛选维度,比如某个分类的最新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,数据结构更多样化。

二、Redis数据结构使用场景1.String—字符串String 数据结构是简单的 key-value 类型,value 不仅可以是 String,也可以是数字(当数字类型用 Long 可以表示的时候encoding 就是整型,其他都存储在 sdshdr 当做字符串)。使用 Strings 类型,可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受 Redis 的定时持久化(可以选择 RDB 模式或者 AOF 模式),操作日志及 Replication 等功能。除了提供与 Memcached 一样的 get、set、incr、decr 等操作外,Redis 还提供了下面一些操作:LEN niushuai:O(1)获取字符串长度APPEND niushuai redis:往字符串 append 内容,而且采用智能分配内存(每次2倍)设置和获取字符串的某一段内容设置及获取字符串的某一位(bit)批量设置一系列字符串的内容原子计数器GETSET 命令的妙用,请于清空旧值的同时设置一个新值,配合原子计数器使用2.Hash—字典在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。这时候在需要修改其中某一项时,通常需要将字符串(JSON)取出来,然后进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。简单修改一个属性就干这么多事情,消耗必定是很大的,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而 Redis 的 Hash 结构可以使你像在数据库中 Update 一个属性一样只修改某一项属性值。存储、读取、修改用户属性3.List—列表List 说白了就是链表(redis 使用双端链表实现的 List),相信学过数据结构知识的人都应该能理解其结构。使用 List 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。List 的另一个应用就是消息队列,可以利用 List 的 *PUSH 操作,将任务存在 List 中,然后工作线程再用 POP 操作将任务取出进行执行。Redis 还提供了操作 List 中某一段元素的 API,你可以直接查询,删除 List 中某一段的元素。微博 TimeLine消息队列4.Set—集合Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用 Redis 提供的 Set 数据结构,可以存储一些集合性的数据。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。共同好友、二度好友利用唯一性,可以统计访问网站的所有独立 ip好友推荐的时候,根据 tag 求交集,大于某个 threshold 就可以推荐5.Sorted Set—有序集合和Sets相比,Sorted Sets是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用 Sorted Sets 来做带权重的队列,比如普通消息的 score 为1,重要消息的 score 为2,然后工作线程可以选择按 score 的倒序来获取工作任务。让重要的任务优先执行。带有权重的元素,比如一个游戏的用户得分排行榜比较复杂的数据结构,一般用到的场景不算太多

转至:

http://www.ttlsa.com/redis/redis-the-author-talks-about-redis-application-scenario/

http://github.thinkingbar.com/redis-use-situation/


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表