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来降低时间复杂度

问题:商品维度计数
商品有各种计数(喜欢、评论、鉴定、浏览等)
解决方法:
使用hashfield字段来存储喜欢、评论等计数值。

同理,用户维度计数(动态、关注、粉丝、喜欢、发帖等)。

该存储结构适用于常用的商品、热门新闻动态等经常被大量访问的数据对象。

list

list通过双向链表实现,支持反向查找和遍历,支持的命令:

lpush/rpush
lpop/rpop
lrange/lrem

利用pushpop操作可以实现消息队列,也可以实现关注列表、粉丝/在线好友列表等功能。

问题:显示最新的项目列表

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点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

时间: 2024-10-22 02:20:37

redis总结的相关文章

Redis 数据备份与恢复

Redis SAVE 命令用于创建当前数据库的备份. 语法 redis Save 命令基本语法如下: redis 127.0.0.1:6379> SAVE 实例 redis 127.0.0.1:6379> SAVE OK 该命令将在 redis 安装目录中创建dump.rdb文件. 恢复数据 如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可.获取 redis 目录可以使用 CONFIG 命令,如下所示: redis 127.0.0.1:6379

Redis之七种武器

长生剑.孔雀翎.碧玉刀.多情环.离别钩.霸王枪.拳头是古龙笔下的七种武器,而本文打算将Redis的几种使用方式 Strings.Hashs.Lists.Sets.Sorted Sets.Pub/Sub.Transactions 也比作七种武器,为大家讲解Redis的七种特性,并列举其适合的应用场景. Strings Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字.使用Strings类型,你可以完全实现目前 Memcached 的功能,并且效

java实现redis数据库访问

分析亚马逊AWS数据存储-----http://edu.csdn.net/course/detail/873 一.server端安装 1.下载 https://github.com/MSOpenTech/redis 可看到当前可下载版本:redis2.6 下载windows平台文件: 解压后,选择当前64位win7系统对应的版本: 2.安装 1)解压后将里面所有文件拷贝至redis安装目录: 几个exe程序的功能:   redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发

Redis内存数据库操作命令详解

一.连接操作相关的命令    quit关闭连接connection    auth简单密码认证 二.对value操作的命令    exists(key)确认一个key是否存在    del(key)删除一个key    type(key)返回值的类型    keys(pattern)返回满足给定pattern的所有key    randomkey随机返回key空间的一个key    rename(oldname, newname)将key由oldname重命名为newname若newname存在

Windows Server 2016 配置指南 之 安装 PHP redis 拓展

前文 安装 Redis3.0 介绍了服务器安装 Redis3.0,但是就像我们安装了 Mysql 依旧需要然后对应的 php 驱动拓展一样,redis 也是.这里就讲一下如何安装 Redis 的 php 拓展. 尽管 PHP7 正式版出来已经有个把月数了,但是提供 Windows 系统使用的 phpredis 已经没有更新.见地址:http://windows.php.net/downloads/pecl/releases/redis/ ,依旧是旧的. 不过么,phpredis 的 php7 分

java如何队列同步redis?

问题描述 java如何队列同步redis? 就是数据批量插入redis,然后再同步插入到数据库里面,怎么搞 解决方案 java redis使用之利用jedis实现redis消息队列0135 java redis使用之利用jedis实现redis消息队列java redis使用之利用jedis实现redis消息队列 解决方案二: 一般是数据先插入数据库,然后再利用触发器等把数据插入redis.或者用过期方式来从数据库同步数据到redis

redis 异常,Could not return the resource to the pool

问题描述 redis 异常,Could not return the resource to the pool 解决方案 Redis没启动还有防火墙连接不上吧. 解决方案二: http://blog.csdn.net/freebird_lb/article/details/7460328 解决方案三: https://github.com/xetorthio/jedis/issues/560 解决方案四: http://blog.csdn.net/testcs_dn/article/detail

Redis 代理服务Twemproxy

1.twemproxy explore &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;     当11545.html">我们有大量 Redis 或 Memcached 的时候,通常只能通过客户端的一些数据分配算法(比如一致性哈希),来实现集群存储的特性.虽然Redis 2.6版本已经发布Redis Cluster,但还不是很成熟适用正式生产环境. Redis 的 Cluster 方案还没有正式推

redis的那些事

持久化  redis支持RDB和AOF两种持久化方式   The RDB persistence performs point-in-time snapshots of your dataset at specified intervals. RDB是一种即时快照的存储方式,定时对数据库进行snapshot RDB优点: 1 RDB对于数据备份非常容易.你可以设置1天或者30天对数据进行一次备份,这样当发生数据灾难的时候能很容易恢复 2 由于RDB对数据备份时redis只做备份操作,所以备份最大

Redis缓存数据库安装

简单介绍: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hashs(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中. 区别的是redis会周