Redis的介绍


数据库主要类型有对象数据库,关系数据库,键值数据库等等,对象数据库太超前了,现阶段不提也罢;关系数据库就是平常说的MySQL,PostgreSQL这些熟的不能再熟的东西,至于键值数据库则是本文要着重说的,其代表主要有MemcacheDB,Tokyo Cabinet等等。

Redis本质上也是一种键值数据库的,但它在保持键值数据库简单快捷特点的同时,又吸收了部分关系数据库的优点。从而使它的位置处于关系数据库和键值数据库之间。Redis不仅能保存Strings类型的数据,还能保存Lists类型(有序)和Sets类型(无序)的数据,而且还能完成排序(SORT)等高级功能,在实现INCR,SETNX等功能的时候,保证了其操作的原子性,除此以外,还支持主从复制等功能。

详细描述参见官方手册,同时,官方提供了一个名为Retwis的项目的源代码,可以对照着官方介绍学习,注意其中关于Data Layout的描述,其他没什么。

项目实践中,多以关系数据库为主,不过合理的使用Redis这样的键值数据库,往往能扬长避短,比如说实现一个类似消息队列的功能,对MySQL来说,除非使用Q4M,否则很难满足高并发请求,不过对Redis来说,通过内建的Lists支持,消息队列就是小菜一碟。

Redis的安装

tar zxvf redis-version.tar.gz
cd redis-version
make

由于没有make install,所以得把源代码目录里的关键文件手动复制到适当的位置:

cp redis.conf /etc/
cp redis-benchmark redis-cli redis-server /usr/bin/

如果内存情况比较紧张的话,需要设定内核参数:

echo 1 > /proc/sys/vm/overcommit_memory

然后编辑redis.conf配置文件(/etc/redis.conf),按需求做出适当调整,比如:

daemonize yes
logfile /dev/null

如果要记录日志的话,最好先调整loglevel到一个合适的级别,然后设定logfile,如果不需要,则可以像上面这样直接把日子丢弃到/dev/null里,还有一点,缺省情况下,数据文件dump.rdb会被生成到当前目录,可以通过dir参数设定合适的目录。

此外,如果你决定把Redis用于产品环境,还要注意maxmemory选项,因为Redis在启动时会把所有数据加载到内存中,所以设定maxmemory相对安全。

接下来直接启动服务就可以了,只有配置文件一个参数:

redis-server /etc/redis.conf

确认运行了之后,可以用redis-benchmark命令测试看看,还可以通过redis-cli命令实际操作一下,比如:

redis-cli set foo bar
OK
redis-cli get foo
bar

在设置键对应的值的时候,按照协议的规定是要提供数据大小这个参数的,上面的redis-cli命令之所以没有提供这个参数是因为redis-cli本身进行了封装。

可以通过telnet来验证一点:

telnet 127.0.0.1 6379
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set foo 3
bar
+OK
get foo
$3
bar
^]
telnet> quit
Connection closed.

更多命令介绍参考文档介绍。

Redis源代码里附带了多种客户端的扩展,比如说php(client-libraries/php),这是一个纯PHP的实现方案,也有二进制版本的实现(phpredis)。其他语言即便没有现成的扩展实现,也可以自己按照协议规范写一个扩展,应该不是什么难事。

Redis内存要求很高,如果你的数据量很大的话,可能会导致系统使用swap,这会使性能急剧下降。此时更好的方法是通过consistent hashing把数据分布到多个服务器上,文档上给出了简单的例子解释:

For example imagine to have N Redis servers, server-0, server-1, ..., server-N. You want to store the key "foo", what's the right server where to put "foo" in order to distribute keys evenly among different servers? Just perform the crc = CRC32("foo"), then servernum = crc % N (the rest of the division for N). This will give a number between 0 and N-1 for every key. Connect to this server and store the key.

在线演示:
http://try.redis-db.com/

参考链接:

http://redis.io/

http://github.com/jdp/redisent/tree/master
http://github.com/owlient/phpredis
http://rediska.geometria-lab.net/

配置主从服务器

Redis主从服务器的搭建很简单,只要少许配置即可,为了演示的方便,我们就在一台服务器上配置:

前提是你已经有了一台Redis服务器,如果没有可以参考我以前的文章安装。下面看看如何配置从服务器:

假设主服务器的配置文件是:/etc/redis.conf,我们复制一份作为从服务器的配置文件:

cp /etc/redis.conf /etc/redis_slave.conf

并作修改:

# vi /etc/redis_slave.conf
port 6380
dbfilename dump_slave.rdb
slaveof 127.0.0.1 6379

主服务器的端口使用的是缺省的6379,从服务器的端口我们设置成6380。

然后插入一些测试数据:

redis-benchmark

由于我们没有设定任何参数,所以使用的是缺省端口(6379),在本例中就是主服务器。

然后启动从服务器:

redis-server /etc/redis_slave.conf

确认一下是否都正常启动了:

ps -ef | grep redis

进入数据目录,查一下数据文件的散列:

md5sum *.rdb

你会发现数据文件散列都一样,自动同步了。

然后我们关闭一下从服务器(不关也行,我就是为了告诉你如何正确关闭redis服务器):

redis-cli -p 6380 shutdown

接着再往主服务器上写入测试数据:

redis-benchmark -l

这会循环插入测试数据,数据量的大小取决于时间的长短,你可以在适当的时候按ctrl+c停止。

如果从服务器没有启动的话,接着再重新启动从服务器:

redis-server /etc/redis_slave.conf

通过观察文件大小你会发现数据会自动同步,如果没有重启动从服务器,那么数据文件的md5sum散列值可能不同,这是正常的,不要紧。

在操作过程中,有时候你会发现主从服务器的数据文件大小不一样,一般来说也不是问题,因为redis是异步写入磁盘的,此时可能有部分数据还在内存中,没有同步到磁盘,所以文件大小略显不同,可以分别在主从服务器上执行:

redis-cli save(redis-cli -p 6380 save)

这条命令强制同步到磁盘,再看大小就应该一样了。

配置文件redis.conf里有一部分和save相关的参数,缺省如下:

# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   In the example below the behaviour will be to save:
#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed
save 900 1
save 300 10
save 60 10000

在主服务器上,我们可以去掉上面的设置,改成类似下面的设置(只要参数值够大即可):

save 10000000000 10000000000

如此一来主服务器变成一个完全的内存服务器,所有的操作都在内存里完成,“永远”不会再往磁盘上持久化保存数据,异步的也没有。持久化则通过从服务器来完成,这样在操作主服务器的时候效率会更高。不过要注意的一点是此方法不适合保存关键数据,否则一旦主服务器挂掉,如果你头脑一热简单的重启服务,那么从服务器的数据也会跟着消失,此时,必须拷贝一份备份数据到主服务器,然后再重启服务才可以,数据的恢复稍显麻烦。

从服务器也可以通过设置这个参数来调整从内存同步到磁盘的频率。

利用主从服务器备份

可以利用主从服务器的方便性来备份,专门做一台从服务器用于备份功能,当需要备份的时候,在从服务器上执行下列命令:

redis-cli save
redis-cli shutdown

然后拷贝数据目录下的rdb文件即可。

另:官方文档介绍不使用主从,直接在服务器上cp就可以,不过感觉利用从服务器备份对线上服务器影响更小些。

总结

如果你以前做过MySQL主从服务器的话,两相对比,你会发现Redis主从服务器不用做前期的数据同步,设置好了从服务器,简单启动就OK了。至于Redis主从怎么用,是备份也好,读写分离也好,就看你的想象力了。

资料

官方文档

Redis主从服务器安装配置相关推荐

  1. linux下部署redis主从,Linux下安装Redis及Redis主从同步配置

    一 ,Linux安装Redis 1.我们先配置redis的 yum 源 , 很多软件的找不到 yum 源 我们可以使用 EPEL 找到很多软件的yum源 2.使用命令 yum install epel ...

  2. redis主从的配置和使用

    1, redis配置文件常用选项说明 daemonize no  说明:是否把redis-server启动在后台,默认是"否".若改成yes,会生成一个pid文件. pidfile ...

  3. ubuntu 部署 redis 主从节点配置

    为什么80%的码农都做不了架构师?>>>    准备两台虚拟机,示例系统是ubuntu14.14 192.168.26.133 6379 主 写 192.168.26.134 637 ...

  4. redis主从配置之持久化配置

    环境描述: centos:7.6docker:19.03.1redis:6.0.9 对于centos怎么装docker,docker又怎么装redis镜像等等内容就不做概述了.如果还不会这个,就先去百 ...

  5. redis主从同步概念及配置

    目录 前言 一.主从同步的概念 二.为什么需要主从同步 三.redis主从同步过程 四.windows环境下redis主从同步配置 1.配置主从 2.配置永久生效 前言 今天记录一下学习redis主从 ...

  6. php 连接主从redis,PHP7对Redis的扩展及Redis主从搭建

    在学习一下php7下面的安装及redis相关配置认识,并将笔记记下来,以备后用.主要涉及到redis的扩展php-redis 及redis主从的配置. 一:redis安装 1:下载并安装 cd /ho ...

  7. Redis 主从配置和参数详解

    安装redis 下载redis wget http://download.redis.io/releases/redis-3.0.7.tar.gz解压redis tar -xvf redis-3.0. ...

  8. Redis主从配置及通过Keepalived实现Redis自动切换高可用

    Redis主从配置及通过Keepalived实现Redis自动切换高可用 [日期:2014-07-23] 来源:Linux社区  作者:fuquanjun [字体:大 中 小] 一:环境介绍: Mas ...

  9. redis 主从配置_应用 | Redis实现 主从,单例,集群,哨兵,配置应用

    小小经过一天的休整 公众号更新规则:每周六将会停更一次,进行短期的休整,其余时间继续每天一更. 思维导图如下 Redis 主从配置 这里配置Redis主从 什么是主从 主从复制,是指把一台Redis服 ...

  10. php redis 主从配置,Redis主从及其PHP扩展安装配置

    1.Redis简介Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序 ...

最新文章

  1. Linux下GCC与G++的区别和联系
  2. 1、MySQL性能优化简述
  3. 阻止浏览器关闭 区分刷新和关闭 自试IE可用
  4. LeetCode Algorithm 704. 二分查找
  5. EventBus/EventQueue 再思考
  6. 字符串、指针、引用、数组基础
  7. Leaflet文档阅读笔记-Leaflet on Mobile笔记
  8. MapReduce Design Patterns(6 、Job 链)(十二)
  9. crossplaform---Nodejs in Visual Studio Code 04.Swig模版
  10. DC-DC转换器分类-和讯康讲堂
  11. 创建Win95 100M无盘工作站
  12. 微信小程序:搜索关键词,显示地图列表
  13. 数据分析基础-假设检验原理详解
  14. 多线程 VS 多进程(一)
  15. 华为公司 代码编码规范
  16. CTF万里追踪——图片里的秘密
  17. 视频中地点位置标题文字标记介绍动画AE字幕模板
  18. web学习-html(2)
  19. Jackson JsonParser 和 JsonGenerator
  20. css中内编,CSS

热门文章

  1. 如何快速删除某几页的页眉页脚
  2. 断网重启路由器就好_电脑老断网重启就好怎么解决
  3. Star CCM+ 2206安装
  4. hadoop3新特性
  5. java kdj macd_很好用的KDJ与MACD结合指标
  6. KeyStore(示例,出错代码)
  7. mysql判断是否为分区表_MySQL 分区表
  8. 远程唤醒、WOL、Magic_Packet【转】
  9. 按职能和级别来分,UI设计师能胜任哪些高薪岗位?
  10. python纵向输出字符串,python-字符串方法,格式化输出