Redis安装部署

点滴 admin 4年前 (2015-07-10) 114次浏览 已收录 9个评论 扫描二维码

Redis是一种高级key-value数据库。它跟memcached类似,不过数据
可以持久化,而且支持的数据类型很丰富。有字符串,链表,集
合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务
器。

Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。

1. 下载地址:

$ wget http://redis.googlecode.com/files/redis-2.6.13.tar.gz

或者https://github.com/dmajkic/redis/downloads

2. 解压缩

$ tar xzf redis-2.6.13.tar.gz

3. 编译

$ cd redis-2.6.13

$ make

$make install

$cp redis.conf /etc/

参数介绍:

make
install命令执行完成后,会在/usr/local/bin目录下生成本个可执行文件,分别是redis-server、redis-cli、
redis-benchmark、redis-check-aof 、redis-check-dump,它们的作用如下:

redis-server:Redis服务器的daemon启动程序

redis-cli:Redis命令行操作工具。也可以用telnet根据其纯文本协议来操作

redis-benchmark:Redis性能测试工具,测试Redis在当前系统下的读写性能

redis-check-aof:数据修复

redis-check-dump:检查导出工具

4. 修改系统配置文件,执行命令

a) echo vm.overcommit_memory=1 >> /etc/sysctl.conf

b) sysctl vm.overcommit_memory=1 或执行echo vm.overcommit_memory=1 >>/proc/sys/vm/overcommit_memory

使用数字含义:

0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

2,表示内核允许分配超过所有物理内存和交换空间总和的内存

5. 修改redis配置文件

a) $ cd /etc

b) vi redis.conf

c) 修改daemonize yes—目的使进程在后台运行

参数介绍:

daemonize:是否以后台daemon方式运行

pidfile:pid文件位置

port:监听的端口号

timeout:请求超时时间

loglevel:log信息级别

logfile:log文件位置

databases:开启数据库的数量

save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。

rdbcompression:是否使用压缩

dbfilename:数据快照文件名(只是文件名,不包括目录)

dir:数据快照的保存目录(这个是目录)

appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。

appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)

6. 启动redis

a) $ cd /usr/local/bin

b) ./redis-server /etc/redis.conf

7. 检查是否启动成功

a) $ ps -ef | grep redis


少将博客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Redis安装部署
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(9)个小伙伴在吐槽
  1. redis采用结构sdshdr和sds封装了字符串,字符串相关的操作实现在源文件sds.h/sds.c中。<br />数据结构定义如下:<br /><br />typedefchar*sds;<br />structsdshdr{<br />longlen;<br />longfree;<br />charbuf[];<br />};<br /><br />list(双向链表)<br />list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。<br />对list的定义和实现在源文件adlist.h/adlist.c,相关的数据结构定义如下:<br /><br />//list迭代器<br />typedefstructlistIter{<br />listNode*next;<br />intdirection;<br />}listIter;<br />//list数据结构<br />typedefstructlist{<br />listNode*head;<br />listNode*tail;<br />void*(*dup)(void*ptr);<br />void(*free)(void*ptr);<br />int(*match)(void*ptr,void*key);<br />unsignedintlen;<br />listIteriter;<br />}list;<br />dict(hash表)<br />set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。<br />在源文件dict.h/dict.c中实现了hashtable的操作,数据结构的定义如下:<br /> <br />//dict中的元素项<br />typedefstructdictEntry{<br />void*key;<br />void*val;<br />structdictEntry*next;<br />}dictEntry;<br />//dict相关配置函数<br />typedefstructdictType{<br />unsignedint(*hashFunction)(constvoid*key);<br />void*(*keyDup)(void*privdata,constvoid*key);<br />void*(*valDup)(void*privdata,constvoid*obj);<br />int(*keyCompare)(void*privdata,constvoid*key1,constvoid*key2);<br />void(*keyDestructor)(void*privdata,void*key);<br />void(*valDestructor)(void*privdata,void*obj);<br />}dictType;<br />//dict定义<br />typedefstructdict{<br />dictEntry**table;<br />dictType*type;<br />unsignedlongsize;<br />unsignedlongsizemask;<br />unsignedlongused;<br />void*privdata;<br />}dict;<br />//dict迭代器<br />typedefstructdictIterator{<br />dict*ht;<br />intindex;<br />dictEntry*entry,*nextEntry;<br />}dictIterator;<br />dict中table为dictEntry指针的数组,数组中每个成员为hash值相同元素的单向链表。set是在dict的基础上实现的,指定了key的比较函数为dictEncObjKeyCompare,若key相等则不再插入。<br />zset(排序set)<br />zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解了有两列的mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。<br /> <br />typedefstructzskiplistNode{<br />structzskiplistNode**forward;<br />structzskiplistNode*backward;<br />doublescore;<br />robj*obj;<br />}zskiplistNode;<br />typedefstructzskiplist{<br />structzskiplistNode*header,*tail;<br />unsignedlonglength;<br />intlevel;<br />}zskiplist;<br />typedefstructzset{<br />dict*dict;<br />zskiplist*zsl;<br />}zset;<br />zset利用dict维护key -&gt; value的映射关系,用zsl(zskiplist)保存value的有序关系。zsl实际是叉数<br />不稳定的多叉树,每条链上的元素从根节点到叶子节点保持升序排序。
    故事、自己写2015-07-10 16:44 回复 未知操作系统 | 未知浏览器
  2. 就DB来说,Redis成绩已经很惊人了,且不说memcachedb和Tokyo Cabinet之流,就说原版的memcached,速度似乎也只能达到这个级别。Redis根本是使用内存存储,持久化的关键是这三条指令:SAVE BGSAVE LASTSAVE …<br />当接收到SAVE指令的时候,Redis就会dump数据到一个文件里面。<br />值得一说的是它的独家功能:存储列表和集合,这是它与mc之流相比更有竞争力的地方。<br />不介绍mc里面已经有的东东,只列出特殊的:<br />TYPE key ? 用来获取某key的类型<br />KEYS pattern ? 匹配所有符合模式的key,比如KEYS * 就列出所有的key了,当然,复杂度O(n)<br />RANDOMKEY - 返回随机的一个key<br />RENAME oldkeynewkey? key也可以改名<br />列表操作,精华<br />RPUSH key string ? 将某个值加入到一个key列表末尾<br />LPUSH key string ? 将某个值加入到一个key列表头部<br />LLEN key ? 列表长度<br />LRANGE key start end ? 返回列表中某个范围的值,相当于mysql里面的分页查询那样<br />LTRIM key start end ? 只保留列表中某个范围的值<br />LINDEX key index ? 获取列表中特定索引号的值,要注意是O(n)复杂度<br />LSET key index value ? 设置列表中某个位置的值<br />LPOP key<br />RPOP key ? 和上面的LPOP一样,就是类似栈或队列的那种取头取尾指令,可以当成消息队列来使用了<br />集合操作<br />SADD key member ? 增加元素<br />SREM key member ? 删除元素<br />SCARD key ? 返回集合大小<br />SISMEMBER key member ? 判断某个值是否在集合中<br />SINTER key1 key2 ... keyN ? 获取多个集合的交集元素<br />SMEMBERS key ? 列出集合的所有元素<br />还有Multiple DB的命令,可以更换db,数据可以隔离开,默认是存放在DB 0。
    故事、自己写2015-07-10 16:44 回复 未知操作系统 | 未知浏览器
  3. redis使用了两种文件格式:全量数据和增量请求。<br />全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;<br />增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。<br />redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。<br />save seconds updates,save配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。<br />appendonly yes/no ,appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。<br />appendfsync no/always/everysec ,appendfsync配置,no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。
    故事、自己写2015-07-10 16:45 回复 未知操作系统 | 未知浏览器