今天听一个同事说新浪使用的是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包,然后即可使用。
1 import redis.clients.jedis.Jedis;
2 public class Test {
3
4 public static void main(String[] args) {
5 Jedis jj = new Jedis("192.168.8.50");
6 jj.set("name", "李小龙222");
7 String ss = jj.get("name");
8 System.out.println(ss);
9 }
10 }
注意点:不能将redis取代数据库的位置,目前redis做数据库还不太靠谱。它支持的数据类型太少,而且查询功能太弱。redis并不是为了作为数据库使用的,它更多地是一个高速存取器,一般用作缓存和类似场景。如果你想找一个关系型数据库如mysql的替代者,推荐使用mongodb,支持海量数据,查询功能强大,数据类型支持广泛。目前已有一些团队在后台完全使用mongodb作为数据库。
当然新浪微博就是使用mysql+redis来做数据存储的。
Redis优点:
使用redis的好处是:
1)拥有多种数据结构,可以丰富cache的数据结构和方式。
2)有持久化的机制,能够保证数据在宕机后也不会丢失数据。
使用redis需要考虑的地方:
1)在使用前要需要对容量要有详细的规划
2)没有官方提供的集群方案
3)数据查询的能力肯定没有关系型数据库强
总结:关键的一句话,了解这个产品的特性和不足,把合适的产品用在合适的场景中。
新浪计数业务之Redis