今天听一个同事说新浪使用的是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. react native 多选按钮

    在做项目的时候有一个需求,是可以选择多个条件的,特地在Github上找了一些案例,发现没有什么合适的,于是自己根据这些案例,改装一下,封装了一个合适自己的.先看我封装的代码. import React ...

  2. iOS之 清理缓存

    作为一个开发者,对于缓存的清理也是理所应当的需要的.这次就简单的谈一下iOS中对于缓存的清理方法. 我们清理缓存通常是在这三种方式下进行的: (1)项目中的清理缓存按钮 (2)点击退出app按钮时清理 ...

  3. install hdp 2.2 on ubuntu 14.04

    http://www.swiss-scalability.com/2014/12/install-hdp-22-on-ubuntu-1404-trusty.html 在新加节点上运行 sed -e & ...

  4. Unity性能优化之 Draw Call原理<转>

    Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述:引擎首先经过简单的可见性测试,确定摄像机可以看到的物体,然后把这些物体的顶点(包括本地位置.法线.UV等),索引(顶点如 ...

  5. 修改radio与check样式

    一般的radio与check的样式很难看,这个时候就需要我们自己修改其样式 逻辑思维: 1.用label包裹input标签以及样式标签,然后将radio定位到界面以外,设置样式标签的样式 2.使用伪类 ...

  6. zabbix身份验证流程解析&绕过身份验证的方法

    由于实验室产品的监控模块的需求,需要绕过zabbix的验证模块,实现从二级平台到zabbix的无缝接入. 测试发现,zabbix的身份验证并不是想象的那么简单,为了实现功能,遂进行源码分析. zabb ...

  7. @WebServlet用注解来实现servlet和url的映射

    package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Se ...

  8. 栈的JS实现

    栈,是一种特殊的线性表,其插入及删除的操作都在线性表的同一端进行.这一端称为栈顶,另一端称为栈底.就类似于餐厅里的一摞盘子,后放的盘子在上方,也会先被人拿走.栈具有"后进先出"的逻 ...

  9. c# Repeater中CommandArgument传多个参数

    <ItemTemplate>                    <div onmouseover="javascript:this.style.cursor='hand ...

  10. Python3.5 day4作业:对员工信息文件,实现增删改查操作。

    需求: 1.可进行模糊查询,语法至少支持下面3种: 1.select name,age from staff_table where age > 22 2.select  * from staf ...