linux Redis安装

来源:互联网 发布:混合横截面数据 编辑:程序博客网 时间:2024/06/05 09:48

使用wget工具等下载:

wget (百度不让用链接)

tar xzfredis-1.2.6.tar.gz

cdredis-1.2.6

编译生成可执行文件

由于makefile文件已经写好,我们只需要直接在源码目录执行make命令进行编译即可:

make

make-test

sudo make install

make命令执行完成后,会在当前目录下生成本个可执行文件,分别是redis-serverredis-cliredis-benchmarkredis-stat,它们的作用如下:

redis-serverRedis服务器的daemon启动程序

redis-cliRedis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作

redis-benchmarkRedis性能测试工具,测试Redis在你的系统及你的配置下的读写性能

redis-statRedis状态检测工具,可以检测Redis当前状态参数及延迟状况。

建立Redis目录(非必须)

这个过程不是必须的,只是为了将Redis相关的资源统一管理而进行的操作。

执行以下命令建立相关目录并拷贝相关文件至目录中:

sudo -s

mkdir -p/usr/local/redis/bin

mkdir -p/usr/local/redis/etc

mkdir -p/usr/local/redis/var

cp redis-serverredis-cli redis-benchmark redis-stat /usr/local/redis/bin/

cp redis.conf/usr/local/redis/etc/

配置参数

在我们成功安装Redis后,我们直接执行redis-server即可运行Redis,此时它是按照默认配置来运行的(默认配置甚至不是后台运行)。我们希望Redis按我们的要求运行,则我们需要修改配置文件,Redis的配置文件就是我们上面第二个cp操作的redis.conf文件,它被我们拷贝到了/usr/local/redis/etc/目录下。修改它就可以配置我们的server了。如何修改?下面是redis.conf的主要配置参数的意义:

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

pidfilepid文件位置

port:监听的端口号

timeout:请求超时时间

loglevellog信息级别

logfilelog文件位置

databases:开启数据库的数量

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

rdbcompression:是否使用压缩

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

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

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

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

下面是一个略做修改后的配置文件内容:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

daemonizeyes

pidfile/usr/local/redis/var/redis.pid

port6379

timeout300

logleveldebug

logfile/usr/local/redis/var/redis.log

databases16

save9001

save30010

save6010000

rdbcompressionyes

dbfilenamedump.rdb

dir/usr/local/redis/var/

appendonlyno

appendfsyncalways

glueoutputbufyes

shareobjectsno

shareobjectspoolsize1024

将上面内容写为redis.conf并保存到/usr/local/redis/etc/目录下

然后在命令行执行:

/usr/local/redis/bin/redis-server/usr/local/redis/etc/redis.conf

即可在后台启动redis服务,这时你通过

telnet127.0.0.16379

即可连接到你的redis服务

Redis常用内存优化手段与参数

通过我们上面的一些实现上的分析可以看出redis实际上的内存管理成本非常高,即占用了过多的内存,作者对这点也非常清楚,所以提供了一系列的参数和手段来控制和节省内存,我们分别来讨论下。

首先最重要的一点是不要开启RedisVM选项,即虚拟内存功能,这个本来是作为Redis存储超出物理内存数据的一种数据在内存与磁盘换入换出的一个持久化策略,但是其内存管理成本也非常的高,并且我们后续会分析此种持久化策略并不成熟,所以要关闭VM功能,请检查你的redis.conf文件中 vm-enabled no

其次最好设置下redis.conf中的maxmemory选项,该选项是告诉Redis当使用了多少物理内存后就开始拒绝后续的写入请求,该参数能很好的保护好你的Redis不会因为使用了过多的物理内存而导致swap,最终严重影响性能甚至崩溃。

另外Redis为不同数据类型分别提供了一组参数来控制内存使用,我们在前面详细分析过Redis Hashvalue内部为一个HashMap,如果该Map的成员数比较少,则会采用类似一维线性的紧凑格式来存储该Map,即省去了大量指针的内存开销,这个参数控制对应在redis.conf配置文件中下面2项:

  1. hash-max-zipmap-entries 64
  2. hash-max-zipmap-value 512
  3. hash-max-zipmap-entries

含义是当value这个Map内部不超过多少个成员时会采用线性紧凑格式存储,默认是64,value内部有64个以下的成员就是使用线性紧凑存储,超过该值自动转成真正的HashMap

hash-max-zipmap-value含义是当 value这个Map内部的每个成员值长度不超过多少字节就会采用线性紧凑存储来节省空间。

以上2个条件任意一个条件超过设置值都会转换成真正的HashMap,也就不会再节省内存了,那么这个值是不是设置的越大越好呢,答案当然是否定的,HashMap的优势就是查找和操作的时间复杂度都是O(1)的,而放弃Hash采用一维存储则是O(n)的时间复杂度,如果

成员数量很少,则影响不大,否则会严重影响性能,所以要权衡好这个值的设置,总体上还是最根本的时间成本和空间成本上的权衡。

同样类似的参数

list-max-ziplist-entries512

说明:list数据类型多少节点以下会采用去指针的紧凑存储格式。

list-max-ziplist-value64

说明:list数据类型节点值大小小于多少字节会采用紧凑存储格式。

set-max-intset-entries512

说明:set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。

最后想说的是Redis内部实现没有对内存分配方面做过多的优化,在一定程度上会存在内存碎片,不过大多数情况下这个不会成为Redis的性能瓶颈,不过如果在Redis内部存储的大部分数据是数值型的话,Redis内部采用了一个shared integer的方式来省去分配内存的开销,即在系统启动时先分配一个从1~n那么多个数值对象放在一个池子中,如果存储的数据恰好是这个数值范围内的数据,则直接从池子里取出该对象,并且通过引用计数的方式来共享,这样在系统存储了大量数值下,也能一定程度上节省内存并且提高性能,这个参数值n的设置需要修改源代码中的一行宏定义REDIS_SHARED_INTEGERS,该值默认是10000,可以根据自己的需要进行修改,修改后重新编译就可以了。

另外redis6种过期策略redis中的默认的过期策略是volatile-lru。设置方式

config setmaxmemory-policy volatile-lru

maxmemory-policy六种方式

volatile-lru:只对设置了过期时间的key进行LRU(默认值)

allkeys-lru: 是从所有key里删除 不经常使用的key

volatile-random:随机删除即将过期key

allkeys-random:随机删除

volatile-ttl: 删除即将过期的

noeviction: 永不过期,返回错误

maxmemory-samples3 是说每次进行淘汰的时候 会随机抽取3key从里面淘汰最不经常使用的(默认选项)

原创粉丝点击