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缓存,减轻数据库压力

redis总结的更多相关文章

  1. 使用redis构建可靠分布式锁

    关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...

  2. Ignite性能测试以及对redis的对比

    测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...

  3. mac osx 安装redis扩展

    1 php -v查看php版本 2 brew search php|grep redis 搜索对应的redis   ps:如果没有brew 就根据http://brew.sh安装 3 brew ins ...

  4. Redis/HBase/Tair比较

    KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式    支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...

  5. Redis数据库

    Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...

  6. redis 学习笔记(2)

    redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...

  7. redis 学习笔记(1)

    redis持久化 snapshot数据快照(rdb) 这是一种定时将redis内存中的数据写入磁盘文件的一种方案,这样保留这一时刻redis中的数据镜像,用于意外回滚.redis的snapshot的格 ...

  8. python+uwsgi导致redis无法长链接引起性能下降问题记录

    今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...

  9. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  10. windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...

随机推荐

  1. Dw CS 破解

    据说,CS5的破解也可以用CS6的破解方法,不过可能本人太菜,有所失误,总是不成功,安装成功后,打开总是提示 : 我们无法开始您的Adobe Dreamweaver cs5 subscription ...

  2. KickStart 无人值守安装系统

    一.简介 1.1 什么是PXE PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持 ...

  3. 【MongoDB初识】-条件操作符

    1.条件>,<,>=,<=在MongoDB中的写法 >:$gt,<:$lt,>=:$gte,<=:$lte,<>:$ne 具体使用方法: d ...

  4. 半吊子学习Swift--天气预报程序-获取天气信息

    昨天申请的彩云天气Api开发者今天上午已审核通过  饭后运动过后就马不停蹄的来测试接口,接口是采用经纬度的方式来获取天气信息,接口地址如下 https://api.caiyunapp.com/v2/ ...

  5. Lession1 写在机器学习之前

    机器学习从学习方式上来讲,可以分为两类: 监督学习(Supervised Learning),简而言之就是“有标签”学习 无监督学习(Unsupervised Learning),简而言之就是“无标签 ...

  6. 二分图&网络流&最小割等问题的总结

    二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...

  7. placeholder js简单实现

    window.onload = function() { var input = document.getElementById("input"); input.onblur = ...

  8. android studio安卓项目出现Error: Default Activity Not Found错误无法编译的解决方案

    项目明明是没有问题的,有时候突然就出现Error: Default Activity Not Found错误,以前出现过我重新安装了android studio 都没有用,后来在网上(http://s ...

  9. C++ activemq CMS 学习笔记.

    很早前就仓促的接触过activemq,但当时太赶时间.后面发现activemq 需要了解的东西实在是太多了. 关于activemq 一直想起一遍文章.但也一直缺少自己的见解.或许是网上这些文章太多了. ...

  10. NFSv4的引用,迁移和备份(用户手册 v0.2)

    RFC3530 定义了NFS文件系统迁移和引用的管理机制.文件系统定位功能通过fs_location属性向客户端提供文件系统的位置信息.fs_location属 性是一个包含有位置信息的列表,位置信息 ...