新浪计数业务之Redis
今天听一个同事说新浪使用的是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的更多相关文章
- 2019 新浪 java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.新浪等公司offer,岗位是Java后端开发,因为发展原因最终选择去了新浪,入职一年时间了,也成为了面试官,之 ...
- 豪情-CSS解构系列之-新浪页面解构-01
目录: 一. 新浪的布局特点 二. 内容细节的特点 三. 其中相关的一些基础技术点 1. 常见布局方法 2. 布局要点 3. Debugger误区 4.列表 5.字体颜色 6.CSS选择符 7.CSS ...
- 用极简方式实现新浪新版本特性展示效果--view的图片轮播
在发布版本的时候,大多数软件会在第一次使用新版本时候弹出视图用几张图片给用户做一个新版本特性介绍,最简单如下图新浪的版本特性介绍 由于图片是全屏展示且是左右滑动,大多数情况开发者会选择使用scroll ...
- IOS开发之新浪围脖
IOS开发和Web开发一样,网络请求方式包括Get和Post方式.Get和Post两者有和特点和区别,在本篇博客中不做过多的论述,本篇的重点在于如何GET数据和POST数据.下面还会提到如何在我们的项 ...
- 使用新浪云 Java 环境搭建一个简单的微信处理后台
前一段时间,写了一篇在新浪云上搭建自己的网站的教程,通过简单构建了一个 maven 的项目,展示部署的整个流程,具体的操作可以参看这里. 新浪云服务器除了可以搭建自己的网站以外,也非常的适合作为微信公 ...
- 手把手教你用新浪云容器 Java 搭建自己的网站
经过一段时间的开发,更新,迭代,新浪云容器 Java 环境逐渐成熟起来,相比过去的 Java 运行环境,可用性和易用性都得到了大量的提升.同时也收到了不少用户反馈的使用问题,特此在这篇文章里综合介绍一 ...
- 用python2.7,采集新浪博客
#coding=utf-8 #新浪博客 import urllib import re import os url=['']*1500 #每一骗博客的地址 title=['']*1500 #每一篇博客 ...
- 门户级UGC系统的技术进化路线——新浪新闻评论系统的架构演进和经验总结(转)
add by zhj:先收藏了 摘要:评论系统是所有门户网站的核心标准服务组件之一.本文作者曾负责新浪网评论系统多年,这套系统不仅服务于门户新闻业务,还包括调查.投票等产品,经历了从单机到多机再到集群 ...
- jquery实现隐藏显示层动画效果、仿新浪字符动态输入、tab效果
已经有两年多没登陆csdn账号了,中间做了些旁的事,可是现在却还是回归程序,但改做前端了,虽然很多东西都已忘得差不多了,但还是应该摆正心态,慢慢来,在前端漫游,做一只快乐双鱼. 路是一步一步走出来的, ...
随机推荐
- Linux中安装NodeJs 、cnpm 、npm
一.安装NodeJs 切换到 cd /usr/local/src/ 下载nodejs wget https://nodejs.org/dist/v6.9.3/node-v6.9.3-linux-x64 ...
- 老生长谈的$.extend()方法
jq的extend()是jq插件扩展很重要的部分,到这里证明是可以自己在jq的基础上,分为两种方法去扩展或开发,为jq本身添加一个方法,可以理解成扩展静态方法和自定义方法. 今天有看到一篇帖子,对这部 ...
- 【刷题笔记】--lintcode木头加工(java)
木头加工 题目描述 有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k.当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度. 注意事项 木头 ...
- WP8如何添加Newtonsoft.Json包
WP8开发的时候如何使用Newtonsoft.Json包呢?我在网上包括官网下的DLL文件,添加引用时都给出了这样的提示: 而后在网上找到的解决办法是:使用NuGet程序包来添加. 首先点击工具--& ...
- 文本选择问题: css & js
CSS: /*Disable browser selection*/ .disableselect { -webkit-user-select: none; -moz-user-select: non ...
- 【JBOSS】控制台数据库连接信息
数据库连接 信息 进入 在这个页面中(IP和端口已自己的为主):ConnectionCount 这个项目代表在服务开启后,总共使用的连接数!ConnectionCreatedCount ...
- 干货!IT小伙伴们实用的网站及工具大集合!持续更新!
1.Git 还在担心自己辛辛苦苦写的代码被误删了吗?还在担心自己改错了代码不能挽回吗?还在苦恼于多人开发合作找不到一个好的工具吗?那么用Git就对 了,Git是一个开源的分布式版本控制系统,用以有效. ...
- 【总结】C# 设置委托的机理和简要步骤
[引语]实际上,和Winform打交道的第一天呢,我们就已经接触了委托,例如当双击button产生button1_click,这个呢,是对button1点击事件的处理方法,至于委托和订阅事件,就悄悄的 ...
- elasticsearch常用的概念整理
节点node 节点(node)是一个运行着的Elasticsearch实例 集群中一个节点会被选举为主节点(master),它将临时管理集群级别的一些变更,例如新建或删除索引.增加或移除节点等.主节点 ...
- 【hihoCoder】1148:2月29日
问题:http://hihocoder.com/problemset/problem/1148 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 思路: 1. 将问题转换成求两个日 ...