设为首页 收藏本站
查看: 1238|回复: 0

[经验分享] 新浪计数业务之Redis

[复制链接]

尚未签到

发表于 2015-7-19 14:15:52 | 显示全部楼层 |阅读模式
今天听一个同事说新浪使用的是Redis,于是自己将研究的过程整理出来以备后用。
我们都知道微博这玩意儿现在很火,新浪作为国内最早使用redis,并且是国内最大的redis使用者,当然备受人们关注。新浪微博中一项很重要数据,计数类业务就用到了Redis。OK,废话不多说,直接切入主题。


   Redis是什么?


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


   Redis配置过程


      首先声明,今天我们探讨的配置是在windows系统下
     步骤一:下载redis文件包
     下载的windows版本是redis-2.0.2,解压到D盘下,在redis-2.0.2中有以下文件
    DSC0000.png
  文件解析:
      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
DSC0001.png
接下来就可以启动服务了,启动方式如下图
DSC0002.png
    上图反映的是就是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)数据查询的能力肯定没有关系型数据库强


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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-88337-1-1.html 上篇帖子: redis源码分析(1)内存管理 下篇帖子: PHP 操作redis 详细讲解转的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表