redis
2016-04-11 10:30
441 查看
redis总结
redis与memcached
redis支持更多的数据结构redis支持数据持久化
redis支持两种存储方式:snapshot(快照)和aof(append only mode),快照是定时将内存快照持久化到硬盘(crash会丢失数据),aof是在写入数据的同时将操作命令保存到日志(不会丢失数据,但操作日志管理维护成本高)
redis单线程,memcached是多线程的
redis修改libevent实现小巧的epoll,memcached完全依赖libevent(性能影响)
memcached使用CAS避免资源竞争修改,redis提供了事务功能
CAS是通过为每一个cacke key设置一个隐藏的cas token作为版本号,每次set操作都会检查并更新token
数据类型
string
string是key/value的存储结构(同memcached一样),支持的命令:
get/set/del incr/incrby decr/descby append/strlen getrange/setrange
问题:计数
一般情况都需要额外使用锁来避免并发写的问题。
解决方法:
使用
incr命令来实现原子递增,使用
get/set来重置计数状态。
与memcached相同,可作为key/value数据库,例如session共享。
hash
hash的value实际上是一个hashmap,可以直接操作value的各个feild的值,支持的命令:
hset/hget/hgetall hmset/hmget hlen/hexists hkeys/hvals
hash两种实现方式,
当数据较少时,为了节省内存采用线性存储来节省空间
当数据较多时,才会使用hashmap来降低时间复杂度
问题:商品维度计数
商品有各种计数(喜欢、评论、鉴定、浏览等)
解决方法:
使用
hash的
field字段来存储喜欢、评论等计数值。
同理,用户维度计数(动态、关注、粉丝、喜欢、发帖等)。
该存储结构适用于常用的商品、热门新闻动态等经常被大量访问的数据对象。
list
list通过双向链表实现,支持反向查找和遍历,支持的命令:
lpush/rpush lpop/rpop lrange/lrem
利用
push和
pop操作可以实现消息队列,也可以实现关注列表、粉丝/在线好友列表等功能。
问题:显示最新的项目列表
SELECT * FROM foo WHERE ... ORDER BY TIME DESC LIMIT 10;
数据库上的查询语句如上,随着数据的增多,排序会越来越慢。
解决方法:
为每一条数据选择一个唯一的ID(可选自增ID)
缓存最新的N个数据,利用
redis做数据缓存(
list结构不断LPUSH最新的数据)
当查询内容超过
redis缓存内容后,才会穿透缓存访问数据库
消息队列的实现:
用
list数据结构作为channel
生产者lpush消息
消费者rpop消息
设定超时时间
上述消息队列与PUB/SUB相比,不会丢失数据,但也没有失败重传的机制(也就是没有消息状态)
set
set是一个不允许重复的数据组合,支持的命令:
sadd/spop sismembers sinter/sunion/sdiff
smembers可以用来实现好友列表中判断是否为已存在好友或关注好友,也可以通过集合操作来实现共同好友、共同兴趣、共同关注列表等。
问题:判断微博的共同好友、共同兴趣、是否为关注好友
解决方法:
利用set集合存储用户的好友ID
通过
sismembers判断用户是否存在好友集合中
通过
sinter来判断两个好友集合的共同好友
通过
sunion来获取两个集合的所有好友
通过
sdiff来获取两个集合的非共同好友,用于好友推荐
sorted set
sorted set是有序的
set,通过提供一个优先级
score来实现自动排序,支持的命令:
zadd/zrem zrange/zcard
score可以用来实现权重队列,也可以实现按时间、评分的自动排序列表。
问题:在线游戏实时排行榜
在线游戏的排行榜都需要实时更新操作,不可能去频繁地更改关系型数据库,
解决方法:
为用户设置唯一的ID,采用
sorted set来存储用户的得分情况
利用有序集合来对用户得分进行排名,这里不可能存储全部的用户,可能只关心前100个用户,那么就需要在redis之外做限制
问题:新闻排序
新闻排序是按照新闻的关注度(点击率)和时间做排序,
score = points / (time^alpha)
上面的公式可以说明,点击率越高,越可能获得更多的评分;时间越久远,也会降低新闻的评分。
因此,需要有一个专门用于计算新闻评分的进程,实时地处理最新的N条数据
解决方法:
拉取最新的N条数据
计算各个数据的评分
添加到有序集合中
Pub/Sub
实现消息队列、实时消息系统。Transactions
redis提供事务的支持,
事务可以一次执行多个命令,多个命令按照顺序执行,不会被其他客户单的命令所打断
事务是原子操作,要么全部执行,要么不执行
使用方法:
> MULTI > ... > EXEC
错误处理:
在EXEC之前产生的错误,
redis会自动放弃这个事务
在EXEC之后产生的错误,并没有特殊处理
其他应用
实时统计,而全量操作数据记录到log日志,利用Hadoop进行更全面的离线分析web缓存,减轻数据库压力
cococo点点 http://www.cnblogs.com/coder2012
相关文章推荐
- redis 的各种介绍
- Redis 快速入门
- Redis简单实例
- Redis详解与常见问题解决方案
- redis主从和HA配置
- 干货--Redis池化联接和搭建分布式集群
- Redis - 安装
- 干货--Redis 30分钟快速入门
- Redis学习一
- Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)
- Redis主从复制
- Redis配置参数说明
- 使用python对redis操作
- Redis中的简单动态字符串
- Redis命令-有序集合-zlexcount
- Linux上安装使用Redis
- Redis的高级应用
- Linux下redis的安装
- Redis学习入门
- Redis解决Tomcat共享Session