今天听一个同事说新浪使用的是Redis,于是自己将研究的过程整理出来以备后用。

我们都知道微博这玩意儿现在很火,新浪作为国内最早使用redis,并且是国内最大的redis使用者,当然备受人们关注。新浪微博中一项很重要数据,计数类业务就用到了Redis。OK,废话不多说,直接切入主题。

 Redis是什么?

解析:一种内存型数据库,虽然其拥有了持久化机制。

Redis配置过程

首先声明,今天我们探讨的配置是在windows系统下

步骤一:下载redis文件包

下载的windows版本是redis-2.0.2,解压到D盘下,在redis-2.0.2中有以下文件

文件解析:

01.Cygwin1.dll:动态链接库文件

  02.Redis.conf  :redis配置文件

  03.Redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送多个SETs/GETs查询(类似于Apache的ab工具)

  04.Redis-check-aof.exe:更新日志检查(个人感觉这个非常有用,因为其会实时监测日志文件是否更新)

  05.Redis-check-dump.exe:本地数据库检查

  06.Redis-cli:redis命令行操作工具

  07.Redis-server.exe:Redis服务器的daemon启动程序

步骤二:启动Redis服务(conf文件是配置文件,若不指定,则redis-server.exe按默认方式启动)

所以,启动命令有两种写法

写法一:D:\redis-2.0.2>redis-server.exe

在这种场景下,服务启动的参数设置都会走默认值

写法二:D:\redis-2.0.2>redis-server.exe redis.conf(推荐方式)

既然启动的时候要读取配置文件的信息,那么我们在启动服务前先做一件事情,修正配置

文件中一个变量的开关,用高级记事本打开conf文件,然后Ctrl+F,输入appendonly,如下图,找到appendonly no ,将其值设置成yes

接下来就可以启动服务了,启动方式如下图

上图反映的是就是redis的服务开启效果,类似于SQL Server中在的MSSQL服务的开启,当然服务开启后,该窗口不能关闭,否则就代表你要关闭服务。当然可以通过参数的设置让服务在后台运行,但不属于我们今天讨论的范围。

步骤三:通过cmd窗口模拟一个客户端,底层当然还是通过Socket实现。

这时服务开启着,另外开一个窗口进行,设置客户端:

D:\redis-2.0.2>redis-cli.exe -h 192.168.8.50 -p 6379

OK,到此配置成功!

有人可能会问,那么如何将应用程序中的数据写入到redis中呢?

   解析:这是一个好问题,这里我们用Jedis为例来给大家做下演示。演示之前,希望大家能明白一件事情,redis是内存数据库,内存写满后,不会存储到硬盘上(VM不稳定,diskstore未启用),

针对这个不足,redis提供了两种持久化利器:一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式。

快照缺点:因为两次快照操作之间是有时间间隔的,一旦数据库出现问题,那么快照文件中保存的数据并不是全新的,从上次快照文件生成到Redis停机这段时间的数据全部丢掉了。如果业务对数据准确性要求极高的话,就得采用aof持久化机制了。

Aof:aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的时机。有三种方式如下(默认是:每秒fsync一次):

01. appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用

02.appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐

03、appendfsync no //完全依赖os,性能最好,持久化没保证

所以在配置文件中,我们采用的是everysec方式,也就是每隔1s钟,将内存中的数据flush到硬盘上,那么很多人又会问,写到硬盘的位置呢?文件名是什么呢?这统统都要依赖于配置文件的配置,上文已经说过默认会写入到redis目录的appendonly.aof文件中。

接下来就可以去下载Jedis,在Java项目中导入Jedis包,然后即可使用。

 import redis.clients.jedis.Jedis;
public class Test { public static void main(String[] args) {
Jedis jj = new Jedis("192.168.8.50");
jj.set("name", "李小龙222");
String ss = jj.get("name");
System.out.println(ss);
}
}

  注意点:不能将redis取代数据库的位置,目前redis做数据库还不太靠谱。它支持的数据类型太少,而且查询功能太弱。redis并不是为了作为数据库使用的,它更多地是一个高速存取器,一般用作缓存和类似场景。如果你想找一个关系型数据库如mysql的替代者,推荐使用mongodb,支持海量数据,查询功能强大,数据类型支持广泛。目前已有一些团队在后台完全使用mongodb作为数据库。

当然新浪微博就是使用mysql+redis来做数据存储的。

Redis优点:

使用redis的好处是:
1)拥有多种数据结构,可以丰富cache的数据结构和方式。
2)有持久化的机制,能够保证数据在宕机后也不会丢失数据。

使用redis需要考虑的地方:
1)在使用前要需要对容量要有详细的规划
2)没有官方提供的集群方案
3)数据查询的能力肯定没有关系型数据库强

总结:关键的一句话,了解这个产品的特性和不足,把合适的产品用在合适的场景中。

新浪计数业务之Redis的更多相关文章

  1. 2019 新浪 java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.新浪等公司offer,岗位是Java后端开发,因为发展原因最终选择去了新浪,入职一年时间了,也成为了面试官,之 ...

  2. 豪情-CSS解构系列之-新浪页面解构-01

    目录: 一. 新浪的布局特点 二. 内容细节的特点 三. 其中相关的一些基础技术点 1. 常见布局方法 2. 布局要点 3. Debugger误区 4.列表 5.字体颜色 6.CSS选择符 7.CSS ...

  3. 用极简方式实现新浪新版本特性展示效果--view的图片轮播

    在发布版本的时候,大多数软件会在第一次使用新版本时候弹出视图用几张图片给用户做一个新版本特性介绍,最简单如下图新浪的版本特性介绍 由于图片是全屏展示且是左右滑动,大多数情况开发者会选择使用scroll ...

  4. IOS开发之新浪围脖

    IOS开发和Web开发一样,网络请求方式包括Get和Post方式.Get和Post两者有和特点和区别,在本篇博客中不做过多的论述,本篇的重点在于如何GET数据和POST数据.下面还会提到如何在我们的项 ...

  5. 使用新浪云 Java 环境搭建一个简单的微信处理后台

    前一段时间,写了一篇在新浪云上搭建自己的网站的教程,通过简单构建了一个 maven 的项目,展示部署的整个流程,具体的操作可以参看这里. 新浪云服务器除了可以搭建自己的网站以外,也非常的适合作为微信公 ...

  6. 手把手教你用新浪云容器 Java 搭建自己的网站

    经过一段时间的开发,更新,迭代,新浪云容器 Java 环境逐渐成熟起来,相比过去的 Java 运行环境,可用性和易用性都得到了大量的提升.同时也收到了不少用户反馈的使用问题,特此在这篇文章里综合介绍一 ...

  7. 用python2.7,采集新浪博客

    #coding=utf-8 #新浪博客 import urllib import re import os url=['']*1500 #每一骗博客的地址 title=['']*1500 #每一篇博客 ...

  8. 门户级UGC系统的技术进化路线——新浪新闻评论系统的架构演进和经验总结(转)

    add by zhj:先收藏了 摘要:评论系统是所有门户网站的核心标准服务组件之一.本文作者曾负责新浪网评论系统多年,这套系统不仅服务于门户新闻业务,还包括调查.投票等产品,经历了从单机到多机再到集群 ...

  9. jquery实现隐藏显示层动画效果、仿新浪字符动态输入、tab效果

    已经有两年多没登陆csdn账号了,中间做了些旁的事,可是现在却还是回归程序,但改做前端了,虽然很多东西都已忘得差不多了,但还是应该摆正心态,慢慢来,在前端漫游,做一只快乐双鱼. 路是一步一步走出来的, ...

随机推荐

  1. Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能-转自阿里中间件

    引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. ...

  2. 一个快速排序(分类)及使用类似思想实现选择问题[c++实现]

    一.快速排序(快速分类)算法: 问题描述:给定线性集中n个元素和一个整数k,1<=k<=n,要求找出这n个元素中第k小的元素. 思想:选取数组A中的某个元素 t=A[s],然后将其他元素重 ...

  3. 二分 题目 压缩打包 Special Judge? 不不不 当然不是

    http://noi.openjudge.cn/ch0111/ No 题目 分数 01 查找最接近的元素 10 3176 02 二分法求函数的零点 10 2181 03 矩形分割 10 1420 04 ...

  4. Shader实例:NGUI图集中的UISprite正确使用Shader的方法

    效果: 变灰,过滤,流光 都是UI上常用效果. 比如: 1.按钮禁用时,变灰. 2.一张Icon要应付圆形背景框,又要应付矩形背景框.就要使用过滤的方式来裁剪. 避免了美术提供两张icon的麻烦,又节 ...

  5. javascript 全局对象--w3school

    JavaScript全局对象 1.  decodeURI()解析某个编码的URI. 2.decodeURInComponent()解析一个编码的URI组件. 3.encodeURI()把字符串编码为U ...

  6. 整理ViewController的生命周期和加载过程

    按照执行顺序排列 - initWithCoder:通过nib文件初始化时触发 - awakeFromNib:nib文件被加载的时候,会发送一个awakeFromNib的消息到nib文件中的每个对象 p ...

  7. redis的面试题,没答出来,直接被pass

    redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略.redis 提供 6种数据淘汰策略:  volatile-lru:从已设置过期时间的数据集(server.db[i].expire ...

  8. JS中数组的操作[转]

    1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...

  9. css中关于居中的问题

    居中是最常用的一种css格式,不同的居中方法适和不同的环境中,下面总结了几种常用的居中方法,你可以不用它,但是无论你是一个资深前端大牛,还是小小初学者,当你见到它的时候不认识它就是你的不对啦!!! h ...

  10. 如果你想真正了解Struts2,不妨可以进来看看

    首先我们就一起来认识认识Struts2到底是什么?作为框架,它又是用来处理哪些问题的呢?正所谓脚踏实地走,即时离梦想会远一点,但却很真实,那我们就一步一步的来了解Struts2吧!      一.既然 ...